From cbdfee9a666cf934c48bbc1849990477371b1581 Mon Sep 17 00:00:00 2001 From: song_yu Date: Thu, 30 Nov 2023 17:10:19 +0800 Subject: [PATCH 1/4] init smack code Signed-off-by: song_yu --- smack/.gitignore | 10 + smack/AppScope/app.json5 | 11 + .../resources/base/element/string.json | 8 + .../resources/base/media/app_icon.png | Bin 0 -> 6790 bytes smack/CHANGELOG.md | 58 + smack/LICENSE | 693 + smack/README.OpenSource | 10 + smack/README.md | 171 + smack/build-profile.json5 | 30 + smack/entry/.gitignore | 3 + smack/entry/build-profile.json5 | 13 + smack/entry/hvigorfile.js | 2 + smack/entry/package.json | 16 + .../src/main/ets/Application/AbilityStage.ts | 17 + .../src/main/ets/MainAbility/MainAbility.ts | 43 + .../src/main/ets/entity/ChatContentEntity.ts | 31 + smack/entry/src/main/ets/entity/Constant.ts | 22 + .../src/main/ets/pages/base/ItemInput.ets | 39 + .../src/main/ets/pages/base/ItemText.ets | 36 + .../src/main/ets/pages/base/SelectDialog.ets | 32 + .../src/main/ets/pages/base/Switches.ets | 43 + .../entry/src/main/ets/pages/base/toolbar.ets | 64 + .../chat/group_chat/group_all_member.ets | 158 + .../pages/chat/group_chat/group_chat_edit.ets | 315 + .../pages/chat/group_chat/group_chat_main.ets | 165 + .../chat/group_chat/group_chat_setting.ets | 231 + .../pages/chat/group_chat/group_member.ets | 232 + .../chat/meeting_chat/meeting_chat_main.ets | 101 + .../meeting_chat/meeting_chat_setting.ets | 56 + .../ets/pages/chat/one_chat/one_chat_main.ets | 231 + .../pages/chat/one_chat/one_chat_setting.ets | 157 + smack/entry/src/main/ets/pages/index.ets | 50 + smack/entry/src/main/ets/pages/main.ets | 137 + smack/entry/src/main/ets/pages/page.ets | 451 + .../ets/pages/tabs/friends/add_friends.ets | 69 + .../main/ets/pages/tabs/friends/add_group.ets | 62 + .../pages/tabs/friends/change_group_name.ets | 69 + .../ets/pages/tabs/friends/friends_list.ets | 183 + .../ets/pages/tabs/group/Join_in_group.ets | 42 + .../pages/tabs/group/create_group_chat.ets | 106 + .../main/ets/pages/tabs/group/group_list.ets | 120 + .../pages/tabs/meeting/Join_in_meeting.ets | 45 + .../ets/pages/tabs/meeting/create_meeting.ets | 44 + .../ets/pages/tabs/meeting/meeting_list.ets | 140 + .../entry/src/main/ets/pages/tabs/setting.ets | 203 + smack/entry/src/main/ets/pages/user/login.ets | 169 + .../src/main/ets/pages/user/register.ets | 86 + .../main/ets/pages/user/search_friends.ets | 71 + smack/entry/src/main/module.json5 | 38 + .../main/resources/base/element/color.json | 8 + .../main/resources/base/element/string.json | 24 + .../src/main/resources/base/media/add.png | Bin 0 -> 1180 bytes .../src/main/resources/base/media/back.png | Bin 0 -> 721 bytes .../src/main/resources/base/media/change.png | Bin 0 -> 1451 bytes .../src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../src/main/resources/base/media/more.png | Bin 0 -> 833 bytes .../src/main/resources/base/media/refresh.png | Bin 0 -> 2033 bytes .../resources/base/profile/main_pages.json | 34 + smack/hvigorfile.js | 2 + smack/image/1.png | Bin 0 -> 145437 bytes smack/image/10.png | Bin 0 -> 39263 bytes smack/image/11.png | Bin 0 -> 43798 bytes smack/image/12.png | Bin 0 -> 45026 bytes smack/image/13.png | Bin 0 -> 19259 bytes smack/image/14.png | Bin 0 -> 17858 bytes smack/image/15.png | Bin 0 -> 101444 bytes smack/image/16.png | Bin 0 -> 63147 bytes smack/image/17.png | Bin 0 -> 41084 bytes smack/image/18.png | Bin 0 -> 5241 bytes smack/image/2.png | Bin 0 -> 6841 bytes smack/image/3.png | Bin 0 -> 33175 bytes smack/image/7.png | Bin 0 -> 31848 bytes smack/image/8.png | Bin 0 -> 61142 bytes smack/image/9.png | Bin 0 -> 66672 bytes smack/image/sample.gif | Bin 0 -> 2347881 bytes smack/oh-package-lock.json5 | 13 + smack/package.json | 18 + smack/smack/.gitignore | 3 + smack/smack/build-profile.json5 | 22 + smack/smack/hvigorfile.js | 3 + smack/smack/index.ts | 24 + smack/smack/package.json | 26 + smack/smack/src/main/cpp/CMakeLists.txt | 21 + .../src/main/cpp/MyMUCInvitationHandler.cpp | 47 + .../src/main/cpp/MyMUCInvitationHandler.h | 38 + smack/smack/src/main/cpp/Smack.cpp | 594 + smack/smack/src/main/cpp/Smack.h | 129 + smack/smack/src/main/cpp/gloox/AUTHORS | 1 + smack/smack/src/main/cpp/gloox/COPYING | 2 + smack/smack/src/main/cpp/gloox/ChangeLog | 863 + smack/smack/src/main/cpp/gloox/Doxyfile | 234 + smack/smack/src/main/cpp/gloox/INSTALL | 28 + smack/smack/src/main/cpp/gloox/LICENSE | 693 + smack/smack/src/main/cpp/gloox/Makefile.am | 28 + smack/smack/src/main/cpp/gloox/Makefile.in | 895 + smack/smack/src/main/cpp/gloox/NEWS | 0 smack/smack/src/main/cpp/gloox/README | 19 + smack/smack/src/main/cpp/gloox/README.symbian | 25 + smack/smack/src/main/cpp/gloox/README.win32 | 60 + smack/smack/src/main/cpp/gloox/README.wince | 22 + smack/smack/src/main/cpp/gloox/TODO | 56 + smack/smack/src/main/cpp/gloox/UPGRADING | 324 + smack/smack/src/main/cpp/gloox/acinclude.m4 | 194 + smack/smack/src/main/cpp/gloox/aclocal.m4 | 9732 ++++++++ smack/smack/src/main/cpp/gloox/bld.inf | 15 + smack/smack/src/main/cpp/gloox/config.guess | 1530 ++ .../smack/src/main/cpp/gloox/config.h.android | 130 + smack/smack/src/main/cpp/gloox/config.h.ohos | 130 + .../smack/src/main/cpp/gloox/config.h.symbian | 15 + .../smack/src/main/cpp/gloox/config.h.unix.in | 129 + smack/smack/src/main/cpp/gloox/config.h.win | 50 + smack/smack/src/main/cpp/gloox/config.sub | 1782 ++ smack/smack/src/main/cpp/gloox/configure | 19654 ++++++++++++++++ smack/smack/src/main/cpp/gloox/configure.ac | 469 + smack/smack/src/main/cpp/gloox/depcomp | 708 + .../smack/src/main/cpp/gloox/gloox-config.in | 89 + smack/smack/src/main/cpp/gloox/gloox.cbp | 302 + smack/smack/src/main/cpp/gloox/gloox.dsp | 1073 + smack/smack/src/main/cpp/gloox/gloox.mmp | 129 + smack/smack/src/main/cpp/gloox/gloox.pc.in | 10 + smack/smack/src/main/cpp/gloox/gloox.vcproj | 1242 + smack/smack/src/main/cpp/gloox/install-sh | 527 + smack/smack/src/main/cpp/gloox/ltmain.sh | 9661 ++++++++ smack/smack/src/main/cpp/gloox/missing | 331 + .../smack/src/main/cpp/gloox/src/Makefile.am | 130 + .../smack/src/main/cpp/gloox/src/Makefile.in | 1006 + smack/smack/src/main/cpp/gloox/src/adhoc.cpp | 512 + smack/smack/src/main/cpp/gloox/src/adhoc.h | 500 + .../main/cpp/gloox/src/adhoccommandprovider.h | 79 + .../src/main/cpp/gloox/src/adhochandler.h | 79 + .../src/main/cpp/gloox/src/adhocplugin.h | 61 + smack/smack/src/main/cpp/gloox/src/amp.cpp | 189 + smack/smack/src/main/cpp/gloox/src/amp.h | 243 + .../src/main/cpp/gloox/src/annotations.cpp | 90 + .../src/main/cpp/gloox/src/annotations.h | 147 + .../main/cpp/gloox/src/annotationshandler.h | 66 + .../src/main/cpp/gloox/src/atomicrefcount.cpp | 93 + .../src/main/cpp/gloox/src/atomicrefcount.h | 75 + .../src/main/cpp/gloox/src/attention.cpp | 43 + .../smack/src/main/cpp/gloox/src/attention.h | 70 + smack/smack/src/main/cpp/gloox/src/base64.cpp | 126 + smack/smack/src/main/cpp/gloox/src/base64.h | 51 + .../src/main/cpp/gloox/src/bookmarkhandler.h | 82 + .../main/cpp/gloox/src/bookmarkstorage.cpp | 118 + .../src/main/cpp/gloox/src/bookmarkstorage.h | 150 + .../smack/src/main/cpp/gloox/src/bytestream.h | 180 + .../cpp/gloox/src/bytestreamdatahandler.h | 81 + .../main/cpp/gloox/src/bytestreamhandler.h | 90 + .../src/main/cpp/gloox/src/capabilities.cpp | 183 + .../src/main/cpp/gloox/src/capabilities.h | 132 + .../smack/src/main/cpp/gloox/src/carbons.cpp | 103 + smack/smack/src/main/cpp/gloox/src/carbons.h | 185 + .../src/main/cpp/gloox/src/chatstate.cpp | 61 + .../smack/src/main/cpp/gloox/src/chatstate.h | 87 + .../main/cpp/gloox/src/chatstatefilter.cpp | 65 + .../src/main/cpp/gloox/src/chatstatefilter.h | 105 + .../src/main/cpp/gloox/src/chatstatehandler.h | 51 + smack/smack/src/main/cpp/gloox/src/client.cpp | 760 + smack/smack/src/main/cpp/gloox/src/client.h | 502 + .../src/main/cpp/gloox/src/clientbase.cpp | 1826 ++ .../smack/src/main/cpp/gloox/src/clientbase.h | 1112 + .../src/main/cpp/gloox/src/component.cpp | 62 + .../smack/src/main/cpp/gloox/src/component.h | 77 + .../src/main/cpp/gloox/src/compressionbase.h | 85 + .../cpp/gloox/src/compressiondatahandler.h | 58 + .../main/cpp/gloox/src/compressiondefault.cpp | 92 + .../main/cpp/gloox/src/compressiondefault.h | 80 + .../main/cpp/gloox/src/compressionzlib.cpp | 137 + .../src/main/cpp/gloox/src/compressionzlib.h | 74 + smack/smack/src/main/cpp/gloox/src/config.h | 31 + .../src/main/cpp/gloox/src/connectionbase.h | 167 + .../src/main/cpp/gloox/src/connectionbosh.cpp | 643 + .../src/main/cpp/gloox/src/connectionbosh.h | 225 + .../cpp/gloox/src/connectiondatahandler.h | 66 + .../main/cpp/gloox/src/connectionhandler.h | 52 + .../cpp/gloox/src/connectionhttpproxy.cpp | 215 + .../main/cpp/gloox/src/connectionhttpproxy.h | 171 + .../main/cpp/gloox/src/connectionlistener.h | 106 + .../cpp/gloox/src/connectionsocks5proxy.cpp | 377 + .../cpp/gloox/src/connectionsocks5proxy.h | 178 + .../main/cpp/gloox/src/connectiontcpbase.cpp | 214 + .../main/cpp/gloox/src/connectiontcpbase.h | 134 + .../cpp/gloox/src/connectiontcpclient.cpp | 174 + .../main/cpp/gloox/src/connectiontcpclient.h | 83 + .../cpp/gloox/src/connectiontcpserver.cpp | 180 + .../main/cpp/gloox/src/connectiontcpserver.h | 77 + .../src/main/cpp/gloox/src/connectiontls.cpp | 200 + .../src/main/cpp/gloox/src/connectiontls.h | 199 + .../cpp/gloox/src/connectiontlsserver.cpp | 46 + .../main/cpp/gloox/src/connectiontlsserver.h | 81 + .../smack/src/main/cpp/gloox/src/dataform.cpp | 137 + smack/smack/src/main/cpp/gloox/src/dataform.h | 197 + .../src/main/cpp/gloox/src/dataformfield.cpp | 134 + .../src/main/cpp/gloox/src/dataformfield.h | 242 + .../cpp/gloox/src/dataformfieldcontainer.cpp | 47 + .../cpp/gloox/src/dataformfieldcontainer.h | 125 + .../src/main/cpp/gloox/src/dataformitem.cpp | 54 + .../src/main/cpp/gloox/src/dataformitem.h | 62 + .../main/cpp/gloox/src/dataformreported.cpp | 54 + .../src/main/cpp/gloox/src/dataformreported.h | 64 + .../main/cpp/gloox/src/delayeddelivery.cpp | 75 + .../src/main/cpp/gloox/src/delayeddelivery.h | 130 + smack/smack/src/main/cpp/gloox/src/disco.cpp | 535 + smack/smack/src/main/cpp/gloox/src/disco.h | 636 + .../src/main/cpp/gloox/src/discohandler.h | 83 + .../src/main/cpp/gloox/src/disconodehandler.h | 81 + smack/smack/src/main/cpp/gloox/src/dns.cpp | 494 + smack/smack/src/main/cpp/gloox/src/dns.h | 179 + smack/smack/src/main/cpp/gloox/src/error.cpp | 138 + smack/smack/src/main/cpp/gloox/src/error.h | 139 + smack/smack/src/main/cpp/gloox/src/event.h | 81 + .../main/cpp/gloox/src/eventdispatcher.cpp | 73 + .../src/main/cpp/gloox/src/eventdispatcher.h | 88 + .../src/main/cpp/gloox/src/eventhandler.h | 47 + .../main/cpp/gloox/src/examples/Makefile.am | 100 + .../main/cpp/gloox/src/examples/Makefile.in | 764 + .../cpp/gloox/src/examples/adhoc_example.cpp | 101 + .../src/examples/annotations_example.cpp | 104 + .../src/examples/bookmarkstorage_example.cpp | 123 + .../cpp/gloox/src/examples/bosh_example.cpp | 203 + .../gloox/src/examples/component_example.cpp | 94 + .../cpp/gloox/src/examples/disco_example.cpp | 99 + .../cpp/gloox/src/examples/e2ee_client.cpp | 179 + .../cpp/gloox/src/examples/e2ee_server.cpp | 175 + .../gloox/src/examples/flexoff_example.cpp | 152 + .../main/cpp/gloox/src/examples/ft_recv.cpp | 189 + .../main/cpp/gloox/src/examples/ft_send.cpp | 259 + .../gloox/src/examples/linklocal_example.cpp | 217 + .../gloox/src/examples/message_example.cpp | 198 + .../cpp/gloox/src/examples/muc_example.cpp | 174 + .../src/examples/privacylist_example.cpp | 125 + .../gloox/src/examples/privatexml_example.cpp | 92 + .../cpp/gloox/src/examples/pubsub_example.cpp | 211 + .../gloox/src/examples/reconnect_example.cpp | 205 + .../gloox/src/examples/register_example.cpp | 135 + .../cpp/gloox/src/examples/reset_example.cpp | 84 + .../cpp/gloox/src/examples/roster_example.cpp | 192 + .../cpp/gloox/src/examples/vcard_example.cpp | 135 + .../src/main/cpp/gloox/src/featureneg.cpp | 60 + .../smack/src/main/cpp/gloox/src/featureneg.h | 86 + .../smack/src/main/cpp/gloox/src/flexoff.cpp | 207 + smack/smack/src/main/cpp/gloox/src/flexoff.h | 178 + .../src/main/cpp/gloox/src/flexoffhandler.h | 82 + .../smack/src/main/cpp/gloox/src/forward.cpp | 85 + smack/smack/src/main/cpp/gloox/src/forward.h | 104 + smack/smack/src/main/cpp/gloox/src/gloox.cpp | 129 + smack/smack/src/main/cpp/gloox/src/gloox.h | 1273 + .../src/main/cpp/gloox/src/glooxversion.h | 13 + .../src/main/cpp/gloox/src/gpgencrypted.cpp | 60 + .../src/main/cpp/gloox/src/gpgencrypted.h | 91 + .../src/main/cpp/gloox/src/gpgsigned.cpp | 62 + .../smack/src/main/cpp/gloox/src/gpgsigned.h | 91 + .../main/cpp/gloox/src/inbandbytestream.cpp | 299 + .../src/main/cpp/gloox/src/inbandbytestream.h | 214 + .../src/main/cpp/gloox/src/instantmucroom.cpp | 31 + .../src/main/cpp/gloox/src/instantmucroom.h | 60 + smack/smack/src/main/cpp/gloox/src/iodata.cpp | 226 + smack/smack/src/main/cpp/gloox/src/iodata.h | 186 + smack/smack/src/main/cpp/gloox/src/iq.cpp | 69 + smack/smack/src/main/cpp/gloox/src/iq.h | 96 + .../smack/src/main/cpp/gloox/src/iqhandler.h | 66 + smack/smack/src/main/cpp/gloox/src/jid.cpp | 123 + smack/smack/src/main/cpp/gloox/src/jid.h | 219 + .../src/main/cpp/gloox/src/jinglecontent.cpp | 104 + .../src/main/cpp/gloox/src/jinglecontent.h | 138 + .../main/cpp/gloox/src/jinglefiletransfer.cpp | 173 + .../main/cpp/gloox/src/jinglefiletransfer.h | 134 + .../src/main/cpp/gloox/src/jingleiceudp.cpp | 113 + .../src/main/cpp/gloox/src/jingleiceudp.h | 141 + .../src/main/cpp/gloox/src/jingleplugin.h | 176 + .../cpp/gloox/src/jinglepluginfactory.cpp | 91 + .../main/cpp/gloox/src/jinglepluginfactory.h | 82 + .../src/main/cpp/gloox/src/jinglesession.cpp | 501 + .../src/main/cpp/gloox/src/jinglesession.h | 575 + .../main/cpp/gloox/src/jinglesessionhandler.h | 74 + .../cpp/gloox/src/jinglesessionmanager.cpp | 104 + .../main/cpp/gloox/src/jinglesessionmanager.h | 117 + .../src/main/cpp/gloox/src/lastactivity.cpp | 132 + .../src/main/cpp/gloox/src/lastactivity.h | 166 + .../main/cpp/gloox/src/lastactivityhandler.h | 58 + .../smack/src/main/cpp/gloox/src/linklocal.h | 79 + .../main/cpp/gloox/src/linklocalclient.cpp | 219 + .../src/main/cpp/gloox/src/linklocalclient.h | 125 + .../src/main/cpp/gloox/src/linklocalhandler.h | 66 + .../main/cpp/gloox/src/linklocalmanager.cpp | 255 + .../src/main/cpp/gloox/src/linklocalmanager.h | 356 + .../smack/src/main/cpp/gloox/src/loghandler.h | 53 + .../smack/src/main/cpp/gloox/src/logsink.cpp | 49 + smack/smack/src/main/cpp/gloox/src/logsink.h | 118 + smack/smack/src/main/cpp/gloox/src/macros.h | 49 + smack/smack/src/main/cpp/gloox/src/md5.cpp | 466 + smack/smack/src/main/cpp/gloox/src/md5.h | 137 + .../smack/src/main/cpp/gloox/src/message.cpp | 96 + smack/smack/src/main/cpp/gloox/src/message.h | 159 + .../src/main/cpp/gloox/src/messageevent.cpp | 68 + .../src/main/cpp/gloox/src/messageevent.h | 88 + .../main/cpp/gloox/src/messageeventfilter.cpp | 112 + .../main/cpp/gloox/src/messageeventfilter.h | 95 + .../main/cpp/gloox/src/messageeventhandler.h | 51 + .../src/main/cpp/gloox/src/messagefilter.cpp | 42 + .../src/main/cpp/gloox/src/messagefilter.h | 84 + .../src/main/cpp/gloox/src/messagehandler.h | 58 + .../src/main/cpp/gloox/src/messagesession.cpp | 115 + .../src/main/cpp/gloox/src/messagesession.h | 318 + .../cpp/gloox/src/messagesessionhandler.h | 67 + .../cpp/gloox/src/mucinvitationhandler.cpp | 27 + .../main/cpp/gloox/src/mucinvitationhandler.h | 67 + .../main/cpp/gloox/src/mucmessagesession.cpp | 54 + .../main/cpp/gloox/src/mucmessagesession.h | 66 + .../smack/src/main/cpp/gloox/src/mucroom.cpp | 1457 ++ smack/smack/src/main/cpp/gloox/src/mucroom.h | 972 + .../main/cpp/gloox/src/mucroomconfighandler.h | 226 + .../src/main/cpp/gloox/src/mucroomhandler.h | 216 + smack/smack/src/main/cpp/gloox/src/mutex.cpp | 138 + smack/smack/src/main/cpp/gloox/src/mutex.h | 77 + .../smack/src/main/cpp/gloox/src/mutexguard.h | 61 + .../smack/src/main/cpp/gloox/src/nickname.cpp | 44 + smack/smack/src/main/cpp/gloox/src/nickname.h | 87 + .../src/main/cpp/gloox/src/nonsaslauth.cpp | 174 + .../src/main/cpp/gloox/src/nonsaslauth.h | 147 + smack/smack/src/main/cpp/gloox/src/oob.cpp | 81 + smack/smack/src/main/cpp/gloox/src/oob.h | 101 + smack/smack/src/main/cpp/gloox/src/parser.cpp | 809 + smack/smack/src/main/cpp/gloox/src/parser.h | 138 + smack/smack/src/main/cpp/gloox/src/prep.cpp | 134 + smack/smack/src/main/cpp/gloox/src/prep.h | 95 + .../smack/src/main/cpp/gloox/src/presence.cpp | 143 + smack/smack/src/main/cpp/gloox/src/presence.h | 161 + .../src/main/cpp/gloox/src/presencehandler.h | 50 + .../src/main/cpp/gloox/src/privacyitem.cpp | 42 + .../src/main/cpp/gloox/src/privacyitem.h | 126 + .../main/cpp/gloox/src/privacylisthandler.h | 99 + .../src/main/cpp/gloox/src/privacymanager.cpp | 316 + .../src/main/cpp/gloox/src/privacymanager.h | 231 + .../src/main/cpp/gloox/src/privatexml.cpp | 129 + .../smack/src/main/cpp/gloox/src/privatexml.h | 160 + .../main/cpp/gloox/src/privatexmlhandler.h | 73 + smack/smack/src/main/cpp/gloox/src/pubsub.h | 249 + .../src/main/cpp/gloox/src/pubsubevent.cpp | 278 + .../src/main/cpp/gloox/src/pubsubevent.h | 173 + .../src/main/cpp/gloox/src/pubsubitem.cpp | 63 + .../smack/src/main/cpp/gloox/src/pubsubitem.h | 90 + .../src/main/cpp/gloox/src/pubsubmanager.cpp | 1243 + .../src/main/cpp/gloox/src/pubsubmanager.h | 856 + .../main/cpp/gloox/src/pubsubresulthandler.h | 395 + .../smack/src/main/cpp/gloox/src/receipt.cpp | 60 + smack/smack/src/main/cpp/gloox/src/receipt.h | 103 + .../src/main/cpp/gloox/src/registration.cpp | 406 + .../src/main/cpp/gloox/src/registration.h | 339 + .../main/cpp/gloox/src/registrationhandler.h | 128 + smack/smack/src/main/cpp/gloox/src/resource.h | 106 + .../src/main/cpp/gloox/src/rosteritem.cpp | 187 + .../smack/src/main/cpp/gloox/src/rosteritem.h | 210 + .../src/main/cpp/gloox/src/rosteritemdata.h | 232 + .../src/main/cpp/gloox/src/rosterlistener.h | 173 + .../src/main/cpp/gloox/src/rostermanager.cpp | 421 + .../src/main/cpp/gloox/src/rostermanager.h | 283 + smack/smack/src/main/cpp/gloox/src/search.cpp | 223 + smack/smack/src/main/cpp/gloox/src/search.h | 215 + .../src/main/cpp/gloox/src/searchhandler.h | 195 + smack/smack/src/main/cpp/gloox/src/sha.cpp | 251 + smack/smack/src/main/cpp/gloox/src/sha.h | 98 + smack/smack/src/main/cpp/gloox/src/shim.cpp | 71 + smack/smack/src/main/cpp/gloox/src/shim.h | 91 + .../smack/src/main/cpp/gloox/src/sihandler.h | 70 + .../src/main/cpp/gloox/src/simanager.cpp | 259 + .../smack/src/main/cpp/gloox/src/simanager.h | 245 + .../src/main/cpp/gloox/src/siprofileft.cpp | 312 + .../src/main/cpp/gloox/src/siprofileft.h | 341 + .../main/cpp/gloox/src/siprofilefthandler.h | 104 + .../src/main/cpp/gloox/src/siprofilehandler.h | 62 + .../main/cpp/gloox/src/socks5bytestream.cpp | 160 + .../src/main/cpp/gloox/src/socks5bytestream.h | 136 + .../cpp/gloox/src/socks5bytestreammanager.cpp | 486 + .../cpp/gloox/src/socks5bytestreammanager.h | 307 + .../cpp/gloox/src/socks5bytestreamserver.cpp | 246 + .../cpp/gloox/src/socks5bytestreamserver.h | 149 + .../main/cpp/gloox/src/softwareversion.cpp | 74 + .../src/main/cpp/gloox/src/softwareversion.h | 101 + smack/smack/src/main/cpp/gloox/src/stanza.cpp | 141 + smack/smack/src/main/cpp/gloox/src/stanza.h | 215 + .../src/main/cpp/gloox/src/stanzaextension.h | 262 + .../cpp/gloox/src/stanzaextensionfactory.cpp | 96 + .../cpp/gloox/src/stanzaextensionfactory.h | 93 + .../main/cpp/gloox/src/statisticshandler.h | 80 + .../src/main/cpp/gloox/src/subscription.cpp | 77 + .../src/main/cpp/gloox/src/subscription.h | 106 + .../main/cpp/gloox/src/subscriptionhandler.h | 49 + smack/smack/src/main/cpp/gloox/src/tag.cpp | 1377 ++ smack/smack/src/main/cpp/gloox/src/tag.h | 710 + .../smack/src/main/cpp/gloox/src/taghandler.h | 51 + .../src/main/cpp/gloox/src/tests/Makefile.am | 52 + .../src/main/cpp/gloox/src/tests/Makefile.in | 644 + .../cpp/gloox/src/tests/adhoc/Makefile.am | 15 + .../cpp/gloox/src/tests/adhoc/Makefile.in | 526 + .../cpp/gloox/src/tests/adhoc/adhoc_test.cpp | 236 + .../gloox/src/tests/adhoccommand/Makefile.am | 22 + .../gloox/src/tests/adhoccommand/Makefile.in | 544 + .../tests/adhoccommand/adhoccommand_test.cpp | 112 + .../src/tests/adhoccommandnote/Makefile.am | 22 + .../src/tests/adhoccommandnote/Makefile.in | 544 + .../adhoccommandnote_test.cpp | 142 + .../main/cpp/gloox/src/tests/amp/Makefile.am | 13 + .../main/cpp/gloox/src/tests/amp/Makefile.in | 522 + .../main/cpp/gloox/src/tests/amp/amp_test.cpp | 180 + .../cpp/gloox/src/tests/amprule/Makefile.am | 13 + .../cpp/gloox/src/tests/amprule/Makefile.in | 522 + .../gloox/src/tests/amprule/amprule_test.cpp | 156 + .../cpp/gloox/src/tests/base64/Makefile.am | 13 + .../cpp/gloox/src/tests/base64/Makefile.in | 520 + .../gloox/src/tests/base64/base64_test.cpp | 69 + .../gloox/src/tests/capabilities/Makefile.am | 15 + .../gloox/src/tests/capabilities/Makefile.in | 526 + .../tests/capabilities/capabilities_test.cpp | 101 + .../cpp/gloox/src/tests/carbons/Makefile.am | 30 + .../cpp/gloox/src/tests/carbons/Makefile.in | 555 + .../gloox/src/tests/carbons/carbons_test.cpp | 171 + .../src/tests/chatstatefilter/Makefile.am | 14 + .../src/tests/chatstatefilter/Makefile.in | 538 + .../chatstatefilter/chatstatefilter_test.cpp | 310 + .../cpp/gloox/src/tests/client/Makefile.am | 24 + .../cpp/gloox/src/tests/client/Makefile.in | 547 + .../gloox/src/tests/client/client_test.cpp | 495 + .../gloox/src/tests/clientbase/Makefile.am | 22 + .../gloox/src/tests/clientbase/Makefile.in | 543 + .../src/tests/clientbase/clientbase_test.cpp | 216 + .../src/tests/connectionbosh/Makefile.am | 12 + .../src/tests/connectionbosh/Makefile.in | 520 + .../connectionbosh/connectionbosh_test.cpp | 220 + .../cpp/gloox/src/tests/dataform/Makefile.am | 11 + .../cpp/gloox/src/tests/dataform/Makefile.in | 519 + .../src/tests/dataform/dataform_test.cpp | 71 + .../gloox/src/tests/dataformfield/Makefile.am | 11 + .../gloox/src/tests/dataformfield/Makefile.in | 517 + .../dataformfield/dataformfield_test.cpp | 323 + .../gloox/src/tests/dataformitem/Makefile.am | 13 + .../gloox/src/tests/dataformitem/Makefile.in | 521 + .../tests/dataformitem/dataformitem_test.cpp | 117 + .../src/tests/dataformreported/Makefile.am | 13 + .../src/tests/dataformreported/Makefile.in | 522 + .../dataformreported_test.cpp | 117 + .../src/tests/delayeddelivery/Makefile.am | 12 + .../src/tests/delayeddelivery/Makefile.in | 520 + .../delayeddelivery/delayeddelivery_test.cpp | 120 + .../cpp/gloox/src/tests/disco/Makefile.am | 17 + .../cpp/gloox/src/tests/disco/Makefile.in | 527 + .../cpp/gloox/src/tests/disco/disco_test.cpp | 414 + .../cpp/gloox/src/tests/discoinfo/Makefile.am | 23 + .../cpp/gloox/src/tests/discoinfo/Makefile.in | 545 + .../src/tests/discoinfo/discoinfo_test.cpp | 166 + .../gloox/src/tests/discoitems/Makefile.am | 23 + .../gloox/src/tests/discoitems/Makefile.in | 545 + .../src/tests/discoitems/discoitems_test.cpp | 116 + .../cpp/gloox/src/tests/error/Makefile.am | 12 + .../cpp/gloox/src/tests/error/Makefile.in | 517 + .../cpp/gloox/src/tests/error/error_test.cpp | 66 + .../gloox/src/tests/featureneg/Makefile.am | 14 + .../gloox/src/tests/featureneg/Makefile.in | 525 + .../src/tests/featureneg/featureneg_test.cpp | 117 + .../gloox/src/tests/flexoffline/Makefile.am | 17 + .../gloox/src/tests/flexoffline/Makefile.in | 528 + .../tests/flexoffline/flexoffline_test.cpp | 147 + .../src/tests/flexofflineoffline/Makefile.am | 16 + .../src/tests/flexofflineoffline/Makefile.in | 529 + .../flexofflineoffline_test.cpp | 116 + .../cpp/gloox/src/tests/forward/Makefile.am | 30 + .../cpp/gloox/src/tests/forward/Makefile.in | 555 + .../gloox/src/tests/forward/forward_test.cpp | 101 + .../gloox/src/tests/gpgencrypted/Makefile.am | 11 + .../gloox/src/tests/gpgencrypted/Makefile.in | 517 + .../tests/gpgencrypted/gpgencrypted_test.cpp | 113 + .../cpp/gloox/src/tests/gpgsigned/Makefile.am | 11 + .../cpp/gloox/src/tests/gpgsigned/Makefile.in | 517 + .../src/tests/gpgsigned/gpgsigned_test.cpp | 114 + .../src/tests/inbandbytestream/Makefile.am | 13 + .../src/tests/inbandbytestream/Makefile.in | 522 + .../inbandbytestream_test.cpp | 228 + .../src/tests/inbandbytestreamibb/Makefile.am | 13 + .../src/tests/inbandbytestreamibb/Makefile.in | 524 + .../inbandbytestreamibb_test.cpp | 257 + .../cpp/gloox/src/tests/iodata/Makefile.am | 12 + .../cpp/gloox/src/tests/iodata/Makefile.in | 519 + .../gloox/src/tests/iodata/iodata_test.cpp | 350 + .../main/cpp/gloox/src/tests/iq/Makefile.am | 12 + .../main/cpp/gloox/src/tests/iq/Makefile.in | 520 + .../main/cpp/gloox/src/tests/iq/iq_test.cpp | 224 + .../main/cpp/gloox/src/tests/jid/Makefile.am | 15 + .../main/cpp/gloox/src/tests/jid/Makefile.in | 528 + .../main/cpp/gloox/src/tests/jid/jid_perf.cpp | 129 + .../main/cpp/gloox/src/tests/jid/jid_test.cpp | 190 + .../gloox/src/tests/jingleiceudp/Makefile.am | 15 + .../gloox/src/tests/jingleiceudp/Makefile.in | 523 + .../tests/jingleiceudp/jingleiceudp_test.cpp | 78 + .../gloox/src/tests/jinglesession/Makefile.am | 15 + .../gloox/src/tests/jinglesession/Makefile.in | 524 + .../jinglesession/jinglesession_test.cpp | 365 + .../src/tests/jinglesessionjingle/Makefile.am | 16 + .../src/tests/jinglesessionjingle/Makefile.in | 527 + .../jinglesessionjingle_test.cpp | 326 + .../tests/jinglesessionmanager/Makefile.am | 16 + .../tests/jinglesessionmanager/Makefile.in | 529 + .../jinglesessionmanager_test.cpp | 239 + .../gloox/src/tests/lastactivity/Makefile.am | 17 + .../gloox/src/tests/lastactivity/Makefile.in | 528 + .../tests/lastactivity/lastactivity_test.cpp | 143 + .../src/tests/lastactivityquery/Makefile.am | 16 + .../src/tests/lastactivityquery/Makefile.in | 527 + .../lastactivityquery_test.cpp | 144 + .../main/cpp/gloox/src/tests/md5/Makefile.am | 11 + .../main/cpp/gloox/src/tests/md5/Makefile.in | 516 + .../main/cpp/gloox/src/tests/md5/md5_test.cpp | 108 + .../cpp/gloox/src/tests/message/Makefile.am | 12 + .../cpp/gloox/src/tests/message/Makefile.in | 520 + .../gloox/src/tests/message/message_test.cpp | 251 + .../src/tests/messageeventfilter/Makefile.am | 14 + .../src/tests/messageeventfilter/Makefile.in | 538 + .../messageeventfilter_test.cpp | 252 + .../gloox/src/tests/mucroommuc/Makefile.am | 23 + .../gloox/src/tests/mucroommuc/Makefile.in | 545 + .../src/tests/mucroommuc/mucroommuc_test.cpp | 149 + .../src/tests/mucroommucadmin/Makefile.am | 23 + .../src/tests/mucroommucadmin/Makefile.in | 545 + .../mucroommucadmin/mucroommucadmin_test.cpp | 318 + .../src/tests/mucroommucowner/Makefile.am | 23 + .../src/tests/mucroommucowner/Makefile.in | 545 + .../mucroommucowner/mucroommucowner_test.cpp | 182 + .../src/tests/mucroommucuser/Makefile.am | 23 + .../src/tests/mucroommucuser/Makefile.in | 545 + .../mucroommucuser/mucroommucuser_test.cpp | 278 + .../cpp/gloox/src/tests/nickname/Makefile.am | 11 + .../cpp/gloox/src/tests/nickname/Makefile.in | 517 + .../src/tests/nickname/nickname_test.cpp | 79 + .../gloox/src/tests/nonsaslauth/Makefile.am | 14 + .../gloox/src/tests/nonsaslauth/Makefile.in | 522 + .../tests/nonsaslauth/nonsaslauth_test.cpp | 223 + .../src/tests/nonsaslauthquery/Makefile.am | 14 + .../src/tests/nonsaslauthquery/Makefile.in | 522 + .../nonsaslauthquery_test.cpp | 196 + .../main/cpp/gloox/src/tests/oob/Makefile.am | 12 + .../main/cpp/gloox/src/tests/oob/Makefile.in | 520 + .../main/cpp/gloox/src/tests/oob/oob_test.cpp | 209 + .../cpp/gloox/src/tests/parser/Makefile.am | 11 + .../cpp/gloox/src/tests/parser/Makefile.in | 517 + .../gloox/src/tests/parser/parser_test.cpp | 1335 ++ .../main/cpp/gloox/src/tests/prep/Makefile.am | 11 + .../main/cpp/gloox/src/tests/prep/Makefile.in | 516 + .../cpp/gloox/src/tests/prep/prep_test.cpp | 161 + .../cpp/gloox/src/tests/presence/Makefile.am | 12 + .../cpp/gloox/src/tests/presence/Makefile.in | 520 + .../src/tests/presence/presence_test.cpp | 335 + .../src/tests/privacymanager/Makefile.am | 14 + .../src/tests/privacymanager/Makefile.in | 522 + .../privacymanager/privacymanager_test.cpp | 145 + .../src/tests/privacymanagerquery/Makefile.am | 13 + .../src/tests/privacymanagerquery/Makefile.in | 524 + .../privacymanagerquery_test.cpp | 257 + .../gloox/src/tests/privatexml/Makefile.am | 15 + .../gloox/src/tests/privatexml/Makefile.in | 522 + .../src/tests/privatexml/privatexml_test.cpp | 224 + .../gloox/src/tests/pubsubevent/Makefile.am | 16 + .../gloox/src/tests/pubsubevent/Makefile.in | 525 + .../tests/pubsubevent/pubsubevent_test.cpp | 329 + .../gloox/src/tests/pubsubmanager/Makefile.am | 22 + .../gloox/src/tests/pubsubmanager/Makefile.in | 532 + .../pubsubmanager/pubsubmanager_test.cpp | 377 + .../src/tests/pubsubmanagerpubsub/Makefile.am | 24 + .../src/tests/pubsubmanagerpubsub/Makefile.in | 547 + .../pubsubmanagerpubsub_test.cpp | 67 + .../cpp/gloox/src/tests/receipt/Makefile.am | 15 + .../cpp/gloox/src/tests/receipt/Makefile.in | 522 + .../gloox/src/tests/receipt/receipt_test.cpp | 118 + .../gloox/src/tests/registration/Makefile.am | 15 + .../gloox/src/tests/registration/Makefile.in | 527 + .../tests/registration/registration_test.cpp | 387 + .../src/tests/registrationquery/Makefile.am | 16 + .../src/tests/registrationquery/Makefile.in | 527 + .../registrationquery_test.cpp | 263 + .../gloox/src/tests/rostermanager/Makefile.am | 17 + .../gloox/src/tests/rostermanager/Makefile.in | 529 + .../rostermanager/rostermanager_test.cpp | 450 + .../src/tests/rostermanagerquery/Makefile.am | 25 + .../src/tests/rostermanagerquery/Makefile.in | 549 + .../rostermanagerquery_test.cpp | 159 + .../cpp/gloox/src/tests/search/Makefile.am | 15 + .../cpp/gloox/src/tests/search/Makefile.in | 526 + .../gloox/src/tests/search/search_test.cpp | 349 + .../gloox/src/tests/searchquery/Makefile.am | 15 + .../gloox/src/tests/searchquery/Makefile.in | 526 + .../tests/searchquery/searchquery_test.cpp | 259 + .../main/cpp/gloox/src/tests/sha/Makefile.am | 11 + .../main/cpp/gloox/src/tests/sha/Makefile.in | 516 + .../main/cpp/gloox/src/tests/sha/sha_test.cpp | 147 + .../main/cpp/gloox/src/tests/shim/Makefile.am | 15 + .../main/cpp/gloox/src/tests/shim/Makefile.in | 522 + .../cpp/gloox/src/tests/shim/shim_test.cpp | 100 + .../cpp/gloox/src/tests/simanager/Makefile.am | 14 + .../cpp/gloox/src/tests/simanager/Makefile.in | 522 + .../src/tests/simanager/simanager_test.cpp | 165 + .../gloox/src/tests/simanagersi/Makefile.am | 14 + .../gloox/src/tests/simanagersi/Makefile.in | 523 + .../tests/simanagersi/simanagersi_test.cpp | 174 + .../tests/stanzaextensionfactory/Makefile.am | 19 + .../tests/stanzaextensionfactory/Makefile.in | 545 + .../stanzaextensionfactory_perf.cpp | 92 + .../stanzaextensionfactory_test.cpp | 92 + .../gloox/src/tests/subscription/Makefile.am | 12 + .../gloox/src/tests/subscription/Makefile.in | 520 + .../tests/subscription/subscription_test.cpp | 196 + .../main/cpp/gloox/src/tests/tag/Makefile.am | 15 + .../main/cpp/gloox/src/tests/tag/Makefile.in | 526 + .../main/cpp/gloox/src/tests/tag/tag_perf.cpp | 164 + .../main/cpp/gloox/src/tests/tag/tag_test.cpp | 478 + .../cpp/gloox/src/tests/tlsgnutls/Makefile.am | 11 + .../cpp/gloox/src/tests/tlsgnutls/Makefile.in | 518 + .../src/tests/tlsgnutls/tlsgnutls_test.cpp | 277 + .../src/tests/uniquemucroomunique/Makefile.am | 23 + .../src/tests/uniquemucroomunique/Makefile.in | 548 + .../uniquemucroomunique_test.cpp | 86 + .../main/cpp/gloox/src/tests/util/Makefile.am | 11 + .../main/cpp/gloox/src/tests/util/Makefile.in | 516 + .../cpp/gloox/src/tests/util/util_test.cpp | 282 + .../cpp/gloox/src/tests/vcard/Makefile.am | 13 + .../cpp/gloox/src/tests/vcard/Makefile.in | 522 + .../cpp/gloox/src/tests/vcard/vcard_test.cpp | 74 + .../gloox/src/tests/vcardupdate/Makefile.am | 11 + .../gloox/src/tests/vcardupdate/Makefile.in | 517 + .../tests/vcardupdate/vcardupdate_test.cpp | 113 + .../cpp/gloox/src/tests/xpath/Makefile.am | 11 + .../cpp/gloox/src/tests/xpath/Makefile.in | 516 + .../cpp/gloox/src/tests/xpath/xpath_test.cpp | 954 + .../main/cpp/gloox/src/tests/zlib/Makefile.am | 15 + .../main/cpp/gloox/src/tests/zlib/Makefile.in | 526 + .../cpp/gloox/src/tests/zlib/zlib_perf.cpp | 133 + .../cpp/gloox/src/tests/zlib/zlib_test.cpp | 140 + smack/smack/src/main/cpp/gloox/src/tlsbase.h | 161 + .../src/main/cpp/gloox/src/tlsdefault.cpp | 156 + .../smack/src/main/cpp/gloox/src/tlsdefault.h | 111 + .../src/main/cpp/gloox/src/tlsgnutlsbase.cpp | 202 + .../src/main/cpp/gloox/src/tlsgnutlsbase.h | 98 + .../main/cpp/gloox/src/tlsgnutlsclient.cpp | 233 + .../src/main/cpp/gloox/src/tlsgnutlsclient.h | 81 + .../cpp/gloox/src/tlsgnutlsclientanon.cpp | 112 + .../main/cpp/gloox/src/tlsgnutlsclientanon.h | 70 + .../cpp/gloox/src/tlsgnutlsserveranon.cpp | 123 + .../main/cpp/gloox/src/tlsgnutlsserveranon.h | 75 + .../smack/src/main/cpp/gloox/src/tlshandler.h | 68 + .../src/main/cpp/gloox/src/tlsopensslbase.cpp | 336 + .../src/main/cpp/gloox/src/tlsopensslbase.h | 108 + .../main/cpp/gloox/src/tlsopensslclient.cpp | 59 + .../src/main/cpp/gloox/src/tlsopensslclient.h | 69 + .../main/cpp/gloox/src/tlsopensslserver.cpp | 265 + .../src/main/cpp/gloox/src/tlsopensslserver.h | 64 + .../src/main/cpp/gloox/src/tlsschannel.cpp | 836 + .../src/main/cpp/gloox/src/tlsschannel.h | 114 + .../src/main/cpp/gloox/src/uniquemucroom.cpp | 109 + .../src/main/cpp/gloox/src/uniquemucroom.h | 117 + smack/smack/src/main/cpp/gloox/src/util.cpp | 197 + smack/smack/src/main/cpp/gloox/src/util.h | 287 + smack/smack/src/main/cpp/gloox/src/vcard.cpp | 559 + smack/smack/src/main/cpp/gloox/src/vcard.h | 627 + .../src/main/cpp/gloox/src/vcardhandler.h | 75 + .../src/main/cpp/gloox/src/vcardmanager.cpp | 127 + .../src/main/cpp/gloox/src/vcardmanager.h | 156 + .../src/main/cpp/gloox/src/vcardupdate.cpp | 79 + .../src/main/cpp/gloox/src/vcardupdate.h | 106 + smack/smack/src/main/cpp/gloox/src/version.rc | 31 + .../smack/src/main/cpp/gloox/src/xhtmlim.cpp | 56 + smack/smack/src/main/cpp/gloox/src/xhtmlim.h | 78 + smack/smack/src/main/cpp/hello.cpp | 1735 ++ smack/smack/src/main/cpp/log.h | 97 + smack/smack/src/main/cpp/log_android.cpp | 41 + smack/smack/src/main/cpp/log_ohos.cpp | 41 + smack/smack/src/main/cpp/registration.cpp | 128 + smack/smack/src/main/cpp/registration.h | 48 + smack/smack/src/main/cpp/room.cpp | 665 + smack/smack/src/main/cpp/room.h | 96 + .../src/main/cpp/types/libentry/index.d.ts | 199 + .../src/main/cpp/types/libentry/package.json | 4 + smack/smack/src/main/ets/FriendsEntity.ts | 18 + smack/smack/src/main/ets/MUCOperation.ts | 18 + .../smack/src/main/ets/MUCRoomAffiliation.ts | 12 + smack/smack/src/main/ets/MUCRoomRole.ts | 11 + smack/smack/src/main/ets/PresenceRoomType.ts | 11 + smack/smack/src/main/ets/PresenceType.ts | 17 + smack/smack/src/main/ets/RoomConfig.ts | 106 + smack/smack/src/main/ets/RoomInfo.ts | 16 + smack/smack/src/main/ets/Smack.ts | 607 + smack/smack/src/main/module.json5 | 10 + .../main/resources/base/element/string.json | 8 + ...13\350\257\225\350\257\264\346\230\216.md" | 97 + 690 files changed, 181603 insertions(+) create mode 100644 smack/.gitignore create mode 100644 smack/AppScope/app.json5 create mode 100644 smack/AppScope/resources/base/element/string.json create mode 100644 smack/AppScope/resources/base/media/app_icon.png create mode 100644 smack/CHANGELOG.md create mode 100644 smack/LICENSE create mode 100644 smack/README.OpenSource create mode 100644 smack/README.md create mode 100644 smack/build-profile.json5 create mode 100644 smack/entry/.gitignore create mode 100644 smack/entry/build-profile.json5 create mode 100644 smack/entry/hvigorfile.js create mode 100644 smack/entry/package.json create mode 100644 smack/entry/src/main/ets/Application/AbilityStage.ts create mode 100644 smack/entry/src/main/ets/MainAbility/MainAbility.ts create mode 100644 smack/entry/src/main/ets/entity/ChatContentEntity.ts create mode 100644 smack/entry/src/main/ets/entity/Constant.ts create mode 100644 smack/entry/src/main/ets/pages/base/ItemInput.ets create mode 100644 smack/entry/src/main/ets/pages/base/ItemText.ets create mode 100644 smack/entry/src/main/ets/pages/base/SelectDialog.ets create mode 100644 smack/entry/src/main/ets/pages/base/Switches.ets create mode 100644 smack/entry/src/main/ets/pages/base/toolbar.ets create mode 100644 smack/entry/src/main/ets/pages/chat/group_chat/group_all_member.ets create mode 100644 smack/entry/src/main/ets/pages/chat/group_chat/group_chat_edit.ets create mode 100644 smack/entry/src/main/ets/pages/chat/group_chat/group_chat_main.ets create mode 100644 smack/entry/src/main/ets/pages/chat/group_chat/group_chat_setting.ets create mode 100644 smack/entry/src/main/ets/pages/chat/group_chat/group_member.ets create mode 100644 smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_main.ets create mode 100644 smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_setting.ets create mode 100644 smack/entry/src/main/ets/pages/chat/one_chat/one_chat_main.ets create mode 100644 smack/entry/src/main/ets/pages/chat/one_chat/one_chat_setting.ets create mode 100644 smack/entry/src/main/ets/pages/index.ets create mode 100644 smack/entry/src/main/ets/pages/main.ets create mode 100644 smack/entry/src/main/ets/pages/page.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/friends/add_friends.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/friends/add_group.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/friends/change_group_name.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/friends/friends_list.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/group/Join_in_group.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/group/create_group_chat.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/group/group_list.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/meeting/Join_in_meeting.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/meeting/create_meeting.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/meeting/meeting_list.ets create mode 100644 smack/entry/src/main/ets/pages/tabs/setting.ets create mode 100644 smack/entry/src/main/ets/pages/user/login.ets create mode 100644 smack/entry/src/main/ets/pages/user/register.ets create mode 100644 smack/entry/src/main/ets/pages/user/search_friends.ets create mode 100644 smack/entry/src/main/module.json5 create mode 100644 smack/entry/src/main/resources/base/element/color.json create mode 100644 smack/entry/src/main/resources/base/element/string.json create mode 100644 smack/entry/src/main/resources/base/media/add.png create mode 100644 smack/entry/src/main/resources/base/media/back.png create mode 100644 smack/entry/src/main/resources/base/media/change.png create mode 100644 smack/entry/src/main/resources/base/media/icon.png create mode 100644 smack/entry/src/main/resources/base/media/more.png create mode 100644 smack/entry/src/main/resources/base/media/refresh.png create mode 100644 smack/entry/src/main/resources/base/profile/main_pages.json create mode 100644 smack/hvigorfile.js create mode 100644 smack/image/1.png create mode 100644 smack/image/10.png create mode 100644 smack/image/11.png create mode 100644 smack/image/12.png create mode 100644 smack/image/13.png create mode 100644 smack/image/14.png create mode 100644 smack/image/15.png create mode 100644 smack/image/16.png create mode 100644 smack/image/17.png create mode 100644 smack/image/18.png create mode 100644 smack/image/2.png create mode 100644 smack/image/3.png create mode 100644 smack/image/7.png create mode 100644 smack/image/8.png create mode 100644 smack/image/9.png create mode 100644 smack/image/sample.gif create mode 100644 smack/oh-package-lock.json5 create mode 100644 smack/package.json create mode 100644 smack/smack/.gitignore create mode 100644 smack/smack/build-profile.json5 create mode 100644 smack/smack/hvigorfile.js create mode 100644 smack/smack/index.ts create mode 100644 smack/smack/package.json create mode 100644 smack/smack/src/main/cpp/CMakeLists.txt create mode 100644 smack/smack/src/main/cpp/MyMUCInvitationHandler.cpp create mode 100644 smack/smack/src/main/cpp/MyMUCInvitationHandler.h create mode 100644 smack/smack/src/main/cpp/Smack.cpp create mode 100644 smack/smack/src/main/cpp/Smack.h create mode 100644 smack/smack/src/main/cpp/gloox/AUTHORS create mode 100644 smack/smack/src/main/cpp/gloox/COPYING create mode 100644 smack/smack/src/main/cpp/gloox/ChangeLog create mode 100644 smack/smack/src/main/cpp/gloox/Doxyfile create mode 100644 smack/smack/src/main/cpp/gloox/INSTALL create mode 100644 smack/smack/src/main/cpp/gloox/LICENSE create mode 100644 smack/smack/src/main/cpp/gloox/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/NEWS create mode 100644 smack/smack/src/main/cpp/gloox/README create mode 100644 smack/smack/src/main/cpp/gloox/README.symbian create mode 100644 smack/smack/src/main/cpp/gloox/README.win32 create mode 100644 smack/smack/src/main/cpp/gloox/README.wince create mode 100644 smack/smack/src/main/cpp/gloox/TODO create mode 100644 smack/smack/src/main/cpp/gloox/UPGRADING create mode 100644 smack/smack/src/main/cpp/gloox/acinclude.m4 create mode 100644 smack/smack/src/main/cpp/gloox/aclocal.m4 create mode 100644 smack/smack/src/main/cpp/gloox/bld.inf create mode 100644 smack/smack/src/main/cpp/gloox/config.guess create mode 100644 smack/smack/src/main/cpp/gloox/config.h.android create mode 100644 smack/smack/src/main/cpp/gloox/config.h.ohos create mode 100644 smack/smack/src/main/cpp/gloox/config.h.symbian create mode 100644 smack/smack/src/main/cpp/gloox/config.h.unix.in create mode 100644 smack/smack/src/main/cpp/gloox/config.h.win create mode 100644 smack/smack/src/main/cpp/gloox/config.sub create mode 100644 smack/smack/src/main/cpp/gloox/configure create mode 100644 smack/smack/src/main/cpp/gloox/configure.ac create mode 100644 smack/smack/src/main/cpp/gloox/depcomp create mode 100644 smack/smack/src/main/cpp/gloox/gloox-config.in create mode 100644 smack/smack/src/main/cpp/gloox/gloox.cbp create mode 100644 smack/smack/src/main/cpp/gloox/gloox.dsp create mode 100644 smack/smack/src/main/cpp/gloox/gloox.mmp create mode 100644 smack/smack/src/main/cpp/gloox/gloox.pc.in create mode 100644 smack/smack/src/main/cpp/gloox/gloox.vcproj create mode 100644 smack/smack/src/main/cpp/gloox/install-sh create mode 100644 smack/smack/src/main/cpp/gloox/ltmain.sh create mode 100644 smack/smack/src/main/cpp/gloox/missing create mode 100644 smack/smack/src/main/cpp/gloox/src/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/adhoc.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/adhoc.h create mode 100644 smack/smack/src/main/cpp/gloox/src/adhoccommandprovider.h create mode 100644 smack/smack/src/main/cpp/gloox/src/adhochandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/adhocplugin.h create mode 100644 smack/smack/src/main/cpp/gloox/src/amp.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/amp.h create mode 100644 smack/smack/src/main/cpp/gloox/src/annotations.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/annotations.h create mode 100644 smack/smack/src/main/cpp/gloox/src/annotationshandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/atomicrefcount.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/atomicrefcount.h create mode 100644 smack/smack/src/main/cpp/gloox/src/attention.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/attention.h create mode 100644 smack/smack/src/main/cpp/gloox/src/base64.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/base64.h create mode 100644 smack/smack/src/main/cpp/gloox/src/bookmarkhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/bookmarkstorage.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/bookmarkstorage.h create mode 100644 smack/smack/src/main/cpp/gloox/src/bytestream.h create mode 100644 smack/smack/src/main/cpp/gloox/src/bytestreamdatahandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/bytestreamhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/capabilities.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/capabilities.h create mode 100644 smack/smack/src/main/cpp/gloox/src/carbons.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/carbons.h create mode 100644 smack/smack/src/main/cpp/gloox/src/chatstate.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/chatstate.h create mode 100644 smack/smack/src/main/cpp/gloox/src/chatstatefilter.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/chatstatefilter.h create mode 100644 smack/smack/src/main/cpp/gloox/src/chatstatehandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/client.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/client.h create mode 100644 smack/smack/src/main/cpp/gloox/src/clientbase.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/clientbase.h create mode 100644 smack/smack/src/main/cpp/gloox/src/component.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/component.h create mode 100644 smack/smack/src/main/cpp/gloox/src/compressionbase.h create mode 100644 smack/smack/src/main/cpp/gloox/src/compressiondatahandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/compressiondefault.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/compressiondefault.h create mode 100644 smack/smack/src/main/cpp/gloox/src/compressionzlib.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/compressionzlib.h create mode 100644 smack/smack/src/main/cpp/gloox/src/config.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionbase.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionbosh.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionbosh.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiondatahandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionlistener.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontcpbase.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontcpbase.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontcpclient.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontcpclient.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontcpserver.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontcpserver.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontls.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontls.h create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontlsserver.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/connectiontlsserver.h create mode 100644 smack/smack/src/main/cpp/gloox/src/dataform.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/dataform.h create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformfield.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformfield.h create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.h create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformitem.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformitem.h create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformreported.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/dataformreported.h create mode 100644 smack/smack/src/main/cpp/gloox/src/delayeddelivery.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/delayeddelivery.h create mode 100644 smack/smack/src/main/cpp/gloox/src/disco.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/disco.h create mode 100644 smack/smack/src/main/cpp/gloox/src/discohandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/disconodehandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/dns.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/dns.h create mode 100644 smack/smack/src/main/cpp/gloox/src/error.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/error.h create mode 100644 smack/smack/src/main/cpp/gloox/src/event.h create mode 100644 smack/smack/src/main/cpp/gloox/src/eventdispatcher.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/eventdispatcher.h create mode 100644 smack/smack/src/main/cpp/gloox/src/eventhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/adhoc_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/annotations_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/bookmarkstorage_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/bosh_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/component_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/disco_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/e2ee_client.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/e2ee_server.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/flexoff_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/ft_recv.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/ft_send.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/linklocal_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/message_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/muc_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/privacylist_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/privatexml_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/pubsub_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/reconnect_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/register_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/reset_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/roster_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/examples/vcard_example.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/featureneg.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/featureneg.h create mode 100644 smack/smack/src/main/cpp/gloox/src/flexoff.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/flexoff.h create mode 100644 smack/smack/src/main/cpp/gloox/src/flexoffhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/forward.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/forward.h create mode 100644 smack/smack/src/main/cpp/gloox/src/gloox.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/gloox.h create mode 100644 smack/smack/src/main/cpp/gloox/src/glooxversion.h create mode 100644 smack/smack/src/main/cpp/gloox/src/gpgencrypted.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/gpgencrypted.h create mode 100644 smack/smack/src/main/cpp/gloox/src/gpgsigned.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/gpgsigned.h create mode 100644 smack/smack/src/main/cpp/gloox/src/inbandbytestream.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/inbandbytestream.h create mode 100644 smack/smack/src/main/cpp/gloox/src/instantmucroom.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/instantmucroom.h create mode 100644 smack/smack/src/main/cpp/gloox/src/iodata.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/iodata.h create mode 100644 smack/smack/src/main/cpp/gloox/src/iq.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/iq.h create mode 100644 smack/smack/src/main/cpp/gloox/src/iqhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jid.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/jid.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglecontent.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglecontent.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jingleiceudp.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/jingleiceudp.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jingleplugin.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglesession.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglesession.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglesessionhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/lastactivity.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/lastactivity.h create mode 100644 smack/smack/src/main/cpp/gloox/src/lastactivityhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/linklocal.h create mode 100644 smack/smack/src/main/cpp/gloox/src/linklocalclient.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/linklocalclient.h create mode 100644 smack/smack/src/main/cpp/gloox/src/linklocalhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/linklocalmanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/linklocalmanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/loghandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/logsink.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/logsink.h create mode 100644 smack/smack/src/main/cpp/gloox/src/macros.h create mode 100644 smack/smack/src/main/cpp/gloox/src/md5.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/md5.h create mode 100644 smack/smack/src/main/cpp/gloox/src/message.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/message.h create mode 100644 smack/smack/src/main/cpp/gloox/src/messageevent.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/messageevent.h create mode 100644 smack/smack/src/main/cpp/gloox/src/messageeventfilter.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/messageeventfilter.h create mode 100644 smack/smack/src/main/cpp/gloox/src/messageeventhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/messagefilter.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/messagefilter.h create mode 100644 smack/smack/src/main/cpp/gloox/src/messagehandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/messagesession.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/messagesession.h create mode 100644 smack/smack/src/main/cpp/gloox/src/messagesessionhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/mucmessagesession.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/mucmessagesession.h create mode 100644 smack/smack/src/main/cpp/gloox/src/mucroom.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/mucroom.h create mode 100644 smack/smack/src/main/cpp/gloox/src/mucroomconfighandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/mucroomhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/mutex.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/mutex.h create mode 100644 smack/smack/src/main/cpp/gloox/src/mutexguard.h create mode 100644 smack/smack/src/main/cpp/gloox/src/nickname.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/nickname.h create mode 100644 smack/smack/src/main/cpp/gloox/src/nonsaslauth.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/nonsaslauth.h create mode 100644 smack/smack/src/main/cpp/gloox/src/oob.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/oob.h create mode 100644 smack/smack/src/main/cpp/gloox/src/parser.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/parser.h create mode 100644 smack/smack/src/main/cpp/gloox/src/prep.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/prep.h create mode 100644 smack/smack/src/main/cpp/gloox/src/presence.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/presence.h create mode 100644 smack/smack/src/main/cpp/gloox/src/presencehandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/privacyitem.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/privacyitem.h create mode 100644 smack/smack/src/main/cpp/gloox/src/privacylisthandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/privacymanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/privacymanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/privatexml.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/privatexml.h create mode 100644 smack/smack/src/main/cpp/gloox/src/privatexmlhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsub.h create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsubevent.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsubevent.h create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsubitem.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsubitem.h create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsubmanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsubmanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/pubsubresulthandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/receipt.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/receipt.h create mode 100644 smack/smack/src/main/cpp/gloox/src/registration.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/registration.h create mode 100644 smack/smack/src/main/cpp/gloox/src/registrationhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/resource.h create mode 100644 smack/smack/src/main/cpp/gloox/src/rosteritem.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/rosteritem.h create mode 100644 smack/smack/src/main/cpp/gloox/src/rosteritemdata.h create mode 100644 smack/smack/src/main/cpp/gloox/src/rosterlistener.h create mode 100644 smack/smack/src/main/cpp/gloox/src/rostermanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/rostermanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/search.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/search.h create mode 100644 smack/smack/src/main/cpp/gloox/src/searchhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/sha.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/sha.h create mode 100644 smack/smack/src/main/cpp/gloox/src/shim.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/shim.h create mode 100644 smack/smack/src/main/cpp/gloox/src/sihandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/simanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/simanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/siprofileft.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/siprofileft.h create mode 100644 smack/smack/src/main/cpp/gloox/src/siprofilefthandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/siprofilehandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/socks5bytestream.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/socks5bytestream.h create mode 100644 smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.h create mode 100644 smack/smack/src/main/cpp/gloox/src/softwareversion.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/softwareversion.h create mode 100644 smack/smack/src/main/cpp/gloox/src/stanza.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/stanza.h create mode 100644 smack/smack/src/main/cpp/gloox/src/stanzaextension.h create mode 100644 smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.h create mode 100644 smack/smack/src/main/cpp/gloox/src/statisticshandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/subscription.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/subscription.h create mode 100644 smack/smack/src/main/cpp/gloox/src/subscriptionhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tag.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tag.h create mode 100644 smack/smack/src/main/cpp/gloox/src/taghandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoc/adhoc_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/adhoccommand_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/adhoccommandnote_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/amp/amp_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/amprule/amprule_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/base64/base64_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/capabilities/capabilities_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/carbons/carbons_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/chatstatefilter_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/client/client_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/clientbase/clientbase_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/connectionbosh_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataform/dataform_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformfield/dataformfield_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformitem/dataformitem_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/dataformreported/dataformreported_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/delayeddelivery_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/disco/disco_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/discoinfo/discoinfo_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/discoitems/discoitems_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/error/error_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/featureneg/featureneg_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/flexoffline/flexoffline_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/flexofflineoffline_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/forward/forward_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/gpgencrypted_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/gpgsigned_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/inbandbytestream_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/inbandbytestreamibb_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/iodata/iodata_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/iq/iq_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jid/jid_perf.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jid/jid_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/jingleiceudp_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesession/jinglesession_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/jinglesessionjingle_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/jinglesessionmanager_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/lastactivity/lastactivity_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/lastactivityquery_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/md5/md5_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/message/message_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/messageeventfilter_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/mucroommuc_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/mucroommucadmin_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/mucroommucowner_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/mucroommucuser_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nickname/nickname_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/nonsaslauth_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/nonsaslauthquery_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/oob/oob_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/parser/parser_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/prep/prep_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/presence/presence_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privacymanager/privacymanager_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/privacymanagerquery_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/privatexml/privatexml_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/pubsubevent_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/pubsubmanager_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/pubsubmanagerpubsub_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/receipt/receipt_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/registration/registration_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/registrationquery/registrationquery_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/rostermanager/rostermanager_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/rostermanagerquery_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/search/search_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/searchquery/searchquery_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/sha/sha_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/shim/shim_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/simanager/simanager_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/simanagersi/simanagersi_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_perf.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/subscription/subscription_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/tag/tag_perf.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/tag/tag_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/tlsgnutls_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/uniquemucroomunique_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/util/util_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/vcard/vcard_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/vcardupdate_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/xpath/xpath_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.am create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.in create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/zlib/zlib_perf.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tests/zlib/zlib_test.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsbase.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsdefault.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsdefault.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlshandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsopensslbase.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsopensslbase.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsopensslclient.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsopensslclient.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsopensslserver.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsopensslserver.h create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsschannel.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/tlsschannel.h create mode 100644 smack/smack/src/main/cpp/gloox/src/uniquemucroom.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/uniquemucroom.h create mode 100644 smack/smack/src/main/cpp/gloox/src/util.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/util.h create mode 100644 smack/smack/src/main/cpp/gloox/src/vcard.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/vcard.h create mode 100644 smack/smack/src/main/cpp/gloox/src/vcardhandler.h create mode 100644 smack/smack/src/main/cpp/gloox/src/vcardmanager.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/vcardmanager.h create mode 100644 smack/smack/src/main/cpp/gloox/src/vcardupdate.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/vcardupdate.h create mode 100644 smack/smack/src/main/cpp/gloox/src/version.rc create mode 100644 smack/smack/src/main/cpp/gloox/src/xhtmlim.cpp create mode 100644 smack/smack/src/main/cpp/gloox/src/xhtmlim.h create mode 100644 smack/smack/src/main/cpp/hello.cpp create mode 100644 smack/smack/src/main/cpp/log.h create mode 100644 smack/smack/src/main/cpp/log_android.cpp create mode 100644 smack/smack/src/main/cpp/log_ohos.cpp create mode 100644 smack/smack/src/main/cpp/registration.cpp create mode 100644 smack/smack/src/main/cpp/registration.h create mode 100644 smack/smack/src/main/cpp/room.cpp create mode 100644 smack/smack/src/main/cpp/room.h create mode 100644 smack/smack/src/main/cpp/types/libentry/index.d.ts create mode 100644 smack/smack/src/main/cpp/types/libentry/package.json create mode 100644 smack/smack/src/main/ets/FriendsEntity.ts create mode 100644 smack/smack/src/main/ets/MUCOperation.ts create mode 100644 smack/smack/src/main/ets/MUCRoomAffiliation.ts create mode 100644 smack/smack/src/main/ets/MUCRoomRole.ts create mode 100644 smack/smack/src/main/ets/PresenceRoomType.ts create mode 100644 smack/smack/src/main/ets/PresenceType.ts create mode 100644 smack/smack/src/main/ets/RoomConfig.ts create mode 100644 smack/smack/src/main/ets/RoomInfo.ts create mode 100644 smack/smack/src/main/ets/Smack.ts create mode 100644 smack/smack/src/main/module.json5 create mode 100644 smack/smack/src/main/resources/base/element/string.json create mode 100644 "smack/\346\234\215\345\212\241\346\236\204\345\273\272\344\273\245\345\217\212\346\265\213\350\257\225\350\257\264\346\230\216.md" diff --git a/smack/.gitignore b/smack/.gitignore new file mode 100644 index 00000000..c27b880d --- /dev/null +++ b/smack/.gitignore @@ -0,0 +1,10 @@ +/node_modules +/local.properties +/.idea +**/build +smack/.cxx +/.clang-format +/.clangd +/.hvigor +/.clang-tidy +**/package-lock.json diff --git a/smack/AppScope/app.json5 b/smack/AppScope/app.json5 new file mode 100644 index 00000000..6413c216 --- /dev/null +++ b/smack/AppScope/app.json5 @@ -0,0 +1,11 @@ +{ + "app": { + "bundleName": "com.openharmony.smack", + "vendor": "hihope", + "versionCode": 1000000, + "versionName": "1.0.0", + "icon": "$media:app_icon", + "label": "$string:app_name", + "distributedNotificationEnabled": true + } +} diff --git a/smack/AppScope/resources/base/element/string.json b/smack/AppScope/resources/base/element/string.json new file mode 100644 index 00000000..c69430c9 --- /dev/null +++ b/smack/AppScope/resources/base/element/string.json @@ -0,0 +1,8 @@ +{ + "string": [ + { + "name": "app_name", + "value": "Smack" + } + ] +} diff --git a/smack/AppScope/resources/base/media/app_icon.png b/smack/AppScope/resources/base/media/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ce307a8827bd75456441ceb57d530e4c8d45d36c GIT binary patch literal 6790 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 + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + + +OpenSSL exception +----------------- + +In addition, as a special exception, the copyright holders give +permission to link the code of portions of this program with the +OpenSSL library, and distribute linked combinations +including the two. +You must obey the GNU General Public License in all respects +for all of the code used other than OpenSSL. If you modify +file(s) with this exception, you may extend this exception to your +version of the file(s), but you are not obligated to do so. + \ No newline at end of file diff --git a/smack/README.OpenSource b/smack/README.OpenSource new file mode 100644 index 00000000..1af3bae6 --- /dev/null +++ b/smack/README.OpenSource @@ -0,0 +1,10 @@ +[ + { + "Name": "smack", + "License": "GPL License", + "Version Number": "1.0.13", + "Owner" : "Jakob Schröter" + "Upstream URL": "https://github.com/igniterealtime/Smack", + "Description": "一个基于XMPP协议的一个聊天客户端." + } +] \ No newline at end of file diff --git a/smack/README.md b/smack/README.md new file mode 100644 index 00000000..8e879f62 --- /dev/null +++ b/smack/README.md @@ -0,0 +1,171 @@ +# Smack +## 简介 +>Smack是一个基于XMPP协议的一个聊天客户端 + +## 效果展示 +![效果展示](image/sample.gif) + +## 下载安装 +``` +npm install @ohos/smack --save +``` +OpenHarmony npm环境配置等更多内容,请参考 [如何安装OpenHarmony npm包](https://gitee.com/openharmony-tpc/docs/blob/master/OpenHarmony_npm_usage.md) 。 + + +## 使用说明 + +1. 创建后台服务 +``` +通过https://igniterealtime.org/downloads/地址下载最新版的Openfire并安装作为服务器 +``` + + +2. 在页面添加引用并设置服务信息 + + ``` +添加引用:import { Smack } from '@ohos/smack' +设置服务信息,如Constant.ets类中的设置: +static HOST_IP: string = "10.50.40.65" +static HOST_DOMAIN: string = "he-202101111234" + ``` + +3. 调用方法 + + ``` + 1. 注册用户 globalThis.Smack.registers("dongpo_003","test2"); + 2. 注销用户 globalThis.Smack.unregister(); + 3. 用户登录 globalThis.Smack.Login(this.userName + '@' + Constant.HOST_IP, this.passWord); + 4. 用户登出 globalThis.Smack.loginout(); + 5. 修改密码 globalThis.Smack.changPwd('123456') + 6. 设置用户状态(空闲、在线、离开等) globalThis.Smack.changePresence(presenceType, this.states[this.select]); + 7. 发送消息 globalThis.Smack.send(userName, msg) + 8. 接收消息 globalThis.Smack.registerMessageCallback((id, msg)=>{}) + 9. 添加好友到指定分组 globalThis.Smack.addFriends(this.name + "@" + Constant.HOST_DOMAIN, this.name, this.group); + 10. 删除好友 globalThis.Smack.delfriend(this.userName + '@' + Constant.HOST_IP); + 11. 好友列表 globalThis.Smack.getFriendList(); + 12. 更改分组名称 globalThis.Smack.changeGroup(this.oldName, this.newName); + 13. 更改好友分组 globalThis.Smack.changeFriendGroup(name + "@" + Constant.HOST_DOMAIN, this.newGroup); + 14. 创建群聊群组 globalThis.Smack.createRoom("444@"+Constant.HOST_IP+Constant.HOST_RES, "room1", Constant.HOST_DOMAIN, Constant.SERVICE_NAME); + 15. 加入群组 globalThis.Smack.join(); + 16. 离开群组 globalThis.Smack.leave("leave msg"); + 17. 发送群组消息 globalThis.Smack.sendGroupMessage("group msg test"); + 18. 设置群组主题 globalThis.Smack.setSubject("subject"); + 19. 销毁群组 globalThis.Smack.destroy("444@"+Constant.HOST_IP+Constant.HOST_RES, "123"); + 20. 踢出群组 globalThis.Smack.kick("555", "kick"); + 21. 踢出群组并拉进黑名单 globalThis.Smack.ban("555", "ban"); + 22. 授予发言权限 globalThis.Smack.grantVoice("555", "grantVoice"); + 23. 移除发言权限 globalThis.Smack.revokeVoice("555", "revokeVoice"); + 24. 岗位设置 globalThis.Smack.setAffiliation("555", MUCRoomAffiliation.AffiliationOwner, "AffiliationOwner"); + 25. 角色设置 RoleModerator globalThis.Smack.setRole("888", MUCRoomRole.RoleModerator, "RoleModerator"); + 26. 邀请成员 globalThis.Smack.invite("777"+this.service, "invite"); + 27. 获取全部群组成员 globalThis.Smack.getRoomItems(); + 28. 过滤群组成员 globalThis.Smack.requestList(MUCOperation.RequestOwnerList); + 29. 拒绝加入群组 globalThis.Smack.declineInvitation("888_room@"+Constant.SERVICE_NAME+"."+Constant.HOST_DOMAIN, "888@"+Constant.HOST_DOMAIN, "room inviation refuesd"); + 30. 创建并加入群组 globalThis.Smack.createOrJoinRoom("room4", Constant.HOST_DOMAIN, Constant.SERVICE_NAME, "123"); + 31. 加入密码群组时使用密码 globalThis.Smack.setPassword("123123"); + 32. 获取加入群聊的群组信息 globalThis.Smack.getRoomInfo(); + 33. 获取群组配置 globalThis.Smack.requestRoomConfig(); + 34. 设置群聊配置 globalThis.Smack.setRoomConfig(JSON.stringify(this.roomConfig)); + 35. 从该聊天室踢出用户群 globalThis.Smack.bans("888,555", "bans"); + 36. 更改聊天室成员的昵称 globalThis.Smack.setNick("new_nike_name"); + 37. 目前是否在多人聊天中 globalThis.Smack.isJoined(); + 38. 返回房间里用户的昵称 globalThis.Smack.nick(); + 39. 是否连接 globalThis.Smack.isConnected(); + 40. 用户名称 globalThis.Smack.username(); + 41. 建立连接 globalThis.Smack.connect(); + 42. 设置域名或ip globalThis.Smack.setServer(Constant.HOST_IP); + 43. 输入用户名和密码 globalThis.Smack.setUsernameAndPassword("zhang", "123456"); + 44. 设置端口号 globalThis.Smack.setPort(Constant.HOST_PORT); + 45. 获取密码 globalThis.Smack.password(); + 46. 设置Resource globalThis.Smack.setResource(Constant.HOST_RES.replace("/","")); + 47. 多人角色设置 globalThis.Smack.setRoles(this.getUsers(), MUCRoomRole.RoleParticipant, "RoleParticipant"); + 48. 多人语音授权 globalThis.Smack.grantVoices(this.getUsers(), "grantVoices"); + 49. 多人语音授权撤销 globalThis.Smack.revokeVoices(this.getUsers(), "revokeVoices"); + 50. 多人从属关系设置 globalThis.Smack.setAffiliations("555,333", MUCRoomAffiliation.AffiliationOwner, "AffiliationOwner"); + 51. 获取端口号 globalThis.Smack.port(); + 52. 获取ip或域名 globalThis.Smack.server(); + 53. 接受好友添加请求 globalThis.Smack.receiveFriends("444@"+Constant.HOST_DOMAIN, "group", msg: "accept") + 54. 拒绝好友添加请求 globalThis.Smack.rejectFriends("444@"+Constant.HOST_DOMAIN, “reject”) + + ``` + + +## 接口说明 + +1. 注册用户 `globalThis.Smack.registers("dongpo_003","test2");` +2. 注销用户 `globalThis.Smack.unregister();` +3. 用户登录 `globalThis.Smack.Login(this.userName + '@' + Constant.HOST_IP, this.passWord);` +4. 用户登出 `globalThis.Smack.loginout();` +5. 修改密码 `globalThis.Smack.changPwd('123456')` +6. 设置用户状态(空闲、在线、离开等) `globalThis.Smack.changePresence(presenceType, this.states[this.select]);` +7. 发送消息 `globalThis.Smack.send(userName, msg)` +8. 接收消息 `globalThis.Smack.registerMessageCallback((id, msg)=>{})` +9. 添加好友到指定分组 `globalThis.Smack.addFriends(this.name + "@" + Constant.HOST_DOMAIN, this.name, this.group);` +10. 删除好友 `globalThis.Smack.delfriend(this.userName + '@' + Constant.HOST_IP);` +11. 好友列表 `globalThis.Smack.getFriendList();` +12. 更改分组名称 `globalThis.Smack.changeGroup(this.oldName, this.newName);` +13. 更改好友分组 `globalThis.Smack.changeFriendGroup(name + "@" + Constant.HOST_DOMAIN, this.newGroup);` +14. 创建群聊群组 `globalThis.Smack.createRoom("444@"+Constant.HOST_IP+Constant.HOST_RES, "room1", Constant.HOST_DOMAIN, Constant.SERVICE_NAME);` +15. 加入群组 `globalThis.Smack.join();` +16. 离开群组 `globalThis.Smack.leave("leave msg");` +17. 发送群组消息 `globalThis.Smack.sendGroupMessage("group msg test");` +18. 设置群组主题 `globalThis.Smack.setSubject("subject");` +19. 销毁群组 `globalThis.Smack.destroy("444@"+Constant.HOST_IP+Constant.HOST_RES, "123");` +20. 踢出群组 `globalThis.Smack.kick("555", "kick");` +21. 踢出群组并拉进黑名单 `globalThis.Smack.ban("555", "ban");` +22. 授予发言权限 `globalThis.Smack.grantVoice("555", "grantVoice");` +23. 移除发言权限 `globalThis.Smack.revokeVoice("555", "revokeVoice");` +24. 岗位设置 `globalThis.Smack.setAffiliation("555", MUCRoomAffiliation.AffiliationOwner, "AffiliationOwner");` +25. 角色设置 `RoleModerator globalThis.Smack.setRole("888", MUCRoomRole.RoleModerator, "RoleModerator");` +26. 邀请成员 `globalThis.Smack.invite("777"+this.service, "invite");` +27. 获取全部群组成员 `globalThis.Smack.getRoomItems();` +28. 过滤群组成员 `globalThis.Smack.requestList(MUCOperation.RequestOwnerList);` +29. 拒绝加入群组 `globalThis.Smack.declineInvitation("888_room@"+Constant.SERVICE_NAME+"."+Constant.HOST_DOMAIN, "888@"+Constant.HOST_DOMAIN, "room inviation refuesd");` +30. 创建并加入群组 `globalThis.Smack.createOrJoinRoom("room4", Constant.HOST_DOMAIN, Constant.SERVICE_NAME, "123");` +31. 加入密码群组时使用密码 `globalThis.Smack.setPassword("123123");` +32. 获取加入群聊的群组信息 `globalThis.Smack.getRoomInfo();` +33. 获取群组配置 `globalThis.Smack.requestRoomConfig();` +34. 设置群聊配置 `globalThis.Smack.setRoomConfig(JSON.stringify(this.roomConfig));` +35. 从该聊天室踢出用户群 `globalThis.Smack.bans("888,555", "bans");` +36. 更改聊天室成员的昵称 `globalThis.Smack.setNick("new_nike_name");` +37. 目前是否在多人聊天中 `globalThis.Smack.isJoined();` +38. 返回房间里用户的昵称 `globalThis.Smack.nick();` +39. 是否连接 `globalThis.Smack.isConnected();` +40. 用户名称 `globalThis.Smack.username();` +41. 建立连接 `globalThis.Smack.connect();` +42. 设置域名或ip `globalThis.Smack.setServer(Constant.HOST_IP);` +43. 输入用户名和密码 `globalThis.Smack.setUsernameAndPassword("zhang", "123456");` +44. 设置端口号 `globalThis.Smack.setPort(Constant.HOST_PORT);` +45. 获取密码 `globalThis.Smack.password();` +46. 设置Resource `globalThis.Smack.setResource(Constant.HOST_RES.replace("/",""));` +47. 多人角色设置 `globalThis.Smack.setRoles(this.getUsers(), MUCRoomRole.RoleParticipant, "RoleParticipant");` +48. 多人语音授权 `globalThis.Smack.grantVoices(this.getUsers(), "grantVoices");` +49. 多人语音授权撤销 `globalThis.Smack.revokeVoices(this.getUsers(), "revokeVoices");` +50. 多人从属关系设置 `globalThis.Smack.setAffiliations("555,333", MUCRoomAffiliation.AffiliationOwner, "AffiliationOwner");` +51. 获取端口号 `globalThis.Smack.port();` +52. 获取ip或域名 `globalThis.Smack.server();` +53. 接受好友添加请求 `globalThis.Smack.receiveFriends("444@"+Constant.HOST_DOMAIN, "group", msg: "accept")` +54. 拒绝好友添加请求 `globalThis.Smack.rejectFriends("444@"+Constant.HOST_DOMAIN, “reject”)` + + +## 兼容性 +支持 OpenHarmony API version 9 及以上版本。 + +## 目录结构 +``` +|---- smack +| |---- entry # 示例代码文件夹 +| |---- smack # smack库文件夹 +| |----cpp # C++代码文件夹 +| |----gloox # C++代码实现文件夹 +| |----types # 对外接口 +| |----ets # 对外接口 +| |---- index.ets # 对外接口 +| |---- README.MD # 安装使用方法 +``` + +## 贡献代码 +使用过程中发现任何问题都可以提 [Issue](https://gitee.com/hihopeorg/smack/issues) 给我们,当然,我们也非常欢迎你给我们发 [PR](https://gitee.com/hihopeorg/smack/pulls) 。 + +## 开源协议 +本项目基于 [Apache License 2.0](https://gitee.com/hihopeorg/smack/blob/master/LICENSE) ,请自由地享受和参与开源。 \ No newline at end of file diff --git a/smack/build-profile.json5 b/smack/build-profile.json5 new file mode 100644 index 00000000..74fa02ce --- /dev/null +++ b/smack/build-profile.json5 @@ -0,0 +1,30 @@ +{ + "app": { + "compileSdkVersion": 9, + "compatibleSdkVersion": 9, + "products": [ + { + "name": "default", + "signingConfig": "default", + } + ] + }, + "modules": [ + { + "name": "entry", + "srcPath": "./entry", + "targets": [ + { + "name": "default", + "applyToProducts": [ + "default" + ] + } + ] + }, + { + "name": "smack", + "srcPath": "./smack" + } + ] +} \ No newline at end of file diff --git a/smack/entry/.gitignore b/smack/entry/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/smack/entry/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/smack/entry/build-profile.json5 b/smack/entry/build-profile.json5 new file mode 100644 index 00000000..7dc37bb9 --- /dev/null +++ b/smack/entry/build-profile.json5 @@ -0,0 +1,13 @@ +{ + "apiType": 'stageMode', + "buildOption": { + }, + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} \ No newline at end of file diff --git a/smack/entry/hvigorfile.js b/smack/entry/hvigorfile.js new file mode 100644 index 00000000..d7720ee6 --- /dev/null +++ b/smack/entry/hvigorfile.js @@ -0,0 +1,2 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').hapTasks diff --git a/smack/entry/package.json b/smack/entry/package.json new file mode 100644 index 00000000..965eb2e1 --- /dev/null +++ b/smack/entry/package.json @@ -0,0 +1,16 @@ +{ + "license":"GPL", + "devDependencies":{}, + "name":"entry", + "ohos":{ + "org":"huawei", + "directoryLevel":"module", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{ + "@ohos/smack":"file:../smack" + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/Application/AbilityStage.ts b/smack/entry/src/main/ets/Application/AbilityStage.ts new file mode 100644 index 00000000..3fc89995 --- /dev/null +++ b/smack/entry/src/main/ets/Application/AbilityStage.ts @@ -0,0 +1,17 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import AbilityStage from "@ohos.application.AbilityStage" + +export default class MyAbilityStage extends AbilityStage { + onCreate() { + console.log("[Demo] MyAbilityStage onCreate") + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/MainAbility/MainAbility.ts b/smack/entry/src/main/ets/MainAbility/MainAbility.ts new file mode 100644 index 00000000..0601cc4c --- /dev/null +++ b/smack/entry/src/main/ets/MainAbility/MainAbility.ts @@ -0,0 +1,43 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import Ability from '@ohos.application.Ability' +import { Smack } from '@ohos/smack' + +export default class MainAbility extends Ability { + onCreate(want, launchParam) { + console.log("[Demo] MainAbility onCreate") + globalThis.abilityWant = want; + + globalThis.Smack = Smack; + } + + onDestroy() { + console.log("[Demo] MainAbility onDestroy") + } + + onWindowStageCreate(windowStage) { + console.log("[Demo] MainAbility onWindowStageCreate") +// windowStage.setUIContent(this.context, "pages/page", null) + windowStage.setUIContent(this.context, "pages/index", null) + } + + onWindowStageDestroy() { + console.log("[Demo] MainAbility onWindowStageDestroy") + } + + onForeground() { + console.log("[Demo] MainAbility onForeground") + } + + onBackground() { + console.log("[Demo] MainAbility onBackground") + } +}; diff --git a/smack/entry/src/main/ets/entity/ChatContentEntity.ts b/smack/entry/src/main/ets/entity/ChatContentEntity.ts new file mode 100644 index 00000000..db5196bb --- /dev/null +++ b/smack/entry/src/main/ets/entity/ChatContentEntity.ts @@ -0,0 +1,31 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +export class ChatContentEntity { + constructor(author?: string, message?: string, messageType?: number, isTip?: boolean) { + if (author) { + this.author = author + } + if (message) { + this.message = message + } + if (messageType) { + this.messageType = messageType + } + if (isTip) { + this.isTip = isTip + } + } + + author: string = '' // 用户 + message: string = '' // 消息体 + messageType: number = 1 // 消息类型 1文本 2图片 3语音 4视频 + isTip: boolean = false // 是否是提示文字 +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/entity/Constant.ts b/smack/entry/src/main/ets/entity/Constant.ts new file mode 100644 index 00000000..2af1a60a --- /dev/null +++ b/smack/entry/src/main/ets/entity/Constant.ts @@ -0,0 +1,22 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +export class Constant { + static HOST_IP: string = "10.50.40.43" + static HOST_DOMAIN: string = "he-202101111234" + static SERVICE_NAME: string = "conference" + static HOST_RES: string = "/gloox" + static HOST_PORT: number = 5222 +} + + + + + diff --git a/smack/entry/src/main/ets/pages/base/ItemInput.ets b/smack/entry/src/main/ets/pages/base/ItemInput.ets new file mode 100644 index 00000000..967e4bb3 --- /dev/null +++ b/smack/entry/src/main/ets/pages/base/ItemInput.ets @@ -0,0 +1,39 @@ +@Component +export struct ItemInput { + title: string | Resource = "" + @Link value: string + typeStr: string = "1" //1:Normal,2:Password,3:Email,4:Number + radio: boolean = false + widthStr: string = '30%' + widthInput: string = '65%' + @Link val: string + selectDialog: () => void + + build() { + Column() { + Row() { + Text(this.title).width(this.widthStr).height('100%').fontSize(18) + if (!this.radio) { + TextInput({ text: this.value, placeholder: '请输入' }) + .type( + this.typeStr == "1" ? InputType.Normal : this.typeStr == "2" ? InputType.Password : this.typeStr == "3" ? InputType.Email : InputType.Number + ) + .width(this.widthInput) + .fontSize(18) + .textAlign(TextAlign.End) + .onChange(v => { + this.value = v + }) + } else { + Text(this.val).width(this.widthInput).fontSize(18).textAlign(TextAlign.End) + .onClick(v => { + this.selectDialog() + }) + } + } + .padding({ left: 15 }).height(54) + .width('100%') + }.height(55).backgroundColor(Color.White).width("100%").margin({ top: 1 }) + } +} + diff --git a/smack/entry/src/main/ets/pages/base/ItemText.ets b/smack/entry/src/main/ets/pages/base/ItemText.ets new file mode 100644 index 00000000..3dc9531e --- /dev/null +++ b/smack/entry/src/main/ets/pages/base/ItemText.ets @@ -0,0 +1,36 @@ +@Component +export struct ItemText { + title: string = '' + content: string = '' + clickEvent: () => void + + build() { + Column() { + Column() { + Row() { + Text(this.title) + .fontSize(15) + .width(this.content == '' ? '85%' : '60%') + .height(50) + .fontColor(Color.Black) + .onClick(v => { + this.clickEvent() + }) + Text(this.content) + .fontSize(15) + .width(this.content == '' ? '0' : '30%') + .padding({ right: 20 }) + .height(50) + .textAlign(TextAlign.End) + .alignSelf(ItemAlign.Center) + .fontColor(Color.Black) + } + + Line().width('100%').height(1).backgroundColor('#ececec').margin({ left: 20 }) + } + .padding({ left: 15 }).height(54) + .width('100%') + }.height(55).backgroundColor(Color.White).width("100%").margin({ top: 1 }) + } +} + diff --git a/smack/entry/src/main/ets/pages/base/SelectDialog.ets b/smack/entry/src/main/ets/pages/base/SelectDialog.ets new file mode 100644 index 00000000..30abf78c --- /dev/null +++ b/smack/entry/src/main/ets/pages/base/SelectDialog.ets @@ -0,0 +1,32 @@ +@CustomDialog +export struct SelectDialog { + controller: CustomDialogController + @Link vue: string + options: any = [] + + build() { + Column() { + List({ }) { + ForEach(this.options, (item) => { + ListItem() { + Text(item.label) + .width('100%') + .height(50) + .fontSize(16) + .textAlign(TextAlign.Center) + .borderRadius(10) + .backgroundColor(0xFFFFFF) + }.editable(true).onClick(v => { + this.vue = item.label + this.controller.close() + }) + }, item => item.label) + }.height(50 * this.options.length) .width('100%') + .listDirection(Axis.Vertical) // 排列方向 + } + .height(50 * this.options.length) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('60%') + } +} diff --git a/smack/entry/src/main/ets/pages/base/Switches.ets b/smack/entry/src/main/ets/pages/base/Switches.ets new file mode 100644 index 00000000..0d510aa8 --- /dev/null +++ b/smack/entry/src/main/ets/pages/base/Switches.ets @@ -0,0 +1,43 @@ +@Component +@Preview +export struct Switches { + isOn: string + title: string | Resource = "" + isEnable: boolean = true + onToggleChange: (isOn: string) => void + + build() { + Column() { + Row() { + Column() { + Text(this.title) + .fontColor(Color.Black) + .width('100%') + .fontSize(18) + .opacity(0.9) + } + .padding({ top: px2vp(5), bottom: px2vp(5) }) + .alignItems(HorizontalAlign.Start) + .layoutWeight(1) + + Toggle({ type: ToggleType.Switch, isOn: this.isOn == "1" }) + .selectedColor('#1d85f6') + .align(Alignment.Center) + .switchPointColor('#F1F3F5') + .size({ width: px2vp(36), height: px2vp(20) }) + .onChange((isOn: boolean) => { + if (this.isEnable) { + //@ts-ignore + this.isOn = isOn == "1" ? "1" :"0" + this.onToggleChange(this.isOn) + } + }) + .margin({ right: 40 }) + + } + .padding({ left: 15 }).height(54) + .width('100%') + }.height(55).backgroundColor(Color.White).width("100%").margin({ top: 1 }) + + } +} diff --git a/smack/entry/src/main/ets/pages/base/toolbar.ets b/smack/entry/src/main/ets/pages/base/toolbar.ets new file mode 100644 index 00000000..3603048d --- /dev/null +++ b/smack/entry/src/main/ets/pages/base/toolbar.ets @@ -0,0 +1,64 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import router from '@ohos.router'; + +@Component +@Preview +export struct Toolbar { + title: string = 'title' + isBack: boolean = false + rightText: string + rightIcon: Resource | string = '' + rightClickCallBack: () => void + + build() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Start }) { + Column() { + Image($r("app.media.back")).width(px2vp(40)).height(px2vp(40)) + .margin({ left: 20 }) + } + .padding(10) + .visibility(this.isBack ? Visibility.Visible : Visibility.Hidden) + .onClick(e => { + router.back() + }) + } + .width('20%') + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) { + Text(this.title).fontSize(px2fp(35)).fontColor('white') + } + .width('60%') + + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.End, justifyContent: FlexAlign.End }) { + Stack() { + Text('').visibility(Visibility.Hidden) + if (this.rightText != '') { + Text(this.rightText).fontSize(px2fp(30)).fontColor('white') + } + if (this.rightIcon != '') { + Image(this.rightIcon).width(px2vp(40)).height(px2vp(40)) + .margin({ right: 20 }) + } + } + .padding(10) + .onClick(e => { + this.rightClickCallBack() + }) + } + .width('30%') + } + .width('100%') + .height(px2vp(100)) + .backgroundColor('#ff56ae97') + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/chat/group_chat/group_all_member.ets b/smack/entry/src/main/ets/pages/chat/group_chat/group_all_member.ets new file mode 100644 index 00000000..bdc7304f --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/group_chat/group_all_member.ets @@ -0,0 +1,158 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import { MUCOperation } from '@ohos/smack' +@Entry +@Component +struct Group_all_member { + @State allList: Array<{ + name: string, + isCheck: number + }> = [] + @State adminList: Array = [] + @State roomName: string = '' + @State memberNumber:number=0 + @State IsBatch: boolean = false + @State rightTxt: string = '批量操作' + + aboutToAppear() { + this.onGetAllMemberFriends() + this.onGetAllAdminFriends() + } + + // todo 查看所有群成员 + onGetAllMemberFriends() { + this.allList = [] + let roomitems: Array = JSON.parse(globalThis.Smack.getRoomItems()) + for (var index = 0; index < roomitems.length; index++) { + let str = roomitems[index].room.replace(" ", "") + str = str.substr(str.lastIndexOf("/") + 1, str.length - 1) + this.allList.push({ name: str, isCheck: 0 }); + this.memberNumber=this.allList.length + } + } + // todo 查看所有群管理 + onGetAllAdminFriends() { + this.adminList = [] + let roomitems = globalThis.Smack.requestList(MUCOperation.RequestAdminList) + let items=JSON.parse(roomitems) + for (var index = 0; index < items.length; index++) { + let str = items[index].jid.replace(" ", "") + this.adminList.push(str); + } + } + + onGetOperations(): Array{ + let users = [] + for (var index = 0; index < this.allList.length; index++) { + const element = this.allList[index]; + if (element.isCheck == 1) { + users.push(element) + } + } + return users + } + + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '群成员', + isBack: true, + }) + Text("管理员") + .width('100%') + .fontSize(18) + .alignSelf(ItemAlign.Center) + .backgroundColor(Color.White) + .height(40) + .padding({ left: 20 }) + List() { + ForEach(this.adminList, item => { + ListItem() { + Text(item) + .padding(13) + .backgroundColor('#ffffff') + .fontSize(18) + .width('100%') + .margin({ top: 1 }) + .onClick(v => { + router.push({ + url: 'pages/chat/group_chat/group_member', + params: { userData: [item] } + }) + }) + } + }, item => item.toString()) + } + + Row() { + + Text("成员 ("+this.memberNumber+")") + .width('60%') + .fontSize(18) + .alignSelf(ItemAlign.Center) + .backgroundColor(Color.White) + .height(40) + .padding({ left: 20 }) + Text(this.IsBatch ? "完成" : "批量操作") + .height(40) + .padding({ right: 20 }) + .fontSize(18) + .backgroundColor(Color.White) + .width('40%') + .alignSelf(ItemAlign.Center) + .textAlign(TextAlign.End) + .onClick(v => { + if (this.IsBatch) { + router.push({ + url: 'pages/chat/group_chat/group_member', + params: { userData: this.onGetOperations() } + }) + } + this.IsBatch = !this.IsBatch + }) + } + + List() { + ForEach(this.allList, item => { + ListItem() { + Row() { + if (this.IsBatch) { + Checkbox({ name: 'checkbox2', group: 'checkboxGroup' }) + .select(false) + .selectedColor(0x39a2db) + .onChange((value: boolean) => { + console.info('Checkbox2 change is' + value) + item.isCheck = value + }) + } + Text(item.name) + .padding(13) + .fontSize(18) + .width('100%') + .margin({ top: 1 }) + .onClick(v => { + router.push({ + url: 'pages/chat/group_chat/group_member', + params: { userData: [item] } + }) + }) + } + + }.backgroundColor('#ffffff') + }, item => item.name) + } + } + .backgroundColor('#ececec') + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_edit.ets b/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_edit.ets new file mode 100644 index 00000000..e5a69a67 --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_edit.ets @@ -0,0 +1,315 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import prompt from '@ohos.prompt'; +import { Switches } from '../../base/Switches'; +import { ItemInput } from '../../base/ItemInput'; +import { RoomConfig } from '@ohos/smack' +import { SelectDialog } from '../../base/SelectDialog' + +@Entry +@Component +struct Group_chat_edit { + @State temp: string = '' + @State JidVal: string = '任何人' + @State PrivateVal: string = '任何人' + @State roomName: string = '' + @State roomDesc: string = '' + @State roomMaxusers: string = '' + @State roomPassword: string = '' + @State roomAdmins: string = '' + @State roomOwners: string = '' + @State roomPresencebroadcast: Array = [] + @State whois_options: Array<{ + label: string, + value: string + }> = [ + { + "label": "任何人", + "value": "anyone" + }, + { + "label": "审核者", + "value": "moderators" + } + ] + @State allowpm_options: Array<{ + label: string, + value: string + }> = [ + { + "label": "任何人", + "value": "anyone" + }, + { + "label": "参与者", + "value": "participants" + }, + { + "label": "审核者", + "value": "moderators" + }, + { + "label": "无", + "value": "none" + } + ] + public roomConfig: RoomConfig + scroller: Scroller = new Scroller() + allowpm_selectDialog: CustomDialogController = new CustomDialogController({ + builder: SelectDialog({ + vue: $PrivateVal, + options: this.allowpm_options + }), + customStyle: true, + alignment: DialogAlignment.Center, + }) + whois_selectDialog: CustomDialogController = new CustomDialogController({ + builder: SelectDialog({ + vue: $JidVal, + options: this.whois_options, + }), + customStyle: true, + alignment: DialogAlignment.Center, + }) + + aboutToAppear() { + this.getRoomConfig() + } + + switchAllowpm(str: string) { + switch (str) { + case "anyone": + this.PrivateVal = "任何人" + break + case "participants": + this.PrivateVal = "参与者" + break + case "moderators": + this.PrivateVal = "审核者" + break + case "none": + this.PrivateVal = "无" + break + } + } + + switchAllowpmStr(str: string): string{ + let val = 'anyone' + switch (str) { + case "任何人": + val = "anyone" + break + case "参与者": + val = "participants" + break + case "审核者": + val = "moderators" + break + case "无": + val = "none" + break + } + return val + } + + public getRoomConfig() { + this.roomConfig = JSON.parse(globalThis.Smack.getRoomConfig()); + this.JidVal = this.roomConfig.whois == "anyone" ? "任何人" : "审核者" + this.switchAllowpm(this.roomConfig.allowpm) + this.roomName = this.roomConfig.roomname + this.roomDesc = this.roomConfig.roomdesc + this.roomMaxusers = this.roomConfig.maxusers + this.roomPassword = this.roomConfig.roomsecret + this.roomAdmins = this.roomConfig.roomadmins + this.roomOwners = this.roomConfig.roomowners + this.roomPresencebroadcast = this.roomConfig.presencebroadcast + console.info('Checkbox-----------//' + JSON.stringify(this.roomPresencebroadcast)) + } + + //todo 修改房间配置 + updateRoomConfig() { + this.roomConfig.allowpm = this.switchAllowpmStr(this.PrivateVal) + this.roomConfig.whois = (this.JidVal == "任何人") ? "anyone" : "moderators" + this.roomConfig.roomname = this.roomName + this.roomConfig.roomdesc = this.roomDesc + this.roomConfig.maxusers = this.roomMaxusers + this.roomConfig.roomsecret = this.roomPassword + this.roomConfig.roomadmins = this.roomAdmins + this.roomConfig.roomowners = this.roomOwners + this.roomConfig.presencebroadcast = this.roomPresencebroadcast + this.roomConfig.passwordprotectedroom = this.roomPassword != '' ? '0' : '1' + globalThis.Smack.setRoomConfig(JSON.stringify(this.roomConfig)) + prompt.showToast({ message: "更新成功" }) + setTimeout(() => { + router.back() + }, 500) + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + isBack: true, + title: '房间配置', + rightText: '保存', + rightClickCallBack: () => { + this.updateRoomConfig() + } + }) + Scroll(this.scroller) { + Column() { + ItemInput({ title: "房间名称", value: $roomName, val: $temp }) + ItemInput({ title: "房间描述", value: $roomDesc, val: $temp }) + ItemInput({ + title: "房间最大人数", + value: $roomMaxusers, + val: $temp, + typeStr: "4" + }) + ItemInput({ + title: "密码", + value: $roomPassword, + typeStr: "2", + val: $temp + }) + ItemInput({ + title: "能够发现成员真实 JID 的角色", + widthStr: '65%', + widthInput: '30%', + value: $temp, + val: $JidVal, + radio: true, + selectDialog: () => { + this.whois_selectDialog.open() + } + }) + ItemInput({ + title: "Allowed to Send Private Messages", + widthStr: '65%', + widthInput: '30%', + value: $temp, + val: $PrivateVal, + radio: true, + selectDialog: () => { + this.allowpm_selectDialog.open() + } + }) + ItemInput({ + title: "房间管理员", + widthStr: '30%', + widthInput: '65%', + value: $roomAdmins, + val: $temp, + radio: false, + selectDialog: () => { + this.allowpm_selectDialog.open() + } + }) + ItemInput({ + title: "房间拥有者", + widthStr: '30%', + widthInput: '65%', + value: $roomOwners, + val: $temp, + radio: false, + selectDialog: () => { + this.allowpm_selectDialog.open() + } + }) + Row() { + Text("广播其存在的角色").width('35%').height('100%').fontSize(18) + Row() { + Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) + .select(this.roomPresencebroadcast.indexOf("moderator") == 0) + .selectedColor(0x39a2db) + .onChange((value: boolean) => { + let that = this + console.info('Checkbox1 change is' + value) + // @ts-ignore + this.roomPresencebroadcast[0] = value == 1 ? 'moderator' : '' + + }) + Text("审核者").fontSize(16) + Checkbox({ name: 'checkbox2', group: 'checkboxGroup' }) + .select(this.roomPresencebroadcast.indexOf("participant") == 1) + .selectedColor(0x39a2db) + .onChange((value: boolean) => { + console.info('Checkbox2 change is' + value) + // @ts-ignore + this.roomPresencebroadcast[1] = value == 1 ? 'participant' : '' + }) + Text("参与者").fontSize(16) + Checkbox({ name: 'checkbox3', group: 'checkboxGroup' }) + .select(this.roomPresencebroadcast.indexOf("visitor") == 2) + .selectedColor(0x39a2db) + .onChange((value: boolean) => { + console.info('Checkbox3 change is' + value) + // @ts-ignore + this.roomPresencebroadcast[2] = value == 1 ? 'visitor' : '' + }) + Text("访客").fontSize(16) + }.width('55%').justifyContent(FlexAlign.End) + } + .padding({ left: 15 }) + .height(54) + .backgroundColor(Color.White) + .margin({ top: 1 }) + .width('100%') + + Switches({ isOn: this.roomConfig.publicroom, title: '在目录中列出房间', onToggleChange: (HisOn) => { + this.roomConfig.publicroom = HisOn + } }) + Switches({ isOn: this.roomConfig.persistentroom, title: '永久房间', onToggleChange: (HisOn) => { + this.roomConfig.persistentroom = HisOn + } }) + Switches({ isOn: this.roomConfig.membersonly, title: '房间仅对成员开放', onToggleChange: (HisOn) => { + this.roomConfig.membersonly = HisOn + } }) + Switches({ isOn: this.roomConfig.moderatedroom, title: '房间需要审核', onToggleChange: (HisOn) => { + this.roomConfig.moderatedroom = HisOn + } }) + Switches({ isOn: this.roomConfig.allowinvites, title: '允许成员邀请其他人进群', onToggleChange: (HisOn) => { + this.roomConfig.allowinvites = HisOn + } }) + Switches({ isOn: this.roomConfig.changesubject, title: '允许成员更改主题', onToggleChange: (HisOn) => { + this.roomConfig.changesubject = HisOn + } }) + Switches({ isOn: this.roomConfig.reservednick, title: '仅允许注册昵称登陆', onToggleChange: (HisOn) => { + this.roomConfig.reservednick = HisOn + } }) + Switches({ isOn: this.roomConfig.canchangenick, title: '允许成员修改昵称', onToggleChange: (HisOn) => { + this.roomConfig.canchangenick = HisOn + } }) + Switches({ isOn: this.roomConfig.canchangenick, title: '允许成员注册房间', onToggleChange: (HisOn) => { + this.roomConfig.canchangenick = HisOn + } }) + Switches({ isOn: this.roomConfig.enablelogging, title: '记录房间聊天', onToggleChange: (HisOn) => { + this.roomConfig.enablelogging = HisOn + } }) + + } + }.scrollable(ScrollDirection.Vertical).scrollBar(BarState.On) + + } + .width('100%') + .backgroundColor('#ececec') + } + + // todo 退出群聊 + onExitGroup() { + //销毁房间,群主可调用 + globalThis.Smack.destroy(globalThis.userName, "123"); + } +} + + + diff --git a/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_main.ets b/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_main.ets new file mode 100644 index 00000000..3e2a4ea0 --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_main.ets @@ -0,0 +1,165 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import { ChatContentEntity } from '../../../entity/ChatContentEntity' + +@Entry +@Component +struct Group_chat_main { + @State chatContentList: Array = [] + @State inputMessage: string = '' + @State roomName: string = '' + @State isJoin: number = 0 //0-false,1-true + aboutToAppear() { + globalThis.Smack.registerGroupMessageCallback((id, msg) => { + this.chatContentList.push(new ChatContentEntity(id == '222' ? '1' : id, msg, 1)) + }) + globalThis.Smack.registerMUCParticipantPresenceListener((name:string,jsonStr: string) => { + let obj=JSON.parse(jsonStr) + switch (obj.flags) { + case '1': + this.chatContentList.push(new ChatContentEntity(name, name + "操作成功", 1, true)) + break; + case '2': + this.chatContentList.push(new ChatContentEntity(name, name + "修改了昵称", 1, true)) + break; + case '3': + this.chatContentList.push(new ChatContentEntity(name, name + "被踢出了群聊", 1, true)) + break; + case '4': + this.chatContentList.push(new ChatContentEntity(name, name + "被群聊屏蔽了", 1, true)) + break; + + } + // switch (presenceType) { + // case "0": + // this.chatContentList.push(new ChatContentEntity(name, name + "进入了房间", 1, true)) + // break + // case "1": + // this.chatContentList.push(new ChatContentEntity(name, name + "状态空闲", 1, true)) + // break + // case "2": + // this.chatContentList.push(new ChatContentEntity(name, name + "离开了", 1, true)) + // break + // case "3": + // this.chatContentList.push(new ChatContentEntity(name, name + "状态变更为请勿打扰", 1, true)) + // break + // case "4": + // this.chatContentList.push(new ChatContentEntity(name, name + "长时间离线了", 1, true)) + // break + // case "5": + // this.chatContentList.push(new ChatContentEntity(name, name + "离开了房间", 1, true)) + // break + // case "9": + // this.chatContentList.push(new ChatContentEntity(name, name + "的状态发生变化", 1, true)) + // break + // } + }) + this.isJoin = globalThis.Smack.isJoined() + if (this.isJoin == 0) { + globalThis.Smack.join(); + } + globalThis.roomInfo = globalThis.Smack.parseXML() + let roominfo = JSON.parse(globalThis.roomInfo) + this.roomName = roominfo.description + } + + aboutToDisappear() { + globalThis.Smack.leave("leave msg"); + } + + onPageShow() { + + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: this.roomName, + isBack: true, + rightIcon: $r('app.media.more'), + rightClickCallBack: () => { + router.push({ + url: "pages/chat/group_chat/group_chat_setting" + }) + } + }) + + Stack({ alignContent: Alignment.Bottom }) { + List() { + ForEach(this.chatContentList, item => { + ListItem() { + Flex({ direction: FlexDirection.Column }) { + if (item.isTip) { + Column() { + Text(item.message) + .fontSize(13) + .textAlign(TextAlign.Center) + .backgroundColor('#ffe2e2e2') + .padding({ left: 10, right: 10, top: 5, bottom: 5 }) + .borderRadius(10) + }.width('100%') + } else { + Flex({ justifyContent: item.author == '1' ? FlexAlign.End : FlexAlign.Start }) { + Flex({ direction: FlexDirection.Column }) { + Text(item.author == '1' ? '我' : item.author) + .fontSize(15) + .padding(5) + .alignSelf(item.author == '1' ? ItemAlign.End : ItemAlign.Start) + if (item.messageType == 1) { + Text(item.message) + .backgroundColor(item.author != '1' ? '#ffffff' : '#95ec69') + .padding({ left: 15, top: 10, right: 15, bottom: 10 }) + .alignSelf(ItemAlign.End) + .fontSize(18) + .borderRadius(10) + } else if (item.messageType == 2) { + Image(item.message) + .objectFit(ImageFit.Cover) + .width('50%') + } + } + } + } + } + } + .padding(10) + }, item => item.toString()) + } + .margin({ bottom: px2vp(60) }) + .height('100%') + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + TextInput({ placeholder: '请输入', text: this.inputMessage }).onChange(v => { + this.inputMessage = v + }) + Button('发 送').width(100).margin({ left: 8 }) + .onClick(e => { + this.onSendGroupMessage() + }) + } + .height(px2vp(100)) + .width('100%') + .padding({ left: 15, right: 15 }) + .backgroundColor('#ffffff') + } + } + .height('100%') + .backgroundColor('#ececec') + } + + // todo 发送群聊信息 + onSendGroupMessage() { + globalThis.Smack.sendGroupMessage(this.inputMessage); + this.inputMessage = "" + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_setting.ets b/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_setting.ets new file mode 100644 index 00000000..c92afa9b --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/group_chat/group_chat_setting.ets @@ -0,0 +1,231 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import prompt from '@ohos.prompt'; +import { ItemText } from '../../base/ItemText'; +import { Constant } from '../../../entity/Constant'; + +@Entry +@Component +struct Group_chat_setting { + @State name:string="" + InviteDialog: CustomDialogController = new CustomDialogController({ + builder: InviteDialog({}), + customStyle: true, + alignment: DialogAlignment.Center, + }) + updateThemeDialog: CustomDialogController = new CustomDialogController({ + builder: UpdateThemeDialog({}), + customStyle: true, + alignment: DialogAlignment.Center, + }) + updateNickDialog: CustomDialogController = new CustomDialogController({ + builder: UpdateNickDialog({nick:$name}), + customStyle: true, + alignment: DialogAlignment.Center, + }) + aboutToAppear(){ + this.name = globalThis.Smack.nick(); + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + isBack: true, + title: '群聊设置', + }) + ItemText({title:"查看所有群成员",clickEvent:()=>{ + router.push({ + url: 'pages/chat/group_chat/group_all_member' + }) + }}) + ItemText({title:"编辑房间配置",clickEvent:()=>{ + router.push({ + url: 'pages/chat/group_chat/group_chat_edit' + }) + }}) + ItemText({title:"邀请新用户",clickEvent:()=>{ + this.InviteDialog.open() + }}) + ItemText({title:"修改房间主题",clickEvent:()=>{ + this.updateThemeDialog.open() + }}) + + Column() { + Row(){ + Text("我在群聊中的昵称") + .fontSize(15) + .width('60%') + .height(50) + .fontColor(Color.Black) + .onClick(v => { + this.updateNickDialog.open() + }) + Text(this.name) + .fontSize(15) + .width('30%') + .padding({ right: 20 }) + .height(50) + .textAlign(TextAlign.End) + .alignSelf(ItemAlign.Center) + .fontColor(Color.Black) + + } + Line().width('100%').height(1).backgroundColor('#ececec').margin({ left: 20 }) + } + .padding({ left: 15 }).height(54) + .width('100%').backgroundColor(Color.White) + + + Button('退 出 群 聊').backgroundColor('red').margin({ top: 30 }) + .onClick(e => { + this.onExitGroup() + }) + } + .width('100%') + } + + // todo 退出群聊 + onExitGroup() { + //销毁房间,群主可调用 + globalThis.Smack.destroy(globalThis.userName, "123"); + } +} +@CustomDialog +struct UpdateThemeDialog { + controller: CustomDialogController + @State theme: string = '' + + // todo 修改主题 + private onChangTheme() { + if (this.theme == '') { + prompt.showToast({ + message: "请输入新的群聊主题" + }) + } + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Text('请输入群聊主题') + .height(40) + .fontSize(15).padding(10) + TextInput() + .height(40) + .fontSize(15) + .onChange(v => { + this.theme = v + }) + + Button('确定') + .height(40) + .fontSize(15) + .onClick(e => { + globalThis.Smack.setSubject("subject"); + // this.onChangTheme() + this.controller.close() + + }).margin({ top: 20 }) + } + .padding(20) + .height(180) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } +} +@CustomDialog +struct UpdateNickDialog { + controller: CustomDialogController + nickStr: string='' + @Link nick: string + // todo 修改昵称 + private onChangTheme() { + if (this.nickStr == '') { + prompt.showToast({ + message: "请输入新的群内昵称" + }) + } + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Text('请输入群内昵称') + .height(40) + .fontSize(15).padding(10) + TextInput({}) + .height(40) + .fontSize(15) + .onChange(v => { + this.nickStr = v + }) + + Button('确定') + .height(40) + .fontSize(15) + .onClick(e => { + globalThis.Smack.setNick(this.nickStr) + this.nick=this.nickStr + this.controller.close() + }).margin({ top: 20 }) + } + .padding(20) + .height(180) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } +} + +@CustomDialog +struct InviteDialog { + controller: CustomDialogController + @State invite: string = '' + + // todo 邀请新用户 + private onChangTheme() { + if (this.invite == '') { + prompt.showToast({ + message: "请输入被邀请用户名" + }) + } + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Text('请输入被邀请用户名') + .height(40) + .fontSize(15).padding(10) + TextInput() + .height(40) + .fontSize(15) + .onChange(v => { + this.invite = v + }) + + Button('确定') + .height(40) + .fontSize(15) + .onClick(e => { + globalThis.Smack.invite(this.invite+"@"+Constant.HOST_DOMAIN+Constant.HOST_RES, "invite"); + // this.onChangTheme() + this.controller.close() + + }).margin({ top: 20 }) + } + .padding(20) + .height(180) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } +} diff --git a/smack/entry/src/main/ets/pages/chat/group_chat/group_member.ets b/smack/entry/src/main/ets/pages/chat/group_chat/group_member.ets new file mode 100644 index 00000000..61c8f4ea --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/group_chat/group_member.ets @@ -0,0 +1,232 @@ +import { Toolbar } from '../../base/toolbar' +import { ItemText } from '../../base/ItemText' + +import { MUCRoomAffiliation, MUCRoomRole } from '@ohos/smack' +import { PresenceRoomType } from '@ohos/smack' +import router from '@ohos.router'; + +@Entry +@Component +struct group_all_member { + @State isAdministrator: boolean = false //是否为管理员 + @State isMember: boolean = false //是否为会员 + @State isOwner: boolean = false //是否为群主 + @State isBanned: boolean = false //是否禁言 + @State isCompere: boolean = false //是否为主持人 + private states: string[] = ['在线', '空闲', '离开', '请勿打扰', '长时间离开', '离线'] + @State select: number = 0 + @State users: Array<{ + name: string, + isCheck: number + }> = [] + + // todo 设置用户在线状态 + private onSetOnLineState() { + let presenceType: PresenceRoomType = PresenceRoomType.Available + let state = 'Available' + if (this.select == 0) { + state = 'Available' + presenceType = PresenceRoomType.Available + } else if (this.select == 1) { + state = 'Chat' + presenceType = PresenceRoomType.Chat + } else if (this.select == 2) { + state = 'Away' + presenceType = PresenceRoomType.Away + } else if (this.select == 3) { + state = 'DND' + presenceType = PresenceRoomType.DND + } else if (this.select == 4) { + state = 'XA' + presenceType = PresenceRoomType.XA + } else if (this.select == 5) { + state = 'Unavailable' + presenceType = PresenceRoomType.Unavailable + } + globalThis.Smack.setPresence(presenceType, state) + } + + public aboutToAppear() { + this.users = router.getParams()['userData'] + } + + public getUsers(): string{ + let str = "" + for (var i = 0;i < this.users.length; i++) { + let item = this.users[i] + str = str.concat(item.name) + if (i != this.users.length - 1) + str = str.concat(",") + } + return str + } + + build() { + Column() { + Toolbar({ + title: '', + isBack: true + }) + Row() { + List({}) { + ForEach(this.users, (item) => { + ListItem() { + Row() { + Image($r('app.media.app_icon')).height(60).width(60).borderRadius(10) + Text(item.name) + .padding(13) + .backgroundColor('#ffffff') + .fontSize(18) + } + }.editable(true) + }, item => item.name) + }.width('100%') + .listDirection(Axis.Horizontal) // 排列方向 + + }.height(100).margin({ left: 20, top: 20 }) + + ItemText({ title: "踢出群聊", clickEvent: () => { + if (this.users.length == 1) { + globalThis.Smack.kick(this.users[0].name, "kick"); + } else { + globalThis.Smack.bans(this.getUsers(), "bans"); + } + router.back() + } }) + + ItemText({ title: "加入黑名单", clickEvent: () => { + globalThis.Smack.ban(this.users[0].name, "ban"); + } }) + + if (this.isCompere) { + + ItemText({ title: "撤销设为主持人", clickEvent: () => { + this.isCompere = !this.isCompere + if (this.users.length > 1) { + globalThis.Smack.setRoles(this.getUsers(), MUCRoomRole.RoleParticipant, "RoleParticipant"); + } else { + globalThis.Smack.setRole(this.users[0].name, MUCRoomRole.RoleParticipant, "RoleParticipant"); + } + } }) + + } else { + ItemText({ title: "设为主持人", clickEvent: () => { + this.isCompere = !this.isCompere + if (this.users.length > 1) { + globalThis.Smack.setRoles(this.getUsers(), MUCRoomRole.RoleModerator, "RoleModerator"); + } else { + globalThis.Smack.setRole(this.users[0].name, MUCRoomRole.RoleModerator, "RoleModerator"); + } + } }) + } + ItemText({ title: "设置用户状态", clickEvent: () => { + TextPickerDialog.show({ + range: this.states, + selected: this.select, + onAccept: (value: TextPickerResult) => { + this.select = value.index + this.onSetOnLineState() + } + }) + } }) + + if (this.isAdministrator) { + + ItemText({ title: "撤销管理员身份", clickEvent: () => { + this.isAdministrator = !this.isAdministrator + if (this.users.length > 1) { + globalThis.Smack.setAffiliations(this.getUsers(), MUCRoomAffiliation.AffiliationNone, "AffiliationNone"); + } else { + globalThis.Smack.setAffiliation(this.users[0].name, MUCRoomAffiliation.AffiliationNone, "AffiliationNone"); + } + } }) + + } else { + ItemText({ title: "设置为群管理员", clickEvent: () => { + this.isAdministrator = !this.isAdministrator + if (this.users.length > 1) { + globalThis.Smack.setAffiliations(this.getUsers(), MUCRoomAffiliation.AffiliationAdmin, "AffiliationAdmin"); + } else { + globalThis.Smack.setAffiliation(this.users[0].name, MUCRoomAffiliation.AffiliationAdmin, "AffiliationAdmin"); + } + } }) + + } + if (this.isMember) { + ItemText({ title: "取消会员身份", clickEvent: () => { + this.isMember = !this.isMember + if (this.users.length > 1) { + globalThis.Smack.setAffiliations(this.getUsers(), MUCRoomAffiliation.AffiliationNone, "AffiliationNone"); + } else { + globalThis.Smack.setAffiliation(this.users[0].name, MUCRoomAffiliation.AffiliationNone, "AffiliationNone"); + } + } }) + + } else { + ItemText({ title: "设为会员", clickEvent: () => { + this.isMember = !this.isMember + if (this.users.length > 1) { + globalThis.Smack.setAffiliations(this.getUsers(), MUCRoomAffiliation.AffiliationMember, "AffiliationMember"); + } else { + globalThis.Smack.setAffiliation(this.users[0].name, MUCRoomAffiliation.AffiliationMember, "AffiliationMember"); + } + } }) + } + if (this.isOwner) { + ItemText({ title: "撤销设为群主", clickEvent: () => { + this.isOwner = !this.isOwner + if (this.users.length > 1) { + globalThis.Smack.setAffiliations(this.getUsers(), MUCRoomAffiliation.AffiliationNone, "AffiliationNone"); + } else { + globalThis.Smack.setAffiliation(this.users[0].name, MUCRoomAffiliation.AffiliationNone, "AffiliationNone"); + } + } }) + } else { + ItemText({ title: "设为群主", clickEvent: () => { + this.isOwner = !this.isOwner + if (this.users.length > 1) { + globalThis.Smack.setAffiliations(this.getUsers(), MUCRoomAffiliation.AffiliationOwner, "AffiliationOwner"); + } else { + globalThis.Smack.setAffiliation(this.users[0].name, MUCRoomAffiliation.AffiliationOwner, "AffiliationOwner"); + } + } }) + + } + if (this.isBanned) { + ItemText({ title: "取消禁言", clickEvent: () => { + this.isBanned = !this.isBanned + if (this.users.length > 1) { + globalThis.Smack.grantVoices(this.getUsers(), "grantVoices"); + } else { + globalThis.Smack.grantVoice(this.users[0].name, "grantVoice"); + } + } + }) + + } else { + ItemText({ title: "禁言", clickEvent: () => { + this.isBanned = !this.isBanned + if (this.users.length > 1) { + globalThis.Smack.revokeVoices(this.getUsers(), "revokeVoices"); + } else { + globalThis.Smack.revokeVoice(this.users[0].name, "revokeVoice"); + } + } }) + } + Text("发消息") + .backgroundColor(Color.Red) + .width('60%') + .height(50) + .borderRadius(25) + .textAlign(TextAlign.Center) + .padding(5) + .fontColor(Color.White) + .fontSize(20) + .margin({ top: 30 }) + .onClick(() => { + router.push({ url: "pages/chat/one_chat/one_chat_main", params: { userName: this.users[0].name } }) + router.back() + }) + } + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_main.ets b/smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_main.ets new file mode 100644 index 00000000..e885164f --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_main.ets @@ -0,0 +1,101 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import { ChatContentEntity } from '../../../entity/ChatContentEntity' + +@Entry +@Component +struct Meeting_chat_main { + @State chatContentList: Array = [] + + aboutToAppear() { + + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '120会议', + isBack: true, + rightIcon: $r('app.media.more'), + rightClickCallBack: () => { + router.push({ + url: "pages/chat/meeting_chat/meeting_chat_setting" + }) + } + }) + + Stack({ alignContent: Alignment.Bottom }) { + List() { + ForEach(this.chatContentList, item => { + ListItem() { + Flex({ direction: FlexDirection.Column }) { + if (item.isTip) { + Column() { + Text(item.message) + .fontSize(13) + .textAlign(TextAlign.Center) + .backgroundColor('#ffe2e2e2') + .padding({ left: 10, right: 10, top: 5, bottom: 5 }) + .borderRadius(10) + }.width('100%') + } else { + Flex({ justifyContent: item.author == '1' ? FlexAlign.End : FlexAlign.Start }) { + Flex({ direction: FlexDirection.Column }) { + Text(item.author == '1' ? '我' : item.author) + .fontSize(15) + .padding(5) + .alignSelf(item.author == '1' ? ItemAlign.End : ItemAlign.Start) + if (item.messageType == 1) { + Text(item.message) + .backgroundColor(item.author != '1' ? '#ffffff' : '#95ec69') + .padding({ left: 15, top: 10, right: 15, bottom: 10 }) + .alignSelf(ItemAlign.End) + .fontSize(18) + .borderRadius(10) + } else if (item.messageType == 2) { + Image(item.message) + .objectFit(ImageFit.Cover) + .width('50%') + } + } + } + } + } + } + .padding(10) + }, item => item.toString()) + } + .margin({ bottom: 60 }) + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + TextInput({ placeholder: '请输入' }) + Button('发 送').width(100).margin({ left: 8 }) + .onClick(e => { + this.onSendMeetingMessage() + }) + } + .height(60) + .width('100%') + .padding({ left: 15, right: 15 }) + .backgroundColor('#ffffff') + } + } + .height('100%') + .backgroundColor('#ececec') + } + + // todo 发送会议信息 + onSendMeetingMessage() { + + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_setting.ets b/smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_setting.ets new file mode 100644 index 00000000..25108d06 --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/meeting_chat/meeting_chat_setting.ets @@ -0,0 +1,56 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; + +@Entry +@Component +struct Meeting_chat_setting { + + @State allList: Array = [] + + aboutToAppear() { + this.onGetAllMeetingMember() + } + + // todo 查看所有会议成员 + onGetAllMeetingMember() { + this.allList.push('花花') + this.allList.push('娜娜') + this.allList.push('丽丽') + this.allList.push('木木') + this.allList.push('贱贱') + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '会议成员', + isBack: true + }) + + List() { + ForEach(this.allList, item => { + ListItem() { + Text(item) + .padding(13) + .backgroundColor('#ffffff') + .fontSize(18) + .width('100%') + .margin({ bottom: 1 }) + + } + }, item => item.toString()) + } + } + .backgroundColor('#ececec') + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/chat/one_chat/one_chat_main.ets b/smack/entry/src/main/ets/pages/chat/one_chat/one_chat_main.ets new file mode 100644 index 00000000..adde6ce8 --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/one_chat/one_chat_main.ets @@ -0,0 +1,231 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import { ChatContentEntity } from '../../../entity/ChatContentEntity' +import { Constant } from '../../../entity/Constant' + +var jid: string = '' +var service: string = '' +var domain: string = '' +var users: string = '' +var roomName: string = '' +var vInfo: string = '' +var vPassword: string = '' + +@Entry +@Component +struct One_chat_main { + @State chatContentList: Array = [] + private userName: string = '' + @State inputMessage: string = '' + @State message: string = '请把我加入会议中' + beInviteDialog: CustomDialogController = new CustomDialogController({ + builder: BeInvitedDialog({ user: users, + Message: $message, accept: () => { + globalThis.Smack.createRoom(jid, roomName, domain, service) + if (vPassword != '') { + globalThis.Smack.setPassword(vPassword) + } + setTimeout(() => { + globalThis.Smack.join(); + router.push({ + url: "pages/chat/group_chat/group_chat_main", + params: { roomData: roomName } + }) + }, 500) + + }, refuse: () => { + globalThis.Smack.declineInvitation(vInfo, users, "room inviation refuesd"); + } }), + customStyle: true, + alignment: DialogAlignment.Center, + }) + + aboutToAppear() { + console.log('解析参数'); + // @ts-ignore + this.userName = router.getParams().userName + var that = this + globalThis.Smack.registerInvitationListener((v0) => { + let info = JSON.parse(v0) + roomName = info.room.substring(0, info.room.indexOf("@")) + service = info.room.substring(info.room.indexOf("@") + 1, info.room.indexOf(".")) + domain = info.room.substring(info.room.indexOf(".") + 1, info.room.length) + jid = globalThis.userName + users = info.from + vInfo = info.room + vPassword = info.password + setTimeout(() => { + that.beInviteDialog.open() + }, 500) + }) + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: this.userName, + isBack: true, + rightIcon: $r('app.media.more'), + rightClickCallBack: () => { + router.push({ + url: "pages/chat/one_chat/one_chat_setting", + params: { + userName: this.userName + } + }) + } + }) + + Stack({ alignContent: Alignment.Bottom }) { + List() { + ForEach(this.chatContentList, item => { + ListItem() { + Flex({ direction: FlexDirection.Column }) { + if (item.isTip) { + Column() { + Text(item.message) + .fontSize(px2fp(20)) + .textAlign(TextAlign.Center) + .backgroundColor('#ffe2e2e2') + .padding({ left: 10, right: 10, top: 5, bottom: 5 }) + .borderRadius(10) + }.width('100%') + } else { + Flex({ justifyContent: item.author == '我' ? FlexAlign.End : FlexAlign.Start }) { + Flex({ direction: FlexDirection.Column }) { + Text(item.author == '我' ? '我' : item.author) + .fontSize(px2fp(25)) + .padding(5) + .alignSelf(item.author == '我' ? ItemAlign.End : ItemAlign.Start) + if (item.messageType == 1) { + Text(item.message) + .backgroundColor(item.author != '我' ? '#ffffff' : '#95ec69') + .padding({ left: 15, top: 10, right: 15, bottom: 10 }) + .alignSelf(ItemAlign.End) + .fontSize(px2fp(30)) + .borderRadius(10) + } else if (item.messageType == 2) { + Image(item.message) + .objectFit(ImageFit.Cover) + .width('50%') + } + } + } + } + } + } + .padding(10) + }, item => item.toString()) + } + .padding({ bottom: 130 }) + .height('100%') + + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + TextInput({ placeholder: '请输入', text: this.inputMessage }) + .height(px2vp(80)) + .fontSize(px2fp(30)) + .onChange(v => { + this.inputMessage = v + }) + Button('发 送') + .width(150) + .margin({ left: 8 }) + .height(px2vp(80)) + .fontSize(px2fp(25)) + .onClick(e => { + this.onSendSingleMessage() + }) + } + .height(px2vp(120)) + .width('100%') + .padding({ left: 15, right: 15 }) + .backgroundColor('#ffffff') + } + + } + .height('100%') + .backgroundColor('#ececec') + } + + // todo 发送单聊信息 + onSendSingleMessage() { + if (this.inputMessage !== '') { + globalThis.Smack.send(this.userName + "@" + Constant.HOST_DOMAIN, this.inputMessage) + this.chatContentList.push(new ChatContentEntity('我', this.inputMessage)) + this.inputMessage = '' + } + } + + onPageShow() { + globalThis.Smack.registerMessageCallback((id, msg) => { + let id_name = id.toString().split("@")[0] + let id_msg = msg.toString().trim(); + if (id_name == this.userName && id_msg !== "") { + this.chatContentList.push(new ChatContentEntity(id_name, msg)) + } + }) + } +} + +@CustomDialog +struct BeInvitedDialog { + controller: CustomDialogController + user: string + Message: string + accept: () => void + refuse: () => void + + build() { + Flex({ direction: FlexDirection.Column }) { + + Text($r('app.string.invite_str', this.user)) + .height(40) + .fontSize(20) + .padding(10) + .width('100%') + .textAlign(TextAlign.Center) + Text('Message:' + this.Message) + .height(40) + .fontSize(16) + .padding(10) + .width('100%') + .textAlign(TextAlign.Center) + Row() { + Text("(A)接受") + .fontColor(Color.Green) + .fontSize(16) + .onClick(v => { + this.accept() + this.controller.close() + }) + .textAlign(TextAlign.Center) + .layoutWeight(1) + Text("拒绝") + .fontColor(Color.Red) + .fontSize(16) + .onClick(v => { + this.refuse() + this.controller.close() + }) + .textAlign(TextAlign.Center) + .layoutWeight(1) + }.width('100%').margin({ top: 30 }) + } + .padding(20) + .height(180) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/chat/one_chat/one_chat_setting.ets b/smack/entry/src/main/ets/pages/chat/one_chat/one_chat_setting.ets new file mode 100644 index 00000000..13f494e3 --- /dev/null +++ b/smack/entry/src/main/ets/pages/chat/one_chat/one_chat_setting.ets @@ -0,0 +1,157 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import prompt from '@ohos.prompt'; +import { Constant } from '../../../entity/Constant' +import router from '@ohos.router'; + +@Entry +@Component +struct One_chat_setting { + textDialog: CustomDialogController = new CustomDialogController({ + builder: TextDialog({}), + customStyle: true, + alignment: DialogAlignment.Center, + }) + @State userName: string = '' + + aboutToAppear() { + // @ts-ignore + this.userName = router.getParams().userName + } + + RandomStr(length: number, firstToUpper?: boolean) { + let str = "" + for (let i = 0; i < length; i++) { + if (firstToUpper && i == 1) { + str += String.fromCharCode(this.RangeInteger(97, 123)).toUpperCase() + } + str += String.fromCharCode(this.RangeInteger(97, 123)) + } + return str + } + + RangeInteger(min: number, max: number): number{ + const range = max - min + const value = Math.floor(Math.random() * range) + min + return value + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + isBack: true, + title: '好友设置', + }) + + Text('更改好友分组') + .padding(15) + .backgroundColor('#ffffff') + .fontSize(18) + .onClick(e => { + this.textDialog.open() + }) + Line().width('100%').height(1).backgroundColor('#ececec').margin({ left: 20 }) + Text('邀请到会议').padding(15).fontSize(18).backgroundColor('#ffffff') + .onClick(e => { + let roomName = globalThis.userName+ this.RandomStr(3) + globalThis.Smack.createRoom(globalThis.userName, roomName, Constant.HOST_DOMAIN, Constant.SERVICE_NAME); + setTimeout(() => { + globalThis.Smack.join(); + router.push({ + url: "pages/chat/group_chat/group_chat_main", + params: { roomData: roomName } + }) + globalThis.Smack.invite("333@"+Constant.HOST_DOMAIN+Constant.HOST_RES, "invite"); + }, 500) + }) + Line().width('100%').height(1).backgroundColor('#ececec').margin({ left: 20 }) + Text('查看会话历史记录').padding(15).fontSize(18).backgroundColor('#ffffff') + .onClick(e => { + }) + Column() { + Button('删 除 好 友') + .height(40) + .fontSize(15) + .width('50%') + .backgroundColor('red') + .margin({ top: 30 }) + .onClick(e => { + this.onDeleteFriend() + }) + }.width('100%') + } + .width('100%') + .backgroundColor('#ececec') + } + + // todo 删除好友 + onDeleteFriend() { + globalThis.Smack.delfriend(this.userName + "@" + Constant.HOST_DOMAIN); + + prompt.showToast({ + message: '删除完成' + }) + + router.clear() + router.replace({ + url: 'pages/main' + }) + } +} + +@CustomDialog +struct TextDialog { + controller: CustomDialogController + @State newGroup: string = '' + + build() { + Flex({ direction: FlexDirection.Column }) { + Text('请输入新的分组名称').fontSize(px2vp(30)).padding(10) + TextInput() + .margin({ bottom: 20 }) + .height(px2vp(80)) + .fontSize(px2fp(30)) + .onChange(v => { + this.newGroup = v + }) + Button('修 改') + .height(px2vp(80)) + .fontSize(px2fp(30)) + .onClick(e => { + this.onChangeFriendsGroup() + this.controller.close() + }) + } + .width('90%') + .backgroundColor('#ffffff') + .height(px2vp(330)) + .padding(px2vp(20)) + .borderRadius(10) + } + + // todo 修改好友分组信息 + onChangeFriendsGroup() { + if (this.newGroup == '') { + prompt.showToast({ + message: '请输入完整' + }) + } else { + // @ts-ignore + let name: string = router.getParams().userName + globalThis.Smack.changeFriendGroup(name + "@" + Constant.HOST_DOMAIN, this.newGroup); + + prompt.showToast({ + message: '更改完成' + }) + } + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/index.ets b/smack/entry/src/main/ets/pages/index.ets new file mode 100644 index 00000000..91240ec5 --- /dev/null +++ b/smack/entry/src/main/ets/pages/index.ets @@ -0,0 +1,50 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import router from '@ohos.router'; + +@Entry +@Component +struct Index { + onPageShow() { + this.init() + } + + //todo 初始化 + private init() { + let isLogin = globalThis.Smack.onLogin() + setTimeout(() => { + if (isLogin) { + router.replace({ + url: 'pages/main' + }) + } else { + router.replace({ + url: 'pages/user/login' + }) + } + }, 1000) + } + + build() { + Row() { + Column() { + Text("欢迎使用") + .fontSize(30) + Text("聊天室") + .fontSize(50) + .fontWeight(600) + .margin({ top: 20 }) + } + .width('100%') + } + .height('100%') + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/main.ets b/smack/entry/src/main/ets/pages/main.ets new file mode 100644 index 00000000..1cb5f6db --- /dev/null +++ b/smack/entry/src/main/ets/pages/main.ets @@ -0,0 +1,137 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Friends_list } from './tabs/friends/friends_list' +import { Group_list } from './tabs/group/group_list' +import { Meeting_list } from './tabs/meeting/meeting_list' +import { Setting } from './tabs/setting' +import {Constant} from '../entity/Constant' +@Entry +@Component +struct Main { + @State message: string = 'Hello World' + @State mbare: string = "" + @State musername: string = "" + @State mmsg: string = "" + addFriendsDialog: CustomDialogController = new CustomDialogController({ + builder: AddFriendsDialog({ + bare:$mbare, + user:$musername, + Message:$mmsg, + }), + customStyle: true, + alignment: DialogAlignment.Center, + }) + + aboutToAppear() { + + globalThis.Smack.handleSubscriptionRequestListener((json) => { + console.info("收到好友添加申请"+json) + let obj=JSON.parse(json) + this.mbare = obj.jid + this.musername = obj.name + this.mmsg = obj.msg + let that=this + setTimeout(()=>{ + that.addFriendsDialog.open() + },500) + + }) + } + + build() { + Row() { + Column() { + Tabs({ barPosition: BarPosition.End }) { + TabContent() { + Friends_list() + } + .tabBar('好友') + + TabContent() { + Group_list() + } + .tabBar('群聊') + +// TabContent() { +// Meeting_list() +// } +// .tabBar('会议') + + TabContent() { + Setting() + } + .tabBar('设置') + } + + } + .width('100%') + } + .height('100%') + } +} + +@CustomDialog +struct AddFriendsDialog { + controller: CustomDialogController + @Link bare:string + @Link user: string + @Link Message: string + @State groupName:string="" + accept: () => void + refuse: () => void + + build() { + Column() { + Text($r('app.string.add_friends_str', this.user)) + .height(px2vp(60)) + .fontSize(fp2px(14)) + .padding(px2vp(10)) + .textAlign(TextAlign.Center) + Row() { + Text("昵称:").fontSize(fp2px(14)).width('20%') + TextInput({ text: this.user }).fontSize(fp2px(14)).width('70%') + }.margin({ top: px2vp(10) }).padding({ left: px2vp(10), right: px2vp(10) }) + + Row() { + Text("分组:").fontSize(fp2px(14)).width('20%') + TextInput({ text: this.groupName, placeholder: "请输入好友分组" }).fontSize(px2fp(16)).onChange(v=>{ + this.groupName=v + }).width('70%') + }.margin({ top: px2vp(10) }).padding({ left: px2vp(10), right: px2vp(10) }) + + Row() { + Text("(A)接受") + .fontColor(Color.Green) + .fontSize(fp2px(14)) + .onClick(v => { + globalThis.Smack.receiveFriends(this.bare, this.groupName, "receive request"); + this.controller.close() + }) + .textAlign(TextAlign.Center) + .layoutWeight(1) + Text("拒绝") + .fontColor(Color.Red) + .fontSize(fp2px(14)) + .onClick(v => { + globalThis.Smack.rejectFriends(this.bare, "reject request"); + this.controller.close() + }) + .textAlign(TextAlign.Center) + .layoutWeight(1) + }.margin({ top: px2vp(30) }) + } + .padding(px2vp(10)) + .height(px2vp(310)) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/page.ets b/smack/entry/src/main/ets/pages/page.ets new file mode 100644 index 00000000..92807fa7 --- /dev/null +++ b/smack/entry/src/main/ets/pages/page.ets @@ -0,0 +1,451 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Smack } from '@ohos/smack' +import { MUCRoomAffiliation } from '@ohos/smack' +import { MUCRoomRole } from '@ohos/smack' +import { PresenceRoomType } from '@ohos/smack' +import { MUCOperation } from '@ohos/smack' +import {Constant} from '../entity/Constant' +import { RoomConfig } from '@ohos/smack' + +@Entry +@Component +struct page { + + service:string="@"+Constant.HOST_DOMAIN+Constant.HOST_RES + aboutToAppear() { + globalThis.Smack.registerGroupMessageCallback((id, msg) => { + console.info('群聊消息接收到了 id = ' + id + ' msg = ' + msg) + }) + globalThis.Smack.registerInvitationListener((v0, v1, v2, v3, v4, v5, v6) => { + console.info('群聊邀請接收到了 v0 = ' + v0 + ' v1 = ' + v1 + ' v2 = ' + v2 + ' v3 = ' + v3 + ' v4 = ' + v4 + ' v5 = ' + v5 + ' v6 = ' + v6) + }) + globalThis.Smack.registerMUCParticipantPresenceListener((nike: string, presenceType: string) => { + console.info('我在群中的状态变化(踢出、禁止、授予权限等) nike = ' + nike + ' presenceType = ' + presenceType ) + }) + globalThis.Smack.handleSubscriptionRequestListener((resultStr) => { + console.info('handleSubscriptionRequestListener resultStr = ' + resultStr) + }) + } + + build() { + Row() { + Scroll() { + Column() { + Item({ + text: '登录', + click: () => { + globalThis.Smack.Login('test@'+Constant.HOST_IP+Constant.HOST_RES, '123'); + + } + }) + + Item({ + text: '发送单人消息', + click: () => { + globalThis.Smack.send('test3'+this.service, 'hello from test2 abc'); + } + }) + + Item({ + text: '注册', + click: () => { + globalThis.Smack.registers("test2", "123456"); + } + }) + + Item({ + text: '注销', + click: () => { + globalThis.Smack.unregister(); + } + }) + + Item({ + text: '修改密码', + click: () => { + globalThis.Smack.changPwd("test"); + } + }) + + Item({ + text: '创建分组', + click: () => { + globalThis.Smack.createGroup("foo"); + } + }) + + Item({ + text: '获取好友列表', + click: () => { + console.log("Test NAPI getFriends result:" + globalThis.Smack.getFriendList()); + } + }) + + Item({ + text: '添加好友', + click: () => { + globalThis.Smack.addFriends("test@"+Constant.HOST_DOMAIN, "test", "group"); + } + }) + + Item({ + text: '删除好友', + click: () => { + globalThis.Smack.delfriend("test3"+this.service); + } + }) + + Item({ + text: '修改登录状态', + click: () => { + globalThis.Smack.changePresence("test2@"+Constant.HOST_IP); + } + }) + + Item({ + text: '修改好友分组', + click: () => { + globalThis.Smack.changeFriendGroup("test3@"+Constant.HOST_DOMAIN, "friend"); + } + }) + + Item({ + text: '修改好友分组名称', + click: () => { + globalThis.Smack.changeGroup("ts", "friend"); + } + }) + + Item({ + text: '创建群组', + click: () => { + globalThis.Smack.createRoom("444@"+Constant.HOST_IP+Constant.HOST_RES, "room1", Constant.HOST_DOMAIN, Constant.SERVICE_NAME); + } + }) + + Item({ + text: '加入群组', + click: () => { + globalThis.Smack.join(); + } + }) + + Item({ + text: '离开群组', + click: () => { + globalThis.Smack.leave("leave msg"); + } + }) + + Item({ + text: '发送群组消息', + click: () => { + globalThis.Smack.sendGroupMessage("group msg test"); + } + }) + + Item({ + text: '设置群组主题', + click: () => { + globalThis.Smack.setSubject("subject"); + } + }) + + Item({ + text: '销毁群组', + click: () => { + globalThis.Smack.destroy("999@"+Constant.HOST_IP+Constant.HOST_RES, "123"); + } + }) + + Item({ + text: '踢出群组', + click: () => { + globalThis.Smack.kick("555", "kick"); + } + }) + + Item({ + text: '踢出群组并拉进黑名单', + click: () => { + globalThis.Smack.ban("555", "ban"); + } + }) + + Item({ + text: '授予发言权限', + click: () => { + globalThis.Smack.grantVoice("555", "grantVoice"); + } + }) + + Item({ + text: '移除发言权限', + click: () => { + globalThis.Smack.revokeVoice("555", "revokeVoice"); + } + }) + + Item({ + text: '岗位设置 ', + click: () => { + globalThis.Smack.setAffiliation("555", MUCRoomAffiliation.AffiliationOwner, "AffiliationOwner"); + } + }) + + Item({ + text: '角色设置 RoleModerator', + click: () => { + globalThis.Smack.setRole("888", MUCRoomRole.RoleModerator, "RoleModerator"); + } + }) + + Item({ + text: '更改登录状态 Away', + click: () => { + globalThis.Smack.setPresence(PresenceRoomType.Away, "Away"); + } + }) + + Item({ + text: '邀请成员 ', + click: () => { + globalThis.Smack.invite("777"+this.service, "invite"); + } + }) + + Item({ + text: '解析xml', + click: () => { + globalThis.Smack.parseXML(); + } + }) + + Item({ + text: '获取全部群聊成员', + click: () => { + let number = globalThis.Smack.getRoomItems(); + console.info('getRoomItems = ' + JSON.stringify(number)) + } + }) + + Item({ + text: '过滤群聊成员', + click: () => { + let list = globalThis.Smack.requestList(MUCOperation.RequestOwnerList); + console.info('requestList = ' + JSON.stringify(list)) + } + }) + + Item({ + text: '拒绝加入群聊', + click: () => { + globalThis.Smack.declineInvitation("888_room@"+Constant.SERVICE_NAME+"."+Constant.HOST_DOMAIN, "888@"+Constant.HOST_DOMAIN, "room inviation refuesd"); + } + }) + + Item({ + text: '创建并加入房间', + click: () => { + let info = globalThis.Smack.createOrJoinRoom("room4", Constant.HOST_DOMAIN, Constant.SERVICE_NAME, "123"); + } + }) + + Item({ + text: '房间设置密码', + click: () => { + let info = globalThis.Smack.setPassword("123123"); + } + }) + + Item({ + text: '获取加入房间的房间信息', + click: () => { + let info = globalThis.Smack.getRoomInfo(); + console.info('getRoomInfo = ' + JSON.stringify(info)) + } + }) + + Item({ + text: '获取群聊配置', + click: () => { + let config = globalThis.Smack.requestRoomConfig(); + console.info('config = ' + JSON.stringify(config)) + } + }) + + Item({ + text: '设置群聊配置', + click: () => { + console.info("test page setRoomConfig"); + let roomConfig: RoomConfig = new RoomConfig(); +// roomConfig = JSON.parse(globalThis.Smack.getRoomConfig()); +// let JidVal = roomConfig.whois == "anyone" ? "任何人" : "审核者" +// let switchAllowpm = roomConfig.allowpm +// let roomName = roomConfig.roomname +// let roomDesc = roomConfig.roomdesc +// let roomMaxusers = roomConfig.maxusers +// let roomPassword = roomConfig.roomsecret +// let roomAdmins = roomConfig.roomadmins +// let roomOwners = roomConfig.roomowners +// let roomPresencebroadcast = roomConfig.presencebroadcast + + roomConfig.allowinvites = "1"; + roomConfig.canchangenick = "1"; + roomConfig.changesubject = "1"; + roomConfig.enablelogging = "1"; + roomConfig.membersonly = "1"; + roomConfig.moderatedroom = "1"; + roomConfig.passwordprotectedroom = "1"; + roomConfig.persistentroom = "1"; + roomConfig.publicroom = "1"; + roomConfig.registration = "1"; + roomConfig.reservednick = "1"; + roomConfig.allowpm = 'anyone'; + roomConfig.whois = "anyone";// "anyone" : "moderators" + roomConfig.roomname = "roomName";//roomName + roomConfig.roomdesc = "room desc"; + roomConfig.maxusers = "25" + roomConfig.roomsecret = "123" +// roomConfig.roomadmins = "" +// roomConfig.roomowners = ""; + roomConfig.presencebroadcast = ["participant", "moderator", "visitor"]; + console.info("test page setRoomConfig str:"+JSON.stringify(roomConfig)) + let info = globalThis.Smack.setRoomConfig(JSON.stringify(roomConfig)); + } + }) + + Item({ + text: '从该聊天室踢出用户群', + click: () => { + let info = globalThis.Smack.bans("888,555", "bans"); + } + }) + + Item({ + text: '更改聊天室成员的昵称', + click: () => { + let info = globalThis.Smack.setNick("new_nike_name"); + } + }) + + Item({ + text: '目前是否在多人聊天中', + click: () => { + let isJoined = globalThis.Smack.isJoined(); + console.info('isJoined = ' + isJoined) + } + }) + + Item({ + text: '返回房间里用户的昵称', + click: () => { + let nick = globalThis.Smack.nick(); + console.info('nick = ' + nick) + } + }) + Item({ + text: '是否连接', + click: () => { + let isConnected = globalThis.Smack.isConnected(); + console.info('连接状态 = ' + isConnected) + } + }) + Item({ + text: '用户名称', + click: () => { + let username = globalThis.Smack.username(); + console.info('连接状态 = ' + username) + } + }) + Item({ + text: 'connect', + click: () => { + let connect = globalThis.Smack.connect(); + console.info('connect = ' + connect) + } + }) + Item({ + text: 'setServer', + click: () => { + globalThis.Smack.setServer(Constant.HOST_IP); + console.info('setServer = ') + } + }) + Item({ + text: 'setUsernameAndPassword', + click: () => { + let value=globalThis.Smack.setUsernameAndPassword("zhang", "123456"); + console.info('setUsernameAndPassword = '+value) + } + }) + Item({ + text: 'setPort', + click: () => { + let value=globalThis.Smack.setPort(Constant.HOST_PORT); + console.info('setUsernameAndPassword = '+value) + } + }) + Item({ + text: 'password', + click: () => { + let value=globalThis.Smack.password(); + console.info('password = '+value) + } + }) + Item({ + text: 'setResource', + click: () => { + let value=globalThis.Smack.setResource(Constant.HOST_RES.replace("/","")); + console.info('password = '+value) + } + }) + Item({ + text: 'receiveFriends', + click: () => { + let value=globalThis.Smack.receiveFriends("555@"+Constant.HOST_DOMAIN, "group", "receive request"); + } + }) + + Item({ + text: 'rejectFriends', + click: () => { + let value=globalThis.Smack.rejectFriends("555@"+Constant.HOST_DOMAIN, "reject request"); + } + }) + } + .width('100%') + } + } + .height('100%') + } +} + +@Component +struct Item { + text: string = '' + click: () => void + + build() { + Column() { + Button(this.text) + .fontSize(px2fp(30)) + .width('90%') + .margin(px2vp(10)) + .padding(px2vp(15)) + .onClick(v => { + this.click() + }) + } + + } +} diff --git a/smack/entry/src/main/ets/pages/tabs/friends/add_friends.ets b/smack/entry/src/main/ets/pages/tabs/friends/add_friends.ets new file mode 100644 index 00000000..b96934b4 --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/friends/add_friends.ets @@ -0,0 +1,69 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import prompt from '@ohos.prompt'; +import { Constant } from '../../../entity/Constant' + +@Entry +@Component +struct Add_friends { + @State name: string = '' + @State group: string = '' + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '添加好友', + isBack: true + }) + Flex({ direction: FlexDirection.Column }) { + Text('名称').fontSize(30).padding(10) + + TextInput({ text: this.name }).height(80) + .fontSize(30) + .onChange(value => { + this.name = value + }) + Text('分组').fontSize(30).padding(10) + TextInput({ text: this.group }).height(80) + .fontSize(30) + .onChange(value => { + this.group = value + }) + + Button('添 加') + .height(80) + .fontSize(30) + .onClick(e => { + this.onAddFriends() + }).margin({ top: 20 }) + } + .padding(30) + } + .backgroundColor('#ffffff') + .borderRadius(10) + } + + // todo 添加好友 + onAddFriends() { + if (this.name == '' || this.group == '') { + prompt.showToast({ + message: '请输入完整' + }) + } else { + globalThis.Smack.addFriends(this.name + "@" + Constant.HOST_DOMAIN, this.name, this.group) + prompt.showToast({ + message: '已发送好友请求' + }) + } + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/friends/add_group.ets b/smack/entry/src/main/ets/pages/tabs/friends/add_group.ets new file mode 100644 index 00000000..f9652514 --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/friends/add_group.ets @@ -0,0 +1,62 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import prompt from '@ohos.prompt'; +import { Constant } from '../../../entity/Constant' + +@Entry +@Component +struct Add_group { + @State groupName: string = '' + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '创建好友分组', + isBack: true + }) + Flex({ direction: FlexDirection.Column }) { + Text('分组名称').fontSize(30).padding(10) + TextInput({ text: this.groupName , placeholder: '请输入'}) + .height(80) + .fontSize(30) + .onChange(v => { + this.groupName = v + }) + Button('创 建') + .height(80) + .fontSize(30) + .onClick(e => { + this.onAddGroup() + }).margin({ top: 20 }) + } + .padding(30) + } + .backgroundColor('#ffffff') + .borderRadius(10) + } + + // todo 创建好友分组 + onAddGroup() { + if (this.groupName == '') { + prompt.showToast({ + message: '请输入完整' + }) + } else { + globalThis.Smack.createGroup(this.groupName + '@' + Constant.HOST_IP) + + prompt.showToast({ + message: '已创建' + }) + } + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/friends/change_group_name.ets b/smack/entry/src/main/ets/pages/tabs/friends/change_group_name.ets new file mode 100644 index 00000000..336c9e00 --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/friends/change_group_name.ets @@ -0,0 +1,69 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import prompt from '@ohos.prompt'; + +@Entry +@Component +struct Change_group_name { + @State oldName: string = '' + @State newName: string = '' + + aboutToAppear() { + // @ts-ignore + this.oldName = router.getParams().name + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '修改分组名称', + isBack: true + }) + Flex({ direction: FlexDirection.Column }) { + Text('原始名称:' + this.oldName).fontSize(30).padding(10) + + Text('新的名称').fontSize(30).padding(10) + TextInput({ placeholder: "请输入" }) + .height(80) + .fontSize(30) + .onChange(value => { + this.newName = value + }) + + Button('修 改') + .height(80) + .fontSize(30) + .onClick(e => { + this.onChangeName() + }).margin({ top: 20 }) + } + .padding(30) + } + .backgroundColor('#ffffff') + .borderRadius(10) + } + + // todo 修改分组名称 + onChangeName() { + if (this.newName == '') { + prompt.showToast({ + message: '请输入完整' + }) + } else { + globalThis.Smack.changeGroup(this.oldName, this.newName); + prompt.showToast({ + message: '已修改' + }) + } + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/friends/friends_list.ets b/smack/entry/src/main/ets/pages/tabs/friends/friends_list.ets new file mode 100644 index 00000000..43de05f1 --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/friends/friends_list.ets @@ -0,0 +1,183 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import prompt from '@ohos.prompt'; +import { FriendsEntity } from "@ohos/smack" + +@Entry +@Component +export struct Friends_list { + @State myFriendList: Array = [] + menuDialog: CustomDialogController = new CustomDialogController({ + builder: MenuDialog({}), + customStyle: true, + alignment: DialogAlignment.TopEnd, + offset: { dx: -20, dy: 50 } + }) + + aboutToAppear() { + this.getMyAllFriends() + } + + onPageShow() { + this.getMyAllFriends() + } + + build() { + Column() { + // 标题栏 + Toolbar({ title: '好友', rightIcon: $r("app.media.add"), rightClickCallBack: () => { + this.menuDialog.open() + } }) + + // 搜索框 +// Column() { +// Text('搜 索') +// .padding(10) +// .width('100%') +// .textAlign(TextAlign.Center) +// .height(40) +// .fontSize(20) +// .backgroundColor('#ffe7e7e7') +// .borderRadius(20) +// .fontColor('#ff757575') +// } +// .width('100%') +// .padding(10) +// .onClick(e => { +// router.push({ +// url: 'pages/user/search_friends' +// }) +// }) + + // 好友列表 + Stack({ alignContent: Alignment.BottomEnd }) { + List() { + ForEach(this.myFriendList, item => { + ListItem() { + Column() { + Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center }) { + Text(item.groupName + '(' + item.names.length + ')') + .fontSize(15) + .width('100%') + .padding(20) + + Column() { + Image($r('app.media.change')).width(20).height(20) + } + .padding(5) + .margin({ right: 20 }) + .onClick(e => { + router.push({ + url: "pages/tabs/friends/change_group_name", + params: { + name: item.groupName + } + }) + }) + } + .backgroundColor('#fff1f1f1') + + ForEach(item.names, item2 => { + Text(item2.userName) + .fontSize(13) + .width('100%') + .margin({ left: 50 }) + .padding(20) + .onClick(e => { + router.push({ + url: 'pages/chat/one_chat/one_chat_main', + params: { userName: item2.userName } + }) + }) + Text('') + .height(1) + .width('100%') + .backgroundColor('#ececec') + }, item2 => item2.toString()) + } + } + }, item => item.toString()) + } + .height('100%') + .width('100%') + + Image($r("app.media.refresh")) + .width(60) + .height(60) + .backgroundColor('#ff56ae97') + .padding(5) + .borderRadius(30) + .objectFit(ImageFit.Cover) + .margin({bottom: 190, right: 110}) + .onClick(v => { + this.getMyAllFriends() + }) + } + .width('100%') + .height('100%') + } + } + + // todo 获取所有好友及其分组信息 + getMyAllFriends() { + let res: Array = globalThis.Smack.getFriendList() + this.myFriendList = res + let groups=[] + for (var i = 0; i < this.myFriendList.length; i++) { + groups.push( this.myFriendList[i].groupName); + + } + globalThis.groupList=JSON.stringify(groups) + prompt.showToast({ + message: '刷新完成' + }) + + } +} + +@CustomDialog +struct MenuDialog { + controller: CustomDialogController + + build() { + Column() { + Text('添加好友') + .fontSize(20) + .padding(20) + .onClick(() => { + router.push({ + url: 'pages/tabs/friends/add_friends' + }) + this.controller.close() + }) + + Text('') + .height(1) + .width('100%') + .backgroundColor('#ececec') + + Text('创建分组') + .fontSize(30) + .padding(20) + .onClick(() => { + router.push({ + url: 'pages/tabs/friends/add_group' + }) + this.controller.close() + }) + } + .backgroundColor('#ffffff') + .borderRadius(10) + .width(200) + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/group/Join_in_group.ets b/smack/entry/src/main/ets/pages/tabs/group/Join_in_group.ets new file mode 100644 index 00000000..9b1c40bf --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/group/Join_in_group.ets @@ -0,0 +1,42 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; + +@Entry +@Component +struct Join_in_group { + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '加入群聊', + isBack: true + }) + Flex({ direction: FlexDirection.Column }) { + Text('群聊名称').fontSize(15).padding(10) + TextInput() + Text('昵称').fontSize(15).padding(10) + TextInput() + Button('加 入').onClick(e => { + this.onJoinInGroup() + }).margin({ top: 20 }) + } + .padding(30) + } + .backgroundColor('#ffffff') + .borderRadius(10) + } + + // todo 加入群聊 + onJoinInGroup() { + globalThis.Smack.join(); + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/group/create_group_chat.ets b/smack/entry/src/main/ets/pages/tabs/group/create_group_chat.ets new file mode 100644 index 00000000..6ae3a6aa --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/group/create_group_chat.ets @@ -0,0 +1,106 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import prompt from '@ohos.prompt'; +import { Constant } from '../../../entity/Constant' + + +@Entry +@Component +struct Create_group_chat { + inputName: string = '' + passWordDialog: CustomDialogController = new CustomDialogController({ + builder: PassWordDialog({}), + customStyle: true, + alignment: DialogAlignment.Center, + + }) + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '创建群聊', + isBack: true + }) + Flex({ direction: FlexDirection.Column }) { + Text('群聊名称').fontSize(15).padding(10) + TextInput().onChange(v => { + this.inputName = v + }) + // Text('描述').fontSize(15).padding(10) + // TextInput() + // Text('最大用户数').fontSize(15).padding(10) + // TextInput().type(InputType.Number) + Button('创 建').onClick(e => { + if (this.inputName != '') { + this.onCreateGroupChat(this.inputName) + } else { + prompt.showToast({ message: "请输入房间名" }) + } + }).margin({ top: 20 }) + Button('加入密码房').onClick(e => { + globalThis.Smack.createRoom("555@" + Constant.HOST_IP + Constant.HOST_RES, "room", Constant.HOST_DOMAIN, Constant.SERVICE_NAME); + this.passWordDialog.open() + }).margin({ top: 20 }) + } + .padding(30) + } + .backgroundColor('#ffffff') + .borderRadius(10) + } + + // todo 创建群聊 + onCreateGroupChat(input: string) { + globalThis.Smack.createRoom(globalThis.userName, input, Constant.HOST_DOMAIN, Constant.SERVICE_NAME); + prompt.showToast({ + message: '房间创建成功' + }) + setTimeout(() => { + router.replace({ + url: 'pages/chat/group_chat/group_chat_main' + }) + }, 1000) + } +} + +@CustomDialog +struct PassWordDialog { + controller: CustomDialogController + inputStr: string = '' + + build() { + Flex({ direction: FlexDirection.Column }) { + Text('密码').fontSize(15).padding(10) + TextInput().onChange(v => { + this.inputStr = v + }) + Button('确 定').onClick(e => { + globalThis.Smack.setPassword(this.inputStr) + this.onJoinInMeeting() + this.controller.close() + }).margin({ top: 20 }) + } + .padding(20) + .height(px2vp(280)) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } + + // todo 从会议列表里进入会议 + onJoinInMeeting() { + setTimeout(() => { + globalThis.Smack.join(); + this.controller.close() + }, 500) + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/group/group_list.ets b/smack/entry/src/main/ets/pages/tabs/group/group_list.ets new file mode 100644 index 00000000..76cec52c --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/group/group_list.ets @@ -0,0 +1,120 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; +import {Constant} from '../../../entity/Constant' + +@Entry +@Component +export struct Group_list { + @State groupList: Array = [] + dialogController: CustomDialogController = new CustomDialogController({ + builder: CustomDialogExample({}), + customStyle: true, + alignment: DialogAlignment.TopEnd, + offset: { dx: -20, dy: 50 } + }) + + aboutToAppear() { + this.getAllGroup() + } + + // todo 获取所有群聊列表 + getAllGroup() { + for (var i = 0; i < 10; i++) { + this.groupList.push('群聊名称 ' + (i + 1)) + } + } + + build() { + Column() { + Toolbar({ title: '群聊', + rightIcon: $r('app.media.add'), + rightClickCallBack: () => { + this.dialogController.open() + } + }) +// List() { +// ForEach(this.groupList, item => { +// ListItem() { +// Column() { +// Text(item) +// .fontSize(18) +// .padding(12) +// .width('100%') +// .textAlign(TextAlign.Start) +// .margin({ bottom: 1 }) +// .backgroundColor('#ffffff') +// } +// } +// .onClick(e => { +// router.push({ +// url: 'pages/chat/group_chat/group_chat_main' +// }) +// }) +// }, item => item.toString()) +// } + } + .width('100%') + .backgroundColor('#ececec') + } +} + +@CustomDialog +struct CustomDialogExample { + controller: CustomDialogController + + build() { + Column() { + Text('创建群聊') + .fontSize(36) + .padding(10) + .onClick(() => { + router.push({ + url: 'pages/tabs/group/create_group_chat' + }) + this.controller.close() + }) + + Text('') + .height(1) + .width('100%') + .backgroundColor('#ececec') + + Text('加入群聊') + .fontSize(36) + .padding(10) + .onClick(() => { + router.push({ + url: 'pages/tabs/group/Join_in_group' + }) + this.controller.close() + }) + Text('加入加密群聊') + .fontSize(36) + .padding(10) + .onClick(() => { + this.controller.close() + }) + } + .backgroundColor('#ffffff') + .borderRadius(10) + .width(100) + + } + // todo 创建群聊 + onCreateGroupChat() { + globalThis.Smack.createRoom(globalThis.userName, "room", Constant.HOST_DOMAIN, Constant.SERVICE_NAME); + + } +} + + diff --git a/smack/entry/src/main/ets/pages/tabs/meeting/Join_in_meeting.ets b/smack/entry/src/main/ets/pages/tabs/meeting/Join_in_meeting.ets new file mode 100644 index 00000000..ff046cac --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/meeting/Join_in_meeting.ets @@ -0,0 +1,45 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; + +@Entry +@Component +struct Join_in_meeting { + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '加入会议', + isBack: true + }) + Flex({ direction: FlexDirection.Column }){ + Text('会议名称').fontSize(15).padding(10) + TextInput() + Text('昵称').fontSize(15).padding(10) + TextInput() + Text('密码').fontSize(15).padding(10) + TextInput() + Button('加 入').onClick(e => { + this.onJoinInMeeting() + }).margin({ top: 20 }) + } + .padding(30) + } + .backgroundColor('#ffffff') + .borderRadius(10) + } + + // todo 加入会议 + onJoinInMeeting(){ + + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/meeting/create_meeting.ets b/smack/entry/src/main/ets/pages/tabs/meeting/create_meeting.ets new file mode 100644 index 00000000..bb32d470 --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/meeting/create_meeting.ets @@ -0,0 +1,44 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; + +@Entry +@Component +struct Create_meeting { + @State message: string = 'Hello World' + + build() { + Flex({ direction: FlexDirection.Column }) { + Toolbar({ + title: '创建会议', + isBack: true + }) + Flex({ direction: FlexDirection.Column }) { + Text('会议名称').fontSize(15).padding(10) + TextInput() + Text('密码').fontSize(15).padding(10) + TextInput() + Button('创 建').onClick(e => { + this.onCreateMeeting() + }).margin({ top: 20 }) + } + .padding(30) + } + .backgroundColor('#ffffff') + .borderRadius(10) + } + + // todo 创建会议 + onCreateMeeting() { + + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/meeting/meeting_list.ets b/smack/entry/src/main/ets/pages/tabs/meeting/meeting_list.ets new file mode 100644 index 00000000..080e492a --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/meeting/meeting_list.ets @@ -0,0 +1,140 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../../base/toolbar' +import router from '@ohos.router'; + +@Entry +@Component +export struct Meeting_list { + dialogController: CustomDialogController = new CustomDialogController({ + builder: CustomDialogExample({}), + customStyle: true, + alignment: DialogAlignment.TopEnd, + offset: { dx: -20, dy: 50 } + }) + textDialogController: CustomDialogController = new CustomDialogController({ + builder: TextDialog({}), + customStyle: true, + alignment: DialogAlignment.Center, + }) + @State meetingsList: Array = [] + + aboutToAppear() { + this.getAllMeetings() + } + + // todo 获取所有会议列表 + getAllMeetings() { + for (var i = 0; i < 10; i++) { + this.meetingsList.push('线上会议名称 ' + (i + 1)) + } + } + + build() { + Column() { + Toolbar({ + title: '会议', + rightIcon: $r('app.media.add'), + rightClickCallBack: () => { + this.dialogController.open() + } + }) + List() { + ForEach(this.meetingsList, item => { + ListItem() { + Column() { + Text(item) + .fontSize(18) + .padding(12) + .width('100%') + .textAlign(TextAlign.Start) + .margin({ bottom: 1 }) + .backgroundColor('#ffffff') + } + } + .onClick(e => { + this.textDialogController.open() + }) + }, item => item.toString()) + } + } + .width('100%') + .backgroundColor('#ececec') + } +} + +@CustomDialog +struct TextDialog { + controller: CustomDialogController + + build() { + Flex({ direction: FlexDirection.Column }) { + Text('昵称').fontSize(15).padding(10) + TextInput() + Text('密码').fontSize(15).padding(10) + TextInput() + Button('确 定').onClick(e => { + this.onJoinInMeeting() + this.controller.close() + }).margin({ top: 20 }) + } + .padding(20) + .height(280) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } + + // todo 从会议列表里进入会议 + onJoinInMeeting() { + + router.push({ + url: 'pages/chat/meeting_chat/meeting_chat_main' + }) + } +} + +@CustomDialog +struct CustomDialogExample { + controller: CustomDialogController + + build() { + Column() { + Text('创建会议') + .fontSize(16) + .padding(10) + .onClick(() => { + router.push({ + url: 'pages/tabs/meeting/create_meeting' + }) + this.controller.close() + }) + + Text('') + .height(1) + .width('100%') + .backgroundColor('#ececec') + + Text('加入会议') + .fontSize(16) + .padding(10) + .onClick(() => { + router.push({ + url: 'pages/tabs/meeting/Join_in_meeting' + }) + this.controller.close() + }) + } + .backgroundColor('#ffffff') + .borderRadius(10) + .width(100) + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/tabs/setting.ets b/smack/entry/src/main/ets/pages/tabs/setting.ets new file mode 100644 index 00000000..527239e3 --- /dev/null +++ b/smack/entry/src/main/ets/pages/tabs/setting.ets @@ -0,0 +1,203 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../base/toolbar' +import { PresenceType } from '@ohos/smack' +import prompt from '@ohos.prompt'; +import router from '@ohos.router'; +import { PresenceRoomType } from '@ohos/smack' +@Entry +@Component +export struct Setting { + private states: string[] = ['空闲', '在线', '离开', '长时间离开', '请勿打扰'] + @State select: number = 1 + dialogController: CustomDialogController = new CustomDialogController({ + builder: CustomDialogExample(), + customStyle: true, + alignment: DialogAlignment.Center, + }) + + build() { + Column() { + Toolbar({ title: '设置' }) + + Column() { + Text('修改密码') + .width('100%') + .padding(px2vp(30)) + .fontSize(px2fp(30)) + .margin({ bottom: 1 }) + .onClick(e => { + this.dialogController.open() + }) + .backgroundColor('#ffffff') + + Text('设置状态 (' + this.states[this.select] + ')') + .width('100%') + .padding(px2vp(30)) + .fontSize(px2fp(30)) + .margin({ bottom: 1 }) + .backgroundColor('#ffffff') + .onClick(e => { + TextPickerDialog.show({ + range: this.states, + selected: this.select, + onAccept: (value: TextPickerResult) => { + this.select = value.index + this.onSetOnLineState() + } + }) + + }) + Divider().color('#ffe7e7e7') + + Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Button('退出登录') + .padding(10) + .backgroundColor('red') + .height(px2vp(80)) + .width('30%') + .fontSize(px2fp(30)) + .onClick(e => { + AlertDialog.show({ + title: '提示', + message: '确定退出登录吗?', + confirm: { + value: '确定', + action: () => { + console.log('test loginout hh') + this.onExitAccount() + } + } + }) + }) + + Button('账号注销') + .padding(10) + .margin({ left: 20 }) + .backgroundColor('red') + .height(px2vp(80)) + .fontSize(px2fp(30)) + .width('30%') + .onClick(e => { + AlertDialog.show({ + title: '提示', + message: '确定注销账号吗?', + confirm: { + value: '确定', + action: () => { + this.onDeleteAccount() + } + } + }) + }) + }.padding({ top: 30 }).backgroundColor('#ffffff') + } + } + .width('100%') + .backgroundColor('#ececec') + } + + // todo 退出登录 + private onExitAccount() { + globalThis.Smack.loginout(); + router.clear() + router.replace({ + url: 'pages/user/login' + }) + } + + // todo 账号删除 + private onDeleteAccount() { + globalThis.Smack.unregister() + router.replace({ + url: 'pages/user/login' + }) + } + + // todo 设置在线状态 + private onSetOnLineState() { + let presenceType: PresenceType = PresenceType.Available + if (this.select == 0) { + presenceType = PresenceType.Chat + } else if (this.select == 1) { + presenceType = PresenceType.Available + } else if (this.select == 2) { + presenceType = PresenceType.Away + } else if (this.select == 3) { + presenceType = PresenceType.Xa + } else if (this.select == 4) { + presenceType = PresenceType.Dnd + } + globalThis.Smack.changePresence(presenceType, this.states[this.select]) + } +} + +@CustomDialog +struct CustomDialogExample { + controller: CustomDialogController + @State pass1: string = '' + @State pass2: string = '' + + // todo 修改密码 + private onChangPassword() { + if (this.pass1 == '' || this.pass2 == '') { + prompt.showToast({ + message: "请输入数据" + }) + } else if (this.pass1 !== this.pass2) { + prompt.showToast({ + message: "密码不一致" + }) + } else { + globalThis.Smack.changPwd(this.pass1) + prompt.showToast({ + message: "修改成功" + }) + console.log('密码修改结束'); + } + } + + build() { + Flex({ direction: FlexDirection.Column }) { + Text('请输入新密码') + .height(px2vp(80)) + .fontSize(px2fp(30)).padding(px2vp(10)) + TextInput() + .height(px2vp(80)) + .fontSize(px2fp(30)) + .onChange(v => { + this.pass1 = v + }) + Text('请再次输入新密码') + .height(px2vp(80)) + .fontSize(px2fp(30)) + .padding(px2vp(10)) + TextInput() + .height(px2vp(80)) + .fontSize(px2fp(30)) + .onChange(v => { + this.pass2 = v + }) + Button('确定') + .height(px2vp(80)) + .fontSize(px2fp(30)) + .onClick(e => { + this.onChangPassword() + this.controller.close() + }).margin({ top: 20 }) + } + .padding(20) + .height(px2vp(500)) + .backgroundColor('#ffffff') + .borderRadius(10) + .width('80%') + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/user/login.ets b/smack/entry/src/main/ets/pages/user/login.ets new file mode 100644 index 00000000..33d8331b --- /dev/null +++ b/smack/entry/src/main/ets/pages/user/login.ets @@ -0,0 +1,169 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import router from '@ohos.router'; +import { Toolbar } from '../base/toolbar' +import prompt from '@ohos.prompt'; +import { Constant } from '../../entity/Constant' + +@Entry +@Component +struct Login { + private userName: string = '' + private passWord: string = '' + @State ip: string = '' + @State doMain: string = '' + @State serviceName: string = '' + @State resource: string = '' + @State port: string = '' + @State uName: string = '' + @State uPassword: string = '' + @State compression: boolean = false + @State authed: boolean = false + + build() { + Column() { + Toolbar({ title: '登录' }) + Column() { + Column() { + TextInput({ placeholder: '请输入用户名', text: this.userName }) + .margin({ bottom: 20 }) + .height(px2vp(50)) + .fontSize(px2fp(20)) + .type(InputType.Normal) + .onChange(v => { + this.userName = v + }) + TextInput({ placeholder: '请输入密码', text: this.passWord }) + .type(InputType.Password) + .height(px2vp(50)) + .fontSize(px2fp(20)) + .onChange(v => { + this.passWord = v + }) + + Button('登 录') + .width('100%') + .height(px2vp(50)) + .fontSize(px2fp(20)) + .margin({ top: 10 }) + .onClick(v => { +// let isConnect = globalThis.Smack.isConnected() +// if (isConnect) { + this.onLogin() +// } else { +// prompt.showToast({ +// message: "请先连接服务" +// }) +// } + }) + Button('连接服务') + .width('100%') + .height(px2vp(50)) + .fontSize(px2fp(20)) + .margin({ top: 10 }) + .onClick(v => { + if (this.check()) { + this.connectService() + } + }) + + Button('注 册') + .margin({ top: 10 }) + .width('100%') + .height(px2vp(50)) + .fontSize(px2fp(20)) + .padding({ left: 30, right: 30 }) + .backgroundColor('#000000') + .onClick(v => { + this.onRegister() + }) + } + + Text("ip: " + this.ip).width("100%").margin({ top: 5 }) + Text("doMain: " + this.doMain).width("100%").margin({ top: 5 }) + Text("serviceName: " + this.serviceName).width("100%").margin({ top: 5 }) + Text("resource: " + this.resource).width("100%").margin({ top: 5 }) + Text("port: " + this.port).width("100%").margin({ top: 5 }) + Text("userName: " + this.uName).width("100%").margin({ top: 5 }) + Text("passWord: " + this.uPassword).width("100%").margin({ top: 5 }) + Text("compression: " + this.compression).width("100%").margin({ top: 5 }) + Text("authed: " + this.authed).width("100%").margin({ top: 5 }) + } + .margin({ top: 20 }) + .padding({ left: 50, right: 50 }) + .height('100%') + .width('100%') + } + } + + public connectService() { + globalThis.Smack.setServer(Constant.HOST_IP) + globalThis.Smack.setServer(Constant.SERVICE_NAME) + globalThis.Smack.setResource(Constant.HOST_RES.replace("/", "")) + globalThis.Smack.setPort(Constant.HOST_PORT); + globalThis.Smack.setUsernameAndPassword(this.userName, this.passWord) + globalThis.Smack.connect() + this.uName = globalThis.Smack.username() + this.uPassword = globalThis.Smack.password() + this.resource = globalThis.Smack.resource() + this.ip = globalThis.Smack.server() + this.port = globalThis.Smack.port() + this.compression = globalThis.Smack.compression() + this.authed = globalThis.Smack.authed() + } + + // todo 登录 + private onLogin() { + let result: number + if (this.check()) { + this.connectService() + try { + let LoginName = this.uName + '@' + Constant.HOST_IP + globalThis.userName = this.uName + '@' + Constant.HOST_IP + Constant.HOST_RES + result = globalThis.Smack.Login(LoginName, this.uPassword); + } catch (e) { + console.log("onLogin err " + e.message) + } + if (result == 1) { + router.replace({ + url: 'pages/main' + }) + } else { + prompt.showToast({ + message: "登录失败" + }) + } + } + + } + + public check(): boolean { + if (this.userName == '') { + prompt.showToast({ + message: "请输入用户名" + }) + return false + } + if (this.passWord == '') { + prompt.showToast({ + message: "请输入登陆密码" + }) + return false + } + return true + } + + private onRegister() { + router.push({ + url: 'pages/user/register' + }) + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/user/register.ets b/smack/entry/src/main/ets/pages/user/register.ets new file mode 100644 index 00000000..dab6850b --- /dev/null +++ b/smack/entry/src/main/ets/pages/user/register.ets @@ -0,0 +1,86 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import router from '@ohos.router'; +import { Toolbar } from '../base/toolbar' +import { Constant } from '../../entity/Constant' +import prompt from '@ohos.prompt'; + +@Entry +@Component +struct Register { + private userName: string = '' + private passWord: string = '' + private email: string = '' + + build() { + Column() { + Toolbar({ title: '注册', isBack: true }) + Column() { + Column() { + TextInput({ placeholder: '请输入用户名' }) + .margin({ bottom: 20 }) + .height(px2vp(80)) + .fontSize(px2fp(30)) + .type(InputType.Normal) + .onChange(v => { + this.userName = v + }) + TextInput({ placeholder: '请输入密码' }) + .margin({ bottom: 20 }) + .height(px2vp(80)) + .fontSize(px2fp(30)) + .type(InputType.Normal) + .onChange(v => { + this.passWord = v + }) + // TextInput({ placeholder: '请输入邮箱' }) + // .margin({ bottom: 20 }) + // .type(InputType.Email) + // .onChange(v => { + // this.email = v + // }) + + Button('注 册') + .width('100%') + .margin({ top: 25 }) + .height(px2vp(80)) + .fontSize(px2fp(30)) + .onClick(v => { + this.onRegister() + }) + } + } + .margin({ top: 100 }) + .padding({ left: 50, right: 50 }) + .height('100%') + .width('100%') + } + + } + + // 注册 + private onRegister() { + if (this.userName == '' || this.passWord == '') { + prompt.showToast({ + message: '请输入完整' + }) + } else { + let result: number = globalThis.Smack.registers(Constant.HOST_IP, this.userName, this.passWord) + if(result == 1){ + router.back(); + }else{ + prompt.showToast({ + message: '注册失败' + }) + } + } + } +} \ No newline at end of file diff --git a/smack/entry/src/main/ets/pages/user/search_friends.ets b/smack/entry/src/main/ets/pages/user/search_friends.ets new file mode 100644 index 00000000..27bdc054 --- /dev/null +++ b/smack/entry/src/main/ets/pages/user/search_friends.ets @@ -0,0 +1,71 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +import { Toolbar } from '../base/toolbar' + +@Entry +@Component +struct Search_friends { + @State resultList: Array = [] + @State searchText: string = '' + + aboutToAppear() { + this.onSearch() + } + + build() { + Column() { + Toolbar({ title: '搜索', isBack: true }) + + Column() { + TextInput({ placeholder: '搜 索' }) + .width('100%') + .padding(px2vp(10)) + .fontSize(px2fp(30)) + .height(px2vp(80)) + .fontColor(Color.Black) + .onChange((value: string) => { + this.searchText = value + this.resultList = [] + }) + .onSubmit(v => { + this.onSearch() + }) + } + .padding(10) + .backgroundColor('#ffffff') + + List() { + ForEach(this.resultList, item => { + ListItem() { + Flex({ direction: FlexDirection.Column }) { + Text(item) + .fontSize(px2fp(30)) + .padding(13) + .margin({ top: 1 }) + .width('100%') + .backgroundColor('#ffffff') + } + } + }, item => item) + } + } + .width('100%') + .backgroundColor('#ececec') + } + + // 搜索好友 + private onSearch() { + for (var i = 0; i < 20; i++) { + this.resultList.push('我是搜索之后的结果') + } + } +} + diff --git a/smack/entry/src/main/module.json5 b/smack/entry/src/main/module.json5 new file mode 100644 index 00000000..6d269164 --- /dev/null +++ b/smack/entry/src/main/module.json5 @@ -0,0 +1,38 @@ +{ + "module": { + "name": "entry", + "type": "entry", + "srcEntrance": "./ets/Application/AbilityStage.ts", + "description": "$string:entry_desc", + "mainElement": "MainAbility", + "deviceTypes": [ + "default", + "tablet" + ], + "deliveryWithInstall": true, + "installationFree": false, + "pages": "$profile:main_pages", + "abilities": [ + { + "name": "MainAbility", + "srcEntrance": "./ets/MainAbility/MainAbility.ts", + "description": "$string:MainAbility_desc", + "icon": "$media:icon", + "label": "$string:MainAbility_label", + "startWindowIcon": "$media:icon", + "startWindowBackground": "$color:white", + "visible": true, + "skills": [ + { + "entities": [ + "entity.system.home" + ], + "actions": [ + "action.system.home" + ] + } + ] + } + ] + } +} \ No newline at end of file diff --git a/smack/entry/src/main/resources/base/element/color.json b/smack/entry/src/main/resources/base/element/color.json new file mode 100644 index 00000000..1bbc9aa9 --- /dev/null +++ b/smack/entry/src/main/resources/base/element/color.json @@ -0,0 +1,8 @@ +{ + "color": [ + { + "name": "white", + "value": "#FFFFFF" + } + ] +} \ No newline at end of file diff --git a/smack/entry/src/main/resources/base/element/string.json b/smack/entry/src/main/resources/base/element/string.json new file mode 100644 index 00000000..af01dd6e --- /dev/null +++ b/smack/entry/src/main/resources/base/element/string.json @@ -0,0 +1,24 @@ +{ + "string": [ + { + "name": "entry_desc", + "value": "description" + }, + { + "name": "MainAbility_desc", + "value": "description" + }, + { + "name": "MainAbility_label", + "value": "label" + }, + { + "name": "invite_str", + "value": "%s 邀请您加入群聊" + }, + { + "name": "add_friends_str", + "value": "%s 请求添加你为好友" + } + ] +} \ No newline at end of file diff --git a/smack/entry/src/main/resources/base/media/add.png b/smack/entry/src/main/resources/base/media/add.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5020915bd890bfc87a6c515898dbaf4ea5146a GIT binary patch literal 1180 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>U&Kzb-=y3A-&*(kPVslH!lhvfLF?xoNBT@S#;|ls?xZ-6sGr_N zs~!7XkDTXGJCV}xchbGtp0)yl@@H-=J8UHRpk>MOv~7NFM~scPz1-l#W}*6W;>@*| z1wY>C$+hBP?pe;yY?AwWV!Qs*07kcxg-ijARlnEvuW#ovSjR2ez~#Uy5y-&t=B(Hj zhA4*J3}uXaIBvaQR1n~Jv-b98-Z_&3wHQPby5ev3rivfXYlsCadBe0v@7Qby|K(+i z5*Q>H*cupt)PdJg1`W%Dtpg1hco>)uFaW6srMeOaF0Y)c0aL@k_F+!x!FFHWT|sO%mEpc<7yh&HrGD*OQpKfy{eSp^d1+OJ6ODP(r58*wdivt(e|_I|*5~YQl}%%8 z+Z2EL<;fT;{kK`K1$UG_H~QJ|dMDcst(U(potpUh;5yeMy(_)vXE#(&I_JAr^5g7P z2mW?g*nj0K<}C=m^mL`Ua$T_K4pG7IW%m--G3t4&`f`4&4cC>s2kx%yH@?nL`r^{+ zi94->-~0dBAGqM0wUtr&i>o@!SJLI$^sfr)#6+)mkS#RMzHv2&nMZAf^Nee~mNwD) zf%E+Xo=dOQHF}bz2ogU$<5l*9yOXx*?>x7657$4%m)^CqHtFyGr}v4O9hjv4=lkQ2 z*AIO3No**L{UNttYW%j}b3z!j816IoR5XY=a2IrE+%5z~q;7-Qf%J#cwxEc}{a*I{ zWg=2MN$%nLh9|rs(HD2UiP2{6thEdFX>O)_RaN(IwT3NP@lEW^qKTkOPh8v+s4hJ;Y$o1 zd^PH#sP19^i`&bvFhBqjb=Ov9aoAu*j`xfK6cBXK{4pOqQrvdZ=|vhGqicw mwkI^q+nl|I7ng=Q#(&fJ=0BdZ#}ruHFnGH9xvX|I literal 0 HcmV?d00001 diff --git a/smack/entry/src/main/resources/base/media/back.png b/smack/entry/src/main/resources/base/media/back.png new file mode 100644 index 0000000000000000000000000000000000000000..3b18202e5efbd353a6d789f8d3d03ee364508781 GIT binary patch literal 721 zcmV;?0xtcDP)Px%i%CR5RCr$PnK4ToK@`XT|F2+?Mhoktursw^LemIB(9+sYQwnyLA~vZM0|{DK zh$4cDMS>s*3Zm#0iiMaWMPOuL_VB#*cHZueGdsJ}-t4~j`|W$PvvWkv2W!rcMnF>m zH8;?-K+Oxl{UWH88U!#4V4dVfXu_SgfKuusfK>pW4EQ|BnUEwn6OaO*a4(UZ3Ppkw z0X^Uo?p2awAxJ1)fCYTQJwWo-w}es!2;epM2a@;E2oS=5BRS_AUdJz`0;&pMihwG^ z7Zy-;_(B3=fX^);7WiBOVuBY7hz(vOAVzp=0kOhc35Xd!Q$XzSJp~BicS(+fu(y}y zkoqkkgx4`o0emHSBu&8g{4N1G;C(Yl<1dn&PA=*YPy_gcdz9o_#~PrN>I1O%;s8@> zwo3Ec=Mn7+P)bbzSg8_4fm~Asd;HFi&v|E7AUMZ!Isq~*1v5#~Cb&)`_-TH6s z1M*bDGJu;3l+JgO7pbqom&ps;A(&HM=>zC_DlCwo->G9Hl{5k0^D~dd1rmN33IBaV zN#bV;5H5_rjD&xZBz(@b5+IbY3E&IKzdpfiV_ORlO4u@$@MxQeuX!Q?LJ8YO!h

o5~TBuP*q^l z@^sz;q04Cmg#LtF=hsw#Yr~=6zo~%GpOEYPYF`1*7f}2`M|B?k00000NkvXXu0mjf D>O(NH literal 0 HcmV?d00001 diff --git a/smack/entry/src/main/resources/base/media/change.png b/smack/entry/src/main/resources/base/media/change.png new file mode 100644 index 0000000000000000000000000000000000000000..4345b9c21a1df0086e01439a24c7e07c06f08e9f GIT binary patch literal 1451 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 literal 0 HcmV?d00001 diff --git a/smack/entry/src/main/resources/base/media/refresh.png b/smack/entry/src/main/resources/base/media/refresh.png new file mode 100644 index 0000000000000000000000000000000000000000..7046e80b3746194c05954cfe85d0d95e33b2dd96 GIT binary patch literal 2033 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 B_Rs>x)$+P;M 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ⅈ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

WYClgWYFp5(aXY(EW>1f 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 z zZWt;#TYcxYa0u)2nXF&pnrT{jTGmK!Gb13jW2WT5Tg0NtFHKCN1m%H za0qXr>6>1pQ581_*0%1!PZRdBq5s zcyb|`KLX&pDQ%g)-&BpX#bqaKH?V*f=*Yx;iq&y#t9iy+SHZQe{KRwzVqxFJiXo%* zJOD;-#jU9N(ASYM&G(RTazJ-N&Spcc_7vKqNuj)n#$N-YtU&q^<=kd31ceoxkP{IV%u0(vHiDhoa1S!vF=RM(_wJ6<*Mw2*eFbi)?kzDNlYcp z$W`HT7?}22F0D@kg4EbjJ%>!Yfq_BF+4_m6<0%>7POeu72#*WDtEIjTs zzh$aA-kClzs(|Qq-D5jw+=f)P(AH^1yGd9Z4NQ`YZl+z}Ec3fOL#3D%Y zI=?R&a>bIq-&~n{1gDdEJByfY|6XucS64v+xoJa01kzvwV0bKYjB1u>YtFmWc`oF+ z^V(Yaaxh*IA#Qork@>~&=Jlrhd1OK!WPf`V46)=)=w5Rc|Neo)yRNqUlSZnmP@s^I zklf%we!;Xq)>`MnaR8&;)T8(&Y+iv!6RM@(o{<3`Af%%1i6aXN`vmq{vHPW5I4Nzw zvS$f%hFte^<#cTR{YW2bou!uZ^X$G2$Osmz0A=X!3O0cPV7FV~UBIT^;C!|Qq>Mrh z|EH-d@rQE#;zhD_E0vOzB|=4ueV0fYWTZ=)GODqYWE71t*OG2Zh?H$aBPI#iB4%`5 zT|1FwjHQyDv1KMRn0scrpWo;A{sHgj{k+e4&Nh?9eTE{pmnBl z^|Hzf(LE{Ro+qN>Qp7(_WV_9Nq${@#cF<9%imLBXNqM$~OxXzjZ>5j9nJt6KX zK6b@(=-M6JciSh^D_s@2;SoX1X?DD4+IH}-UIrLsc}a=oUy91XCL2;ug!-Mc*iH(c-I;n7t=d_7nNG)ziVg0>;Fp=1rj7i+6)C~fi_Yq#L)@S^@Q)41 zGDVReTxhm*2L3^1^>Xp;z=7qn2XtpUZ>tlSZ;0sRf~*?Be(w9zfU~f{JDC?&9(V&b_JHzOQm~#jO@^OwgDIvK2G*bMR~&d)F#i z#EN!Dl9E3hWs-2yd%&U7<$|1l%6UK6T0>`j3KkWi)8Kad8j2TB}0j}wb{*sT{tBYPbR(W6L^-LC< zH8`x<*{P|7|NBN!y#X4{$;nA{Ug^C>N4DvJuVGg&)p?*{ny}W^=cS`!^^B=NogtjX z+xh-OF(~xD_)=Kvq}TP{!YeS5ZC)f*eUxDOMhZo5v!qplhUV}+MC_G8}&yXHxPx))15ZvM0Xgb8J!=^ z{Bhzk%{qPP#x*`{dMCeUL8d|%>1q6ita2o6+!+%>MsQOe~%}tBrc>$fAxDF$w%?>_DzyUszy`1 zDU0c|D=^o7T~KguM3VZm4pd6Bccno;+<3Ua5IY`6^Ye*Z3=#WxyHraL7<8CQv@6=uyK^K2#M67F^HYK(8R6yzc&-*Vla@{fyc``a`j(82c zNqDd;0jcy}f%v5K0-3B{ly5lU;d@;qc(4m=+-(wy-B9AczndBR)w1lE1&4=)5jn#< zMhYo@gYiywh`Qk7SR1;`Cz)2%oT4=~h32y1A{xU&4Y9iu586N9>B<^S^$TTGjL8|h zvhFJr-?0X9*}o+LrKQIR#|)Xp4VhhmNltr4rIK_#lH>*`V*SbS@p{g13gyn+T#L$S z#W?k3X)N*}d-Q@~)Z%;{=2CM|DdJ&rVN&i1gyOr2v5s3p2kB*f#aTXXaaDPU$L@Lp zeMM6q@?ra;68-7>5;+Uv2?%!2ZKw!YFvu6&h-@-l2^g?mF(KwJt&|VfcAyO zLzZ5xi$+UT-y<>yM; zGh^qnmyN|6mIbvo*iKb$dvZQ9Fp(@Ks!i9PE7^7ICRr4lA$H%-K&%8C;uelEynE39 zWJ6xmAu7^(ab3P_e@kMto0oj6nXekfWb$UrBVLl*Ap_e@Lfi)$@T9l#*yBVTqXL%4 za(T>z8|>sHCAMG7?%l-8RFd4e#nK*UPG1j&nKifYjyi`|mu zScud}J>PjEKvB+ec3nKkiQ5tl@0W=uo9)rq$O}o(&Vo9BQUZ=}$W-w_C}bC@q17TL z>%DG3`ro;8C&Z(9SL2hzKoMh)zlc3@q0ogQG;&WibhpKMqvh`jpjkW%m2s(AqpgMz zvGEE}ltz5%W%8}e8T#$%Uf$Y7?rfRZkkgswbmB3HC)FqEXz&qOmY;aksC9p%0Lc!q zuPOgSzGMW_Q)5#T3{#(rW(wK`0^bbwh?b^inqlw)oZ;a#iNpi#66zAH4IDQ`)Q=rI zrmI`eiQ$)f%wNCW35=7Ht3WrwDmdc@EGPc^<3v9Cg`Y~LT=|o&$noiEP_bt5W#o^C zDTELIHS`IX!|FVTsYvndg|?svKmS3{TtpsI1?vUQXf7=&S}Qk)uWmdo{7?NfFSJiJ cO>}ZihCQRPq`ino>)<(a>a6*jlP=-^0^D$lpa1{> literal 0 HcmV?d00001 diff --git a/smack/image/10.png b/smack/image/10.png new file mode 100644 index 0000000000000000000000000000000000000000..76868618528ab3babe8ccde341ab552c5c24c7ae GIT binary patch literal 39263 zcmagGcOYC{w>Uf^;z=YVNCYvG5F&y^jW9$Ky+#Sqd+&V=CL$t&jNT2RMen^u^g4R) zy^K1HHpX|z^StkS@BQxY{=sq1*?aBP_gZ_c!%sm@{Khq!YakHlhNQ$>MG)vR@N?bl41mUct zv>;H_p5$8*WmoNuQ>dfnV9m4Ji6O_rhfVd)H3MAu70J+OXT z0&U$>0w-v?NA<7nb2H6^+z*ueM9|O3ZLLfmUl3^KO~7!KMeGG5KA3J@tBpS&?ewBrcjI1M3Fa<3U7@^=! z<9o%EhFYD!ZfjS*LZoHmLFdygIfB%05aqRzH>uX&FULY)*j9&_`4)u5RW9@HnVCfN z1E^=+gO}w7sg(Cd->Cl%h;cxVJRg0t8_>tS>=ahYzm;5E;43v5SEeww6hQg4vDlhY z#FWg5Pqc*lQH*|4q9W|EViha7-^wqEGQ2SL*rRKix~lw1TIw-38Eh(NIX`22Wb0}; zH3LQ&ZW39`t$Gu5?&8K+c0`0q_(Uuv1VSI*8UCAtd+FoI*oM7RV(pqINqnVc3?}QWq)IL&{Nut z6~Vb;6+@#Mm8O%Vbm3$heSM=>c-=PG59)$T6H)>#maY{t8>+s|j2)|Kn{+S&h%`s0RHu8{m#>f%zR!?GNmn6Z>mU;6AD>!JRJWJTO)mipUvF<2*_Z@t_qm5};1tW|Tsd7$l#i6*eP&8K^C zS+c5lLeqOWs4UdYLfx$kE?MSlJ|PrBbA;lJa+)aZ^Sa*eNJ_MKT*WwQ(EWhl%Y02h zM$5^8bM(RB(q4$xaNoElUFf^C)SNu!3(NrCykm7BYfFm^WQ)~qR}2ziX|-PY$;Yf@ zBP}allMzg}j0iC?Tff2@GXDN$5I||CmZoZQ)mU3#T*WkU&ElGM?gYz1gB2@X>odaT zAlBB3kRQzLPZvwWNe!dCAOjPjVXQG#wmhmGN`c>Fb1qP98hew=v>yMdim2y7%alpW z*v9FnNuTdwT^^r5vs1*qG=In>HEOmf*E4bR+9|4$7b0Nv#LuKO{p-f)Wb9oiD5X$?;z|#wykW3>6}z?x;}x<_(pay)rqOjk-Ya z6xNzwX0>X_I#|rz!RDPE|K4bx9Z|@$IBRa`BO5-Pj#eJEbWV?HE@gL0zEyN^AD_tJ zy?I5kwYf<8p~rCp*i!3Qu{?2bkeG`$Hy$Y@%C`8 z+ZJRMTbFdn7B7UMFai0DTm91U3;g6ZV66GRQa*rjqLUQQO{)Og17ecAFpUS4*I+*f z07pRguZ!-TyvfOUnNo0{J?ChR`;I+J!ic@+@)y+!%+$(}Vi8~E!)QTtJA}4-B>?$= zf?cQD^{8mFZPH?>HHGuBk^dj3^!@LP&Ii_2@#d@C5tw)(8R1EYA3YvEhluMyWQEfd z!N`a4zFxF==j{lNgs~#1>ApMPC7;655+yhXTl7R}FU~!N@@a;PaIW!_mm0(1$z0)L zCWZ;J{OCz8$E{0HIZ`lq+`W{AF_Z(Rx8B++v8(|*kw=ErQ=OHc4o+@t(Yc=`&$nn1 z%8(Voz6_5{hRTpWmDZY=g1VfMa9DZZR>cm=PJI#g_|JA(6Wr1kv!-#~FA~1K)r+2V znEQkvo8pJhd?_M7rLRzbP$e!M#qVbEv9EEH#SD!MG4>R{@u&m$HKvG@yq8?+%MlSz z*i%oToRpmo%}0TgN_~fe#UbzWIqvpyJQo%5aY5BzIe<5a9Go$lf_*;ix*(2rr%bum zHj*UI)MBu{pPq~~$(|H(FE$yjl#)nqAdBfGLR+Si;Y05$RvXdC{>Sn(8DY~)Na+f_BgYfOG=|(-RdT2Er`|X8SW&&7m^6SNW$LjI@K3-T&|9_6(76!2E~Q0y|2orH2j zd+|@>lh9POPd=*z2g4fd4z78n2jG4^l4W>HFYp5op zAB@toueH_&3s@HU?k1mpc-b%^Oh=Spow4JBsP%+Et?iS5hi{za!H&|huGl!H4U~PI zIHTjpiBrzk)4?<~SYd-_Qnlt>XL-ueC=s9eoj$hk`Q_L?7kTa>-oC*Xqth;wV+pBT zd&aA0g7HVGgjLe!>TVkx_Xir+CQ*0x+JE-sQFhW)rtVHal+w--2>5U;EHHc4=zDtl zb--*Plm>2dRA;Lg3?Q()X(w#Y;5ahx+0uZEimoYdbKc57Y0=z7=hbklwxl$lD#u$q zCBhio4?kH4VA|uD6l@QQd7PtZEifJ5m+)PaO|pyKvL;a{CSPaz*}_{k`Pt5~>x@c` zyT*hor{4-z^vAz6AEGCYdE_V^{(Cc+Zr=Jvr-#=`fh@qTNM#oB{Qlh;CwRA z+>&x%DOw~NHZ$CjlFHh8Y2?$Y!jseH?>eNEIA{zFTNE_)eLGuvP+D#YEoEgYXK6TB zPE~qZQ?t9xL8~?(mQmJ1yPAZ{TpI6b3~N@1oDo_|4d3%!Zeod>J2$>m9dzJoo}Xw` z{65u;K1$-$0z+a`b<2!>k31@VRTq2l1RFe5%h1SVbVg`o zx7XZ=y)>y<;f%oRC~O{BekO%2SmqPUMHrY5oy!$5neKFOKh&DVS>CLVt!a}*wlX!% z;h=mv|JKWZ2}kM0k@sk%*=?L8*FlzXW$Fkd^%o8~T5!6P`;x5)CiU%vnk!*oB_gJK zG8rD0aN_&!Tm}Xjw_OhI!z(v_1LI$pY2B^*Pa_o_g&e~)qpkz?3jFz)(pg>-FkkL} zUG%a?<0s-}HnpqN+H?3~mKQd8uv8r(@x5FNP@BE$2M$JU3$v$rk3#cuY>hI)3MNtP zI_?HpIF5e6L3>`VN>3?(NzwdsA&#oN+MUoiRYg&iH$(u^^TI5TpB*&z)qR_W2;)~O z{B*ixaZ67z7I55MhW7fgq3$j$)xl7%R+ZhxQdfN2MQj@r6FA<5!dQ))dd8yYCnn51 zt5Mf;C#yHUvVy}4Pez3bM)7?KK{WlCV5{9a83qcQ(#e-@_{K%F6?{bQXOUZ_ceKIkc=xBK8$M3+*e96`-)}mThZYAz zTxNzGj@e_=8`>85y3cY2&l<{5@a4(VaUHYq?I`{v8?6rlf`Yq!r5ie@OD={ANHY58 z>6oKP9Tt>u?GBSF3rZ*Jr99G0>c=w54xfe;|`@Ua{%I1ekIbXyMLFI7sH>AeyIN@IdU3NOw6(%UKYCdV+_qWb1 z57YK!oEQ~r+|sl7zS9fmKGGeE?Kf#Vn!h%;7#^JU@C&JL+fnlQQ-{V7Ov`Q10%H0H zaoTqban#Fhdfl~aSe}JnPnGSL5w*FbVcwk>aX48~6$_2u+xI0ENoJ}3SHh|ltKt2k zgi_jA%<>Kv#^hcNpZkclqjB`qd&&Oh(qkdW*ly@4t|EKKfh~qH2`@UHrL7ZFhJvk*+U)T-J)QIus1=KJy@zUfmrD51*>uyZJ_c(QU*F-*%gK`}!w1nRl~^OL@6l~pjPx_36pLy% zf(9gJeGGOWUF*X(&-&XPI>20awpV*26813ZFt=6B2FG5`m1F4lQ|rYa9g(eOJ^Onh zm2?f#TkyAQ5pDT#ck`My&ZKBKEFi@a*F0d_yvzRlk@vywPrRFA)i-F{13nR0($G2(#>!}9d-?I3pbD_X*dQG2Ex^88H+ z&l3;N|AHn6V^M|-kWx*JNk-I$;)oIPMo~f5ke~~nN{iuw8Z5gM@;=83y^yvL>^3Z~ zRFc6*F=EU)G5|3)9+;%`8xYHkU3ktr#1NSJCgXc!iV(S9$pN=&6?Kx#-*jSjxE3l3 zEK;(P-fi|QJSel`9J#BdR@T5Bbi!wHyfy83Dk$Lfx@W#E`JAQ~_|};9zh<~sb{2Za zaAEyN$vV)vS)7Q-p9c#s;LZajO%o?6R=rX98{Rl(7dyqrSdE_-;u17lMj0R=5$}T> z8<}1NPa%y}O|4ygVkAn2-mVGYnrqsoW|VWmx8)Jch@qwQA3$Wrk8dMfkoNwkcB`WH2f*Q=m!6Q4Z@&nDtb4jy#36kiPWTA%)DT*{B z84uI=`io{&#nxg&CAmmc5u86-Ld7jGfEpHT1<^2Q1(I}~YDCs}gt}pFDN(Rj`4~Xw~ zHKQ&`7lb@f=C2Tm#kyj)aA!kvd+G-_%rj#bE6SR_WMiW~bJ`ddHa8c1cf0Cg%wEGe zRC}L&!`o2ZdvvKl||Wc@|7v{T@yNTJ|hm$i#Y>IIM9;OZ^YFaA=Jt4rXy$7_e%nPv>PP=v|k z`nK9P8ZoSnX$kHZ|J+}JDuGGp~bv_tH59PvBM|c-*eqHweoxc zS7`fQTg^WFM#B~lsz8r#qjsP9(7|N%77{Zccn#InKT2wgPYkKCTaK;(kLhFMguV6R zgdhL)-(efM<3UY{fXcssf4m9!tcD}P&ntjuuzv}^@^P;J!cpO?2`Li*KgE)cA%4tr z?r`n!Af=WgLK(V09{4evg)?&`hc-KEvTb3r#9xEV%;O_9gVmksk+m=Kmi%>?A=!9Z zZM((OUapj_-QF8p3ose8M{e{C+wK;fGxx{DjkLV=li6LJIm3()o3qEgxDX_~#`=jyTHA zL19a{%`HP^+_vZNmB%6$8Ul+IMNT=CrB<32=GlQ3d{v*U!ZoYxVp;Esms$z@5H-8s z-~KsPmanZ#n{3z8O`y;!XVoM*gTHWN1sll8+TXn^hip1CUZ_M}*F0$QT7(O@Vj_vH zPy2dKBjb-TMQ`@cROb$fb8jeo!iBcP5l*oLqr-}Hiy{`oo-qeQSgVyD5BABi-dI?$ zi#N@A6yN%Wc09Dj(Qx@Oy3GNtJAEJwQ5JwNcsX3*bvIi`au5SY3mmUZ^y+leO}ge< z@m@t03mxoc2~4|M zb!Bpg-Ftb*>q+C?Rug+sS>%4+8oq1G2U@$5bfup8=qpgqA3M}8ZmpOj|2#+GwfoHS zsNUoQ$aYXxq{-RB=w!iijrW!`Eem0IW1OG?@f14m2;DPDLRwq>?#jFk@AbTB;q4-c zvy!u}(swy^M;mOc@1;fL5bM@88>U;&S*ExB1w2pY=qsn-XUP=Iyl2PIjNo^>xFLZP z>*@_TmaniO8#Si`kKF6Z*H1o)aPlj_oZx#!gnTGEb$<9Z)jbUa#uBHudYr3Nw z(H|<#DE5W;z3Aed+%xgBpcmFZu6?vikpqK5f4BXu)p3HqDD8GZN{zsS-nh#jS)v`D zyqWKA@Rg4r^H@`6EL2CzZ)k3;5nS%-P3XKfvWJ9z&o=iLd#I>pmOzja-5>dYyn@Sq zFjTSp33>3czy{YxZinv#Q6c=|AepwfVFKXS0fEfba|`;fYn7e9zXeiKv}cy*Q(%%> zU!bP*Ur&$%J>ocBF#9T2!YHC^$Vg)~qCy+UD`{uApzEE({!)uOu{bqBFnCOBiNDZX z)vD2s8F8KW-n|clOX{~H*=ZEUIOUKMZ>7nd8E1-fLL9`dW&OC3n>hbXlIq4|t49Z) zyn2AxN`pUM@Hle*Rc|$>TfnV&@j*u$X2zRLXv!1ynQUWbZ{=x&qvm-qVS3GWcVcgx zmD$~tI9=R?I&B^ZX9z@w*@BH)tJ zGjfwBbp%5~HB?db)Aa%*k+N2qC^B-Qt|2Td(^5;SK|Z4VcNHqfkx18_sNBi|&6yr3 zc#>eGao5U`Nci$?1iShd*Qhu)eUxeXk5+WuX<$DJnZ=UL0h6=2LqT7@rBTs z+${h6nASzp0LhnK1|i7QcK~Y%%c~6j$dry4!H9I4NN9wih^al@w2_uzL5&AY(Hb(jxPV+p%g+8|)fmDi-Uo6fb9=U2d2h z7_zd+ZA)BmuhKcdG*aocw1I*BZq)0ieac$va%?WUD+|FA@A}sw*pJeTn%k5lLw{uva&hw!S=iHI5e&B}nvDaB1&rG})J-QIulU_M9B}s!;B;c_2!? zlrBQXgtBad7TQen+e`P*qSd76&O|Zn4vqo@i|+R6zF zYy5QRo$w0<0z%}zesscvC1I95?hc3S$pFV>x6qpBa`sNFlL%CW4g5O2m-qYQs zoLd-uw=4&4sU9DH;V`^pXCRE&lhCSo4|1J?IXc#6SKe5UyM8h8(F@6@cC_MO5(8?ep+pOJ(KA zq0UxlKxjug>SMr8FS;KiaC9|fucb}tJFvDgx{Zq_t%Rb;xAqZ1ix}7;u4T=D{P_Z- zT^@Bgm$=wyKd=Qw(NSi!S#75Dw#5s!AxXCk9hl`apSOPkm<=cv2^BkcLPtSfjuTIm zJp7oxIb%Hd3Ds&7;e}y=|CY+{IKkiHlWp@^<9b5lcdVY#lihB50so_Pe+w7zrmpFq zk94ND&AwI&E9S$IH`&%`h5qC=>LhVj0ErcGFCSq!LM>dPOc2H#ifdK{d9f9B6~VZv zrPDb?$iX@ZVMta`Zl~D)ud+bwmpVU~BO!E~;h+cUzR>tzwHldzwaV|;vxu+@lJRCy zDgaMzLhpI3j?~Z?uZZ91BACO|0W77hYZuS(Hwef&MEwo ztwP~3os`GY{hU;2`rvmdCk{5l`-;=EzIjVv4_=$PA(wIyuISpN1;;4<7{rUHPuHsu zLgjLrTgK$?^7tZhMb?x^H=e69)GJxb$&%;^bIrB}J&n!Irk%gT(7N@Z{kctSIgOd6 zLE&oGVC#>H(bcEb75=&t&PMRC9Hrc5+08s%2PYY@b$~MO!H8(4HFl^4mvHvv#8J8A z=yGy#$He?=z?2r`z_LP8-WmjeaICZCEm{`0zf^bZD6_b!Wnzza!i zJX7VA40E|&5!wioACh@krP+ORYf?=dMLlfL368N3lVG;zj-gSqtxjfC>}T~2E-pBV zxhJ`_Fi=t6lpjB;Dn9Ysapc2@S^sx~48Fk0$I&HqLb+ns@O_nwlzq*>>2_Rf6*YIU zm+k2xGeUz(JePs7-HXP)(zjh#Dtz#BKaSub-43V4QRt zy<-!dUpCF0j{?v)RQZL5)g%_|G}Lpy?xL-n%9sn$-gZ$9zj_E;@3BuA^~LD|WuC)i zE16{;uVmTQf`=5XrYx~V(wEsAHsPzhcQVX!`H15Lqzs=3G~a`6s+B4Fy3V{h!XQKZpGY0ShEf%?#v&Zh9+=SIE@I_mRoYiOJ2qW)Tuxk%;wjAXTbA$p=M`7F|V z_E}DstUN7@BuV8})P-Fe$;C@FPV8uecBwq0U8!G~T_D&^B@XosC2ozp7;s+)(8d?g zkM01J|N0X74Fdi0`){NA_lSYs$YCQ7P59}4uGa;GS2feS^Vwu_VBJe6yf_DYL;2l9 z8}Wm&PpWM|d@|EDR;2krXks}s_1F1rpa81#cxHis={~b0`#FU3Wv(>*k7drWG%1Y} zd{zHXbCFBKxj_B@kvM#mRvaQvg0)gq#0k(tms49a1!> zOL@e3R$1g)fE4sqcgfRw%4P4(*&bhP{P<%ianwVA?cV_5u*@wGq<#Hw4?r?}`eY#8 z%6MlqH3T^V4UZrIwZ8EzV7?{q-eV265e{7`=iBj>Ca*)r0-5DzFwQoemk@NHY*Zhm z!NJUNTGl3gM(;;|ny`}q=k*-M9achj#8I-AFPVEe`F1RB@GtHB{%Re|%R7g?rdY5X-lQzvVIACH(dRK@vR($>nXuFF{yZ*YDM9N(X_iJZuO zt*hXsR#jTkKj>Kc<)z*40u#e$(0XdWrZZ{%Rh=gIPQ@VvGjFjR2zgC?#`P-aVaHdifV9>as(Q%fh!U_I~j)n=sbW9GBo%SF99P zC!P+&>Y_=md$GdOWoBEz!FIi<07%+$mj&OImjfg7<~Z=j^Zy9>7z1c8^g~ua4ly$hWjRR+6PVb0!ue?)Sm&_>rXi_X5qQ}K}Ev>Qowz> zqQRn@uJ$Z$wq!XVn-9_Z1yf86`jwKp3$BonZk|!R=6Ct^wapkLHB2UTyN{%$2|Vnb z5aUV|2+24uVG=0pcaeH<7nagK5cT*cPJ{|`J(kc4t1l05sa0UhZ~8PR)L+ z1>-y1y)}9m$RVi9sA z>!vnas&z;4g9q8r`J9@9lcCzvO;0)k&|~?G5eNO=>AkZR5^tAoT5Y~MyMBW$G)z_e zG9#&=!0vX%n*;W{-A~-juz?tk5E?&rMFwx3v!RD964k-&aKWwDENA^tD*RGY zWOp5|9mtxc7lqxIFJ**HrR?AjDkDyDye#GI;t3Ou=ms)+++y=S0(k{U{SE^Q-scIoh4W$SE!CU#BbWg$wp{y@ z@4RN)8`5{Ag;l6@m_%9!2|-dy_p$C<=-Lip9^2CoZ}u_M9xHRhI%odhw*&VOLOVLX z!=3cirxT&VhZ8_)A>uB0;GG^q=&1OzckHH`Qxloz)8Ls6m+5^B^0vz)D=PB64nx-_ zeB~C4@b=1lS0?f6saC62C{Cw^i|USxnDdU}faKLZZL3f|UTv?SzREL#dpZ){j zQ9z=iXo7#7%PklP)E_uP2#T_91mHQ6G$Db;BGU}pi_!%Ml+ABIKn^RW9O~C(Lv0j% z?YCxi`lVFWF=QMxlKklWJ;TNOKDMOP*%=A$vBcX1oKn*K66juX5NIea^v~@5y^wTl z$64On_cagen^o9%uIY;=#);`8B0!-0B?-%I$&2x#T+5~(8^LS@AO&s*w@Zvz)2pD5 zKcf4IK)?24FhT&T{{Kdm0Sf}9(H0Pco=q-YCjdRGc|E;+1@w#iJ~kk|s!F47ix#Bt zq7hlWGIR+<`P;RC+1xXd89=gCVmxy*ZRJVM*SDQ{PaL;ijwE^qw`P_GYn3di-j>3YSzd)&;*~DdE_p8GUp%u4Z(tubG#_<^tTW69}|7C%o)3D6Gz93M$TF z?h|2yhUSy6RxXN^y`OTdBY4Hn>NnyrTuMu_J90Lw@e&iAwjMzof8VBZ8k86p{uW(f zj4318J?xm(s#NEa9cCk|EZI%t0)4b^wy+jW0>)0NL;Fv!fEF!{_2pes`}aG&t#hhZ zJqbVB^J1W=r|BB3e_(aFqmM9nvSM!5)uHy-O+L_L6E13)w&3=1ULLQG#>@bl=3|sq zfsYmggVv2+AA;Qa*6)?g>{d)Efk#~ZbczMGdd0me5p@5t9tsP|(<)wNg-t=HZ}5sy zl{z_996q=udP&9@Z5J%oUfQEl*5D7(?s=kgj`ay!q>^t|X6BTK^@l+x4fecDb61Xn zpP6f_#7>3}^_tt^yY~t`=^eznu{Ew|qdB^kX2fZs`IO)A}I;?yh?ZRePNlw=Z3nKGv!SX;C~#DcaQH=((l zGfshs9Wh9kF@f9Yr^T>-OaepAGJpZ=)@(C~02vIP8%>;Pgv zSy(&ou{*L$V&)o32W^!}sQ-THBl;_ZOXfo8i-r&De@N$6tp3jIkmaSAw)bvRkXhJn zZYJYaR$&W|DqhUb7_*PR%H_+;5q@a+N$kq1sP`a8X|p&_UwJp1KG{b}25jfE3qeG5 z{OaHXe4>>DHoGd#W`L5krdSavE2CD-iLbxY_N`A}9=FoLu43P}3r^QtZQ`h2)mIY~ za+4{1%trW&vC9^H)KJ@<2NW`?*e(5|#UqtBegeswScN?G3q_mh{nc;0BM3(HPoM)Y zI3p!haJ+emidv>3>)n&C#8U;$)&87tV0n;2w=ok|6HtYCVzMLpe5?V&;8MWX3VGVg z?LZ+YncRELvgU-ll+HrZe}ou@NX08=N zRHj0m2_0O(`PkegP-UF=eU&i7?2^&gRv#3o=s%sTocb*6qWV>tPqM5u0X%%B=Ax7n zAGybYl7+<>TBfMK&y#eEpeYM^kGS3eH=eDEm8pq#GT--kidgNSh`RI3@&3QW7W_dP@sh%!)Gp_X`?x(goCzE%zR)nl)%29gbSG!uK zI+;oL9PE~qt}brRnx|f{yLk}o5NRVk&mzqJ6ZBL0(Jh$fi|6n#1AV_EX*vp6B@HdD z<;+#MM@g{*(FwK1X%#&@^V?Zm>}J_L=goD)<=d;72p^765atcP#L z{$A-o`RnY|(c5@68>E3(-4iJ$n9&oA=43YAqfnl~mr4D4>1(!DZZSYhW(nQLZ;1ff zQV+3D14^Q8jQx3I$TBNzibxy5r`wLI$vB4uUy3xQn>L0|*urW5m}$dd!Sa|z-e3rG zPIEI-ExRT;EtTP6((guuA*15_Sxrz74K;Vpc&cns@pB~=KH{+f#!$N1ua9{8?h;@$;sAzX3Q;&VYzQk(~ZazXNkoWYy;gLJ`0q+@#Y!CzDl z7|F}urj$)KUcJE^(V?pOh0$B_8IN|DJxb9a=9{yh;S#(pVqsKf-cBhxOof&bW z;tC+3sjYu;dTQ&BI2t+u%9^{{Q`e*aY&Q`Nt1aNjdWj!%cnWrc%!2){K_*svjy%cN z^L3I2(+}5z?xYn~^6w)Rs%m%Bwyutvw8Uoe9b!YI5fhr0y8~G{bdg#<+SC56YM<0v40iuk$!G%URqbyR7B& zWvdBm_7&?mmx`_YonJDnjJgu3C!L?N!e$o4Bw>6>M#<_PfqT>ekixspVMp7a8igt1 z++wsGpIfSWI@;AYcS+N#DY9_MHh}~4K;Ib{&xHwNjD2xG)rVNTHFJ=u7KX; zo-joQTX?`a>+E4v9-%vb2@eKkX!0ggi@{`ekued*W*a;|?FgDV3)|$h8Y#vtv;KU86&*}#==%}V1))pn z2_{9)n@>GU{UD`JdGIX@?O*?>z1Ij~;@fl4{@eC^-Sts*LNReg1A->~dOBkL!u7qX zotKDO+;hip(^>nFE;>k80d`8Q3d++t(8{=Udi&%!V)2P+{`JI9=Vq*ry8g%Y^9Rtw zG^>Mu&4WEcZ$a{I?>=&Ov6$zM+p6Q@k22xy~&f54=tWgm4h8ibfo6*FR^d=G}xn4$(d z-m>7ANkGbs|KSrt7j4J#DhOWbozwU?V)0LX`_HnyPF@t^=yA3VuT}yRxXlb|as`(- zyks&{00OPqmyBL+ky!)%(=UI+;cMjw3C+v9Iludw@;Ufv>YG-c(^I3m+-)bOFNKhf zEvt?3UN!ublvi4$UoZPWvyxgrl6k3SeTf4R8_(|Sc{M`cF+Gn!#{ORbl7Jm04|{jqAg^C@RJ;R58isZT~N?rJ*z@3*%KUPEG?hIzk? zmYS_2ha7Uf8_yiL6XbNwRCtXW++I6ycA8iEl)-stYITQC_hU07*jhniRbKjY>lxu{aI{#IW$u{eHbC6dun%hLyxn!L4W_SmX_jjxsK#2E)1LAaE>`1hmDwJPxVtQ{OO|P%3SI!h4 zqf)LUY8+RIJf4ifypQ#xfsK;)y)qf@w~T1VL9(mZ9S25oX7j!X@SiSTFU0UrX&$5( zmgXk&6%(br!T69Glf?S_)K$1K4D!@-O>kQUcYMRyJTVH3*OVm7Er4!5=diDojEk}y zadU7AE!Yj3e9|$$#ELTB=q!Xzv+Ct})Mr&|qEkd1U=F_V8DT}*8vU*JQd2v-yM}XB z-O$0y1D4s@kd9_M*2fLj43$=kp||=FvA_Ppi4@dr8W*`5()BN`m#6MW)?3}A%eTyW zIw5)M&X~7$z>YP8B|3Nma2A|8Mb5J$^K`uJPNqnbn#iIZ6v+)i?5F#zSycj7qs{-h zV-?<$6W+2Tj=0xv-9uNaj~ki4OeS?!$gWuBQ(GK0$}4_OCF1v-oEN<&9k|;6HaJTA z5?YllCBDsf!Tsu)|%3R-J@j|x>TE6utTs5aZ>@sXmtL`%S4?Td@d%nvKA_~f(8|%3hJ+x^tD(lQPVf0R1-8efm!rxV6 zur8$ip(NpOQWaCo4GUh_nw9Xz0A~Ys+jbudXRuwLaVyoCH>~aA%Y$t{5Oj)2U%S2uS7T(w-d@!JpfCSAeQNJBcL}$Z%t*w zQT0xwu&|KWsakI?dY~$qTP-R`JKX-C*r?6^#VL^U5&c&_Ukf^Lb%A?Tsn*PfFjtsy z8iAs|0+Sx=qkGTZDO66|KL(Pm!7d(Nis6y@8qLi*ysia-?xhPmP%{3~qH0(^#{ zB^7&`GL;4TsCf}(q<5}(c6c59E5=~q0wCSTf*#-cd!l0<5PAF)ll&R|k2BSmkM2E< zAS@t$<@d*zaVDRz{YOk=WNfMlWY~{hU+gRG0YDt|6#|m_d_ig$^`s53+x!#T{Il*0 z4_}>fk3z(HUY#~G_QIY0v&yekf$hdeo4xRdN3#?fscG;7+T<;v+gng`)5ZX&uD5l= zAtOq&fAFFJT3_C$|AN|Is~83;JQ;9L zdyndWCtmCi=zmjxo^LiH0UiM{KXt)5D}fAE41G>Hkm%lm0Sx+IhY*4k@LwTDVh6OK zFs=)}1Nm+Mpd>%@Fm|SDL61%S|IUD{KZ+n30w^GrOD=Fx`a7%r{9rxk2%S)aIq>>rU3)3FtZ# zi)6qm(1Jt_oK4qjpjHB6e6u1!^Or)h(8Zy!8@LgJYq_lbhudjLU6^!>m})uoM%igc zb!WL@;l9|166K_m(Z$MZ&LktZQM{(AJ-K;x9+v2rMG(J7XLT9$%G16P>7B>CRde5N@GPQy(`Jqp^=+C@xK>YlZpVQ<(19XHd*C^u zh{9K=M-o_AUJOkw5T0EJoHWBD)pl(thT%_Z*U*PCM?1vJk9du*Ad5ocQ}=11AO&Zj zd5ZO=lc`{zt;2Y!ojQ23cIW3E0on8)JcI6-u|ReE?}n>VcbF95j`PlW!VTBQe0Yj; z9g4Vlvu2D9iBo-*y$w0buh;I4P}J>bwUOXY-tM0v%V+0z1|8-PPzYf|LU|>znWI;5 z2Hxi*2```%;RK+gP}5saEhjd0N)S@@nym=S@d@+1{rK3$qn|gf(>7s~<8y@;SC-xj zWAFC8l4iFyYD8L%r;c^0rU^VL!WaNtpEnl9ekPWc);qQg|KaB_{{7HfapbANu=NBJ zD%Pl!q6JAsFXwpxml(haP`H|-o>QZ~Kn=){0@y?TowSM_9S=M7sst_-6Y7hM{5qc| zaSv*fzgd-g9TY_g9I&HrPiv(uewYiO)MO0msJslWSc}bqW=1nT@^lT#a=*Xz9QRHx zVuS(0EFe4bjO|SUa}H)Ek-f-j2`P*65}|TpByUTUdG-!Xjh5El6K2Xh({dkW{u1e- zH&e+$`c%MVrn!zz%^K{@2ZwGCagaStaM?{?jyvu*NXO&Q8LA0)&C1}5{!U!kF^^^JpPo`*5=ak$=PV(VyuVtahg8qu2)jPKgQbDNc1Xv0CAfO~>RHou8$ z4)pv;|IjOEj1Z(7GI4uMyE~Ltql?6%)KuGnYuL?27DWz2uj|fsRCd57q^8}j(W zjC8)5y%sBh@$u;?d}C|Tnf=;oMLJD)M2lMgr~xVtGUSd`TZhYjcTa&(cDbYCU7Kmv~+Y%203r58JySJ z9GYpCoB0wTL)%SB8p4tHXnTXHu^YnMzv)Y{`}Twv2nUw4pIxUiEpN7y)UU>Z9|fIGZi-i~Hd%@^P*QzhIn? zyHa#AsOcd4z8i4!@k#bYrF6N$DcG6xcZ~M6vF*T1=rH{7i zN+iIFEBxlW?W~^pdlo9or@$8okuj>yn-MWh!?;$SP&bx@gHVIoVfv-->aBUTw5d8bR=z@UP z&dkA2Hy?3I>7(MET&j%E-0`CGjbKSP8HV+_Ec04Byl8G#o(D#NZ@NNC90ZaIX-3wM zkR7uhE&OuQxtDv^M~l$jkK~)O-8U1{=%xogB>`*)t8+R^;V+a?q8HMB=rzkv%Xa0; z6-I1%dvNbNDj4!)V=KiL-GKNKE~%e(2Nr=lOlRG!1RCzaq;;}HpvU|)Fmez2_!nC? z$9YE+GaJjKc^|fMX(f18_1Z%n@N^V9#c@oZfz^I~)3OUP;<0*(ZPE z>DVTNrH9tsT}pmgw2t*73i^(Hu^ci(#THc*#NvLno#&;4yZJBCPYpN!wlMFyH2~02+QIefTAaU#Y9f?aHpPUDcLmiH4v2@zAg}FJQliF zzEKE>+xTHm2r906$zgXT@5u7(0EGrhS{|yM!X>dbHiV$Kh`o{dMi|)*zPzovrL2}L zygC?Q*?{gOSqru{BEaOxTL}bWdISRiC%XP$QO^G(NW9I5MUNJVOM^hJON^Hc)uf4l z8pOq201;5vQdDCcvPP=pgpC`#oGH4||EF|?{XZXVD4=y>8@{Vg3iu<#Rx<-Y7qmc3jYXQ}+IHan84a%|3fxpxAa9^wFeS_q-0~ zBZ;QIXX(#dZPRf}X@4rMHIrBA+1RDUn|=_Wg8GYV+3;eN=tJoRs3>C}P-Sb)RFxUT zrx)v1lRx(TQ-nkEdt4OZm@2wEPLN^C%&KA!S#@|-I9IMUcX-)*@;|LY+Vbb&*n=~6Z6d3EmptkL~H1mZAt38d@R zMg8Zu2wK4R!LNqvMhBj}aL zEtq}C$o#d+3=oKjQxCmr{o>~%6O~x#cQM*dI5F+S;%Kp%hLQgh8b9+4OW+JSQNq3j z>3t*kCWZ9FlB)M58-3p--sX1Q=v8?~$C(m%IbEwH&CW#$>PvsVe%ocJ{F{N#6yo}A z?6m6K-ESXOnKSen%VwTq%&T%oj5sK&` zh;5gM3O1=z)JN2oBo~-OYUb1a01mLY!WsUouyx=nDdW=UQ4TaTllR_bFxarLm}Ghh zrTLNde)LoEHi^+UAi)vk6q(|Ry&&K#gkP2)d)}OU6)1DKy<@$kFE0mRQxvB?@a_Ke z2uAl&pHl~L)(13s`>WqtpoM{L>e3a+;xRIS>i;_2`|B^k+LUsavv086 zRxf^_EU*}8=+xxO2nN2OUQ#X5B3u0Q4@~p5B8M zr@jxr3e+P0tjUF~9xIXm@m)~cb)T&C2P>C_-7V3IsN#G%;+*E6&{7eW+kx$(1qSje zDua4#U~R{v5KlJdQcczUUl!`!8u|72bdqUkCXlQk6Ws%dvHIyw*CZ zdKOMPGSYvif1-(r4~Wx%3Tq`@+I=r^i|hLG?Gdzhv}!#OjYt`QgqUO%I(Ix|g^v!ODGd3IS;46?&jz=H zAX4_)Ss{4OccPEzbKyfhhVDo1jVOKiMg?nByn0hbMJrkHUc~Q+DD`yV)pY!<(fJcnPsS5!w9uXc8~t=X_xnH9z-?plD>F!rc;{64sKX>GX3L6;+5%; z3W>@O{Uu)TV>!jA!ObjQ2|t~HVkI&TxSvj-*HXj#O@BU1m}p3GhzT-_%xJ8303IVD zS)kD;e}>uhahK z5ZRxsiXul2?{N!iy#BuLJRxb%f(qMacv-O)7TOOsyk?i)d{==qv@xz#&qqf5o}Y1P ztuLff&sayFBTM2S4P-qcWaB2vOg2M|>?1l4XuX{mpR{rF81s96l*0VT_bcU^#20t5 z;f-!54d0Y9aJWF+k-+|t9KKj{P7>S886Tlz+a)~G9x27(>Yrtp{4Z(K)QnJWQ14f| zK@Ty`j()9!%tFOcokBH&5Ak(00Of|Z-Sa_5l<{n;f#7disBN0!&v z^(`VaiE|7gV1u+8D_swWE}uDNk-5fv{)+7@V>&d7w{y#x-@W+ z#wFTq;G{+3j-v7P54BNmRBplJLF3o?Xq{dzGR9~&#T%CJO zoTxW?^kx;|jrACDNNp@5%MJMtMt~ZZ>w=+mKd{}c4TDTvj}PP3ikkg2w!IAgg8ejn z`pJH>jit&*UDcTq0}TV^w$5pP20z>>dD23||Ma)EhY)`E;7R+X+nDMaxNpHYN-I6z zUdwtWsAHCBjZR4^H2S4LolC3R3y?>U#S|0yXb#b?FWEz4gldef1d-%3l~E z-MlXX)V=QED_1HnULGoCg~YAt3J?VJvc2*1R@`X3fNWJlfE8u!gvH=fGYZQ3d9EH9 zqD}9J)==Q6-8dUY2_8Uk`IiiQ8?0ltxhSFdp!fU(fxo3D=J0^Qa9gGE`{*Myok)*3 zI@=sd|FoK}^{H8z1+UGFN9eL2Q({%Y=)Q<+<*MhCOY%8rz~l+1hkTmK;*8N>49JJ(KHnQ6C8TKyC?5AWD?b`dl zmbJMrT0pa(ly1~Kb8DFUN`gAXE3CqN0WrhFgvh%EaHXEOx%NZA;Q4Nsa|bfpX*A*r z0unqHb2|a1mp8b#@lX+9SFH&3(Q}RAF~eB^yr9hF#`QBB>APKXx(>kP&qw|O<-EIW zp>1QcfJ(Sk#`6`KldBNM24uM??O~lYIbP9*is~!JtRY_4z!6#AYx+41Md*Q{vdYky z+`2_D-WG^UbKw2S;@-4g^@wa9R)vK4N*DX{ zSNih8$ZZG~ zi!HOvp`r*qcQ@dg()|d%%lEaPl_VsqL@3>5N=SyFcUVG|#PP0`9e3dX^S=QFIP~@2S0!g&(zE5y<2s1 zTp1pwWi0>ggZVxSD*8Met2#O-)JFg@(inG6^SsxP`W70=o@KsrA)%$)6k1FOb~C* zOC8}L0mI6&RxZ_bL&xT2RL*#0gi2s?LS)jeMOO4m)2ygNFZ8wP`PqGT-Am?B@&LvR zV)w(;{Yo2fDuoDIn3$*_tVY+-!h)nD`|<@CFfDF;c%=HMron@aK7cPjs25?kqts3f zS>YR-Xc*%@qki|?{q>wu_mpc(c?f$eKp+k+GGkooV2PqG2*8^R3%jN^`vIZMV|#w0 z@J;o0!U#X~4=>T=ntLt~&=m)uE;k`0K~!H;$N< zpO;hh9{Wlqa?_5enhX(byqd!OP`ZW>(WWT&P=zmAtNSDSi|jT_#fRd&&h}&3!lA0Z ztNAXG*RDf8e&Y!n#?040w0W!7AkyYjr3GXfMgU2N$EJZ&$HEd*fFfxK==V!|x9F%o zuFnxyf{p-@J--TYZ#VLGkcx@*swy%|%N%-)ECejT#joAFX(yLu2Qg z+6b4^x@)m;jD7Pt&Scf#T|+0TIlbuehHbvRu@j;VL_pYNq9DYL zYU_6ww##cZ>WpEq&0eB+(B_uD?AtcigSL1gw(3+s)m8Sf>Ce zfWown(><=8sHa?~f(nqew&C5Zceu6znY#5X2Xyy<_L_d#IXxj@Jd*(!e(*6WXkkK_ z#$V{c<`vjyR_E*j&W+g4`M|EJPrW^|HF9IHP15xOe_vmk$$!{#G@F_;&vuDH!(xYJ z=gOm-ie;TK2U82YItk)84aX91sTjks#qTbBfAe1$YILb#e*QcZV!3S&B_JLj#{zlO z0#yi2QM?M1ZZG|aF`?u5i}*(hC4e`qfwVP1U~OFLWmY^NN)SFzEznP(u z+@;UGD&kZUh}K>W1p#sLC!?fQdmb=oWI|MciuxXB0rh*|NH`DPY1M9g%&IH0vGwjn zRgupT-3zp@ftzz@Lw;KPO4ZM7ZR8yXuV)_~)lMw``Qs~zL{hBhF|R@&d-7Vr=(*D( zC!ym8=-28%B(zNcdeU$D#%ni`y;i(V_})(8qlU8V6zu9mqc(Gu+SF;K=bHk$>_4|< zX6!d7310A#s|0lZ=+&b8ukk89nPOu6GE*KD(&kI7Z&Z!;%hFxya4W}Saoh)0Nt*)d ziBj#QYfmXkNf;_{bj}knzo$$`$>!XX~;bU)CGmPQ!s0)Bn zk9SxlKXy;e3`vWi7||lv)-FvIKXH5zbU$DykGZl)cFj49TNwv*RY_~h3f1(!<7AD~_ zRA@q3_yS&dNHm0_=AO@gSIiN%juk+DOEgs-{WkIYa9qy%0aY=Y~1O z5bqxN8nY#J*JjVs{0&IS>Rs;gD|J@uy|j7A--C-OS%9hA#b7K^dS^;#{tsW)CPXsO zXueVJM7y6*+M7Vj1}K`C2oSz8c~YWOM3o8d!9T|l-QmW=-DTC4+T(nfP^Gc$QC|At zE!s>A_WTc%ZUQWsH!W2X_p7YU7>PF4l52oz%oPO|1*EB&Lk)Pq4=+?WMcB`nIE}q* zH2Nc2Y<6Hnp^k@%mB_x7k z$0uFteJbxs^FBN}*!>bbhMnye#IoLfZI#0mM~l6o)Q5MbJMo%Y&#<(plw5Ajc;`H! z0j$V=-A{zuA1|RGqWDEN2dlcV$7mgOFp%sYr!Yi6BjwU1~qn z94fr9@C>0W6@A%(r|PdH9>`@i3kKJruQ)nn8D5ly8$Y}=*kD)nWNAc6cjrjedNtYx z?qO3|V22gI)j+iJju;!|g6z@+tldQ{jYPy)_1;EEzo2;PEC??Hjp|FgJ-UXGZFI9* zMwO!zy4QOVN^eFlt1=-US%p>60XoK`PP%&R^^kT#`gl>C!M-TLMR;_~IgBHpHud>? zW47{jJWj5i-$(`0ot+(^pw)@R&Iro?6#;TT=gO43_5}V@w`F?BsdsIA1C3)~X0!Y3t7CGl%{;SGAPeIl9}-BDqbB9Wxmj z2hW=cmTc4b-r!qldf&4)2@@)x7;w)TtD4fd4$&#jgIUj4wap6X{0RrG-~Yy43c8TP zVN+9cZip6Le~g*>m1H6|WE5ow^1xM>$0p>`j#lyIfd%(Zss*ZrPUtW->gr0DDhEWF zo;f%k-{o*CvMW~mTqBT@AMQK%j8P?G#q3p6A>2-MgtAF`WFFs}>z=4S)xtu{WwjkQ z>Fixfck-oDm3g$$b@8SFl{${Up?!6Pg(X)4DOI#uSc$Oz zbtB9R0c${^rZ1phf*OAf>!JbIsy(AQ)R=zvXTprYsH645O_>J@SH6dVUi~!HUg|h4 zs<=x1-qp31S0yt^v81VWD^dB6mw^^Mx&)$ySSU2QCK3_8_cX3&k3GdOQQXs(wKBJ+ zN+q*O@hDD9FITGtUo_BV5XE@fax3abel&EhDKU|KtQ9_0W3M z^ZjV=6qCx!?h#**iKRk_w(UP9@;Hmc_E%bfrXr0;;UWnV6Y%!|$?wc}9io=(@T2xN z2=7^JaLG)vZxvVnd~)H0Oo-ZCTNR@jj|Be(xWL_Vx+}`BK9u=C-9>tA1pre!S?pTjBJ_rW z{vpBcCWN}-1HqD23K8-*wO=&NdkFk;>8lFd`0J1}x)7?Xk|Z!&G_#jQf4^H>Y)5AF zYyfwm8mce}2iHd4Shec|Y z?e9*S#}1e7<4&hpIxHJ5CfDs3MSC0V7!!}ha;;PPcL^xFuIv8{mv|`1aWI_|%5LH- zycomW0SU^d$p#s+)7R;-Zi`WUSh)}jFD4t`Z{2X`fG`E}2mXt+PYCYQ z5Uu|pfE|DDE->mq?_lTCh82L9b`x^BEr;X|078ZU-Wgj2_~?R_|8L(E;4db7PWQKy z>=(&8z4mw1XNu%cxD2>T&LQ$PNj?UW6XWBst|u@@;-3J4lYd@dCn@xB4}Xh=WJ31> z4wCB-3h2M$FaHp7<_2s||DQCU-kc7^zyFCy{lC(d4$%Ca?5tm;)Mub)|DWu{|0Zbr zKf6@k-Ih);VPV}S(W7SSBY@~DHmEhe;$GZg_lEgBsWdX~om9v4W-bfARbT1UHGYGW zHw%R+#%w46vv;TA_Yx9fA9))I41QD^D`eISfDUfg0vYM_U^F1NvFi5wjG^K+n(9FI z8`=*cD%+3sesKMZ-S-bqazwoSw##o5%u3lfU}H6NKL^#bC2Lie6%Y%Xxq%_&RzMZz zm=1l{r=yt)uNDci3}?^tj(_E3j}z@-3Si%qbL>DB*aLZpVqCnB(Bx zgOB@{D*{Jl4a8N*0J&G11QM>QMyf3(6 zV~!R*p_bdtbRvr_>A!)3q}>+3d4X8bM>c!oy0o!d!WK~1Ij#{VlN)v$T!{#&ef|)W z#hAB(_@oav`S?t0MhicUp4Wl7^|r8-zQ^I6ytLm1UIZl5y_yfJ(as)4!|WdW>pHyW zTE~{80ZjFg6F49`df&2{B{8vfn&y23$|8II+4fIz7QbI{?D&gVqk!7B*7Q{`Xn~^8 zM)VOtzWS=L#XpUHeKSVs8f#_BkYXS%dt0H1iUcV5CuRPBHW`3@48DKJ1_2*rJj`Gq zVV3M8g))E{BP09zD_$NeA|5BR>oeUb=ysiS3B~()bb9ma?PjCUKk=b*MBnK-%9u9O z0dLaD2j7=8AxAhZW=|OeZ}RXFG<3rE;Z{m%_e@K0sP76V6 z9_(q>Pruz@Yf7v?+;ZEQrkPLMY@gXbm8{yYxAf7oIY%N+F-jS`(>gd?BFNcu${IsY z^yuh1S$MX48h@~LD&ch8Hq&rm=d(9-8%aj!%{w6jFk{oiNFto5c0ua z8Z}-wyApGbUx+~bYjV282l@0{HFV>382t-)t#<8N3s5e$&_q0k?6Q`OtLC=RDRMUW z)OULOl=H=L19!qnysD?)N!7u!%e04JZ_q-f*H+sfO&KSxX>iIW@x8-zRVi)Hm7Ua5 z+6EB!)-PhSx|w=ysko%~Q=6|hL;EuO?lv$Uq7*v%ZWNM6^h^7gLf(WeL}ECt&~N*C zB_To0BgB4r^>s={C6klLASaLT;O*KVHZisN>TwP}+;I4%4^)QIx+r1IDCF>nb`*Z` z%YjQY=PsJuztr=RqkArb$pWIHZr94R;&}b;Rl7$Ls_$W?5mZ_Ztu?ByFwIho8sz5I zY(V5}iC4$Q2^6TS!1dyIgH%MlnJObH$Y%9Vsj_~mboF#<-%FrkL8@Hs`=&{IGnUFN z$14s;qX9-hrS%0f7Q?NaOstmzZx74slNKPKUE@@2fg0qA8O9Bvb(3{}hvJSc?iR9Z z6W?t{7GEo@d$)>`TYdoa_-kcJ4hYBZcaN%9rg_}y3hc5e;pTvS?G!Cy$M(`dfHVojykc1Yej zZ{@*`R9#sflGkZ`fmWX=M=N%!?6c(m*lmsbv)?W(R*pE5iW{GW^$*00T zL$y;i3se&pthT4?{rH*#c2=NI8tg8#Y1L1V3hdg3-&Ubn1g|iKq#a)bL;nnAgc*qWPr3PG&@2+2bmu|Yvv-(`J$U2q1xu6| z%^O>oJd87z%pK{+q&Lxq*3`#W9!<0X1(K(dwee?o#uCBgpgi}cO%SEhAd1OrF*O$IbJ)&) zdVmw8uRH1Dl$JQrV9|+c!kL}?o}4jb^z|u{700&G9zEWR^R=S@wTke=YcE;`0(-F-~e9P zK5oe#8acTSzYPLCQl<48-gu&jQ&$!?{E5Hl#aqNd$Fm|0*jhq)4`+l+PR zGatLntN>`Ww(n-!L6K3L-=0}(@*fskNofJ7S=!wRJJz1gnSy8eGJhf)HcUQ zJFIM|Z~~G{l8tM6ilsrU3B?hL=`oV_ZA5E|~AKzSDT|2&YHTds*d6@>8a7U$* z3Qit;PO10pn07R^^p5?t?_arF4)X8o>zKuP;8iayt#M0?A7N7b9gIwQ_xojwvVX7dyOAEp z;u`;P&c1vrX`c^^QERt>@ol__#-!7}^!J@6Lic=6G2H&UhXE;nSd2mbi?~b2O!eEH ztt&wF&8e0`f8yeSlf6`QbEt=Q-R|#b<(|8KZ*aZ7l$Z4ZB&OGTM~>NI!*(|)Rr;I-Q!L+->mH}DQnuA~7u`#v#% zG$)~;z1`vp8UKw7G^(H2#A1kLGW)h*cVJRDg-F5S*8^bS0rqwt=$M^Op z40p?aY#1B5pb#{2G1iW?|!ndQ)7RXE|h0U9DFP0$WCZAj!P^7H{%`!qfyfoM6IP$jS?x%+&8QhUJhz4v@0 zhhu%4`+yok~JiM@0InQnnj&zJR`{?(BKB2Y7b@Hmygx#ztyXz<#~*)aAF4nLa9 z{d^M3eO#s-6EgMo7?O!VAQH{SAI5K2LdGxXl+Ga=r2P@9D(eLeMxBDSWdoq1)0VqB zhs6_hmOI7%>?mT{LIw6nAp~M)qjY?{Qjb`y(V3{QMdriwush{Hb}Ydr5so&Hws^Vf zSB!!telD2O!jt=jUYlIErOZn>tSuY0xEV%!E=l5`L&zV^6qa%Ru+OB$5;vF0SIp>Vu{s4w% zvz~hQaSD5??k+Eu%c(>7>bB+!{k;v655Xk7@;G|3%V&S)Sl<^*RO>H=th@YWe`3qRVU1d3p#}>C1-_b5S zQVxtE5@US>=SCCxaNDC3Y0P)-++p_FSwkj5GJGIg(0NCTPpr;_x!lWO5uiSg-+tz( zg@-E2zh-i}E#1d3dCj{}!I>N$ZPW4B=MZHj?X;Ly$GXxD5C4Oi$tXYWCf8ihhKI+* zDIeCl$DicP4+wSgWKgX+WC$a25c- zdFj`NVD#l8iTxrPG^WDW7J!`xBtNU1(@CCo9WGZSxfX%&+(6JwY^*1Qa4?-96{Y>KJ6S7<+&4*} zdGu=Fx`HzFE)&R2jp>rgTnMZ0Zd0a0(eHZMW2MJ7mX>WA2C zR5UdJhSWRC%0=v{a~{BipHLhwvB6#qgy&|bs`{}HS)i!w1kP}QJW zwo4)p;t`h=c;{6`z;?0&?t3;?+q4tML9Sw+J=(MiM|C|dQ3?2W{J;YMkhcwXrkSQr zVz-gsSKsdt;K{|B16r=rP`~+Eu?&%k9XzHTFh0~AL_TEssyw;u&lvrJ+kaDXM?xm7 zN7TR7rHPwRbW;3Vdm?2~WP-v(FT~q>-4rq4WtZTU zSEd8|b){N91V^Bd^P?SsD2}IzJ|!Dy?PMD-m6)Az?W7kIhbi^Ebk~Zi9Co#PTA+8e zxTdkB0U^_MnFW2uQhy?r4pD(av*T<<|eh65~o+R%zPBJgsQj2z0M`fp z0AezkNe5mBU!S1U7BL%DPd{^N``?SeL8L}2g@%OX{*55{GlFE8eY``n`BJE_U1NS{ z#MaXOMck;aBhJ3grSa8lNvBqvL?V9ij226gJh>~tfjkRNWT`vmHg6)|$Zq;IkXJmH zaLnmyFV|p=c4Q*H;97ZF)PK_Na{upp@N#Z1EnB*{abCaXr9J8k23os#?bJ%AtuWT+ z`k<{yt;cNt`Jjd0XWjVs5nVzx{cCuwZ2$C~ohOm?ykdTLmNeL;gO4R*3s$5r-`~05 zNdqshm_jNpMMkD4ie@2w-i`#Sz5%}nv#*iPKc7-Ln$=Dp(OAp~-aGP!8bi^G+3r&~1UKzQC)% z(F6NzP!feIWV*Hsc!eK@p8$8Z6GvG z3u|F%MS=eaC3|gyi$>faV7#f+rcOH+E{5hIA436$PBK-V8GfX``vE=RnPnRI#toxQu8~u0b>sp z9w@7!9BNgCsQ&2&#a8^~B;SAaDF)xpFW8y9-j0bH31xY%xI+z$liFw8w|E*HFw)&B z*jV5PdGdQ}O?FR6o*g0EXneTL!DOIjv7GUHsKW6TH@CMP4(Pk$FV7r7rF3AZDrB&H z+~7U52-@k`cI);Ty}99KZP_4?+TAQ2NG*o&xk!NTY>H?wkgoTuo}1QzxUzU@>eJKx z+x7agI}tjNGFBghM4JEneN5X7sF;+4AFkgIrnwd z6z;I`+Le+x*VxWy99yAEOdggiZSJ>J-0T{x>+8E^C@v}dJ*=p2WeZTph5`I~jgIHu z__4s$;ZFUrd-y(`b{PUyOB1W<2ZJV}FP0`c;nue1nMzT|63JutC?ZJn=*?gt+6J99~RX1~4Y969h~ zPaY=#DgSc1nm;7Rc?YG=igP>AyZ@*%3)laOAENaG!;EuIV*o(1wE!v_nV(bQqg^ds>+#zcY#k~e zTj&jn0cK&+FrPP4S!Lb@Kj6RDyF;`1;S1mbX~Qsb-X_nM6j$t<>b}@ol3}xh`_?C3 zB)886Jr&n7l*@!7FKs$#JH^e_fIvnL^*$r)#VoRmIiM>LchGih*!cKq3e9Nqy$CL$ z5j0DRSWe#yse$w>-Hn!>zLCVkfG*VLH_jE0y{=7Lno2$R2^81_p?hXLH>cvh5tcTY zP{I##H?FvJCdPC{YS8Ip9BzH7&9xUqOtGTV_V5f;r@SG_lM0#0g#d(0FL zN`P}=$N*UKY(fl>8#PI#?VW$_9s zO?p(SCUT!@LG2rfTS$`{cwU1CB+}l*>o>bJP20ZRCT=ad)~d|WY^Bp`zo@vzvd`XQ zcr0&yZmJKoqDiY6z^4gG7#K(H{*uA1^@%EASd8$v1p~eP?T@ZWyt-dJ>dO4;PLUGg z`h9%7NO|t+)PNv<-48%g5?L-F7fTgKazHbjG|3#UVtQST-xTSw#94YH!m4Ys%In05 zGN+Y#3+ZttVR*m!CqOhdB?-A9h%&sXuxlFz{-F%Uu7R^)_gc@L8-zBXhGp@nNWsfr zM%bE)WazS$eJmOqqeO z7%V%JPt2{D?Zkf3!(s;PTyoS|mSk4z^}I(Ceq$e`-t}T=cQeAz?!AIqOl&fYdu33+ z;y0}JTX+GN96YQcB$$4WPdLucra8Z{dxs?5-bnrZ>WW1V()P8*XQqx?ZBv+&TgwGicZa-O2 zI(}8HD$BCbZvbqIJPSywQbkz(sL1U${F>cpRjIx9kW=Av+S*Y-fImlAL$Eu}9t)&2 zB{v)UWqL1S#vu9k(ag1ACZ+=NpK>P4q2jK={>#e#%X;3MemUIzvU|3&aI?oKp4}|D zb_|~y$@I7`4#A`k9^1!kl6H!iNux1NW`l*Rf{n2=HgwV&=F>6Ea(C5^%f2UOcp5x6 z1w-v$4Gj<6UX?kh`JN4GIa4M=w*Px!?9lHC)@Drk9+Z=OkaT2kya+UjF{Yx(BMdH;%h8Izq>O`c2&Zng>a;l3| z8A-5qd@)%22P^VgMF0auo#w5le?-LoR!@WfMOOaosSUBXc_TI|8_)r=i20oRkzMxZ zL!<0-9S@UA?pnp%IgUzUva*go8fAgog;(8x_q1HvVL+#UIumS3<<|Px*sxi)zR%+O zkx&kP0fdtkK+T3^?=IIG#-T|L3lmx+55MUba^w!}?jqb9d#t0&X7>Nnm0`fEyhPH| zjRlI>z!7sm4n6_~KaPx~S*?=rWkapl^6yw%_VP@ig6Oh}n=Vpcd<~NP9-*#DdF4fX~0HvA9;v-ze_u+f29WSSAozD3% zo3&2i5Uh!m4kKX>U7kNEknJ#lPZ}9_UkOHT6&V`Ey3s?FRX!F#IF1+3lYNajlaoCj z5btF3rkYd0{NUc-_oh!tXG>x-hT`OF2yb80F`1dV|LW6nt(o0xdiF@XnYUUg??$UGlZqV@gSJ?=A@GYx$YN+lwA;XF(pjtUmJ}09GN-vq1@m9jVpggx`{G(yNWs z$5t!^c9~AX4VH~7?!P|q-`($$fi(!c_vdPVnd_I|zwH+Z!;7zU^_8p3j}I(#vy5~8 zw74z~NyE~vO4mGpH6xxV8d)BK{DB;?x+&6Wms7B6SmR5d$_&Iy9~q%Zdw=xmh#z%j zo^zv`YG%hC)b2CoQf9fiNn%)1ikruviCAa+HN}#&>eiy7H`Z2(0cClAbv{~q)Dd2% z{wE&qxhHA*iyoKeV8|6EMx}y4wj1JygBcRNY#ts*8qBYw9;jnyb{yO4YRzx1#2fz9 z%Sf)vRtk0|Z!mK7+Pw;!xa;9pan>v(8@7Y6wJt2rPM z+d!_5BUDAcMM$G#sWw2Ynj)?KNN%ytY!Kd_8Rh?}7Hpr0emf6&_6?XkdQ8oQ zUE+$MZl}+MPGvw4S|#FF$EtLt0S%J0H#?}}7?W#Bmjg2F{L|xQx1G5Znk#j}B)mSJ zF20|xJ!$f_U;3&0m+GVr-;&ZoV=U&5OYEpd2gSTdHt5n>X!?1*3WTE3-=)4^5k+hr^)iGG@4&6vImK>oE0U~q(!C#R&#e47 zK{U%f!85@)2S~$qN|H2`KfJ$oZu{wfUJ9(AT$V-8ZaDax_Mm@B&i`^Pg^jYwroKlt zM8j`ON|F%t#1vuLnEa=2r!``4|SXXk^RcrOAALQ1f9X4xeS zW5-)Gh9#@;PY!2HRgiyof5JTpK(=k-KS~;R4==5E`vG1=Fu63(vJKFt7fbCqB zTf1@ctCBf1^$M`|SH$XGkNI*y9ulYd5j3b)GTZ(wMl2YD!pLE}E)Ik3OWoK>8cARv?*b%0arBipwdTLe+l8kZ@ z7q9E0}sCf)}Bfl?WUez@pV(W)B!!ztkHi;KeF`gB-*{?yS?57-Z<(TqoD9YT-Bm*-IHKNS{yc9jebc(aX(}-Bo^^319t+U&?oIz;i_-0)V}- zM^eUER>nAe`ituuE_onXkssry3BjUpnI}g8{tfOe=u7ePGUF9Y zLw7T~I+iv{`i1J=!&(Dm8?hLdkh3inho~0*_3AU-ZNMP~$dOqqz+CFX2$h1hfqJY8 zjwo&wNXhtmSZ`sK>I=&_(M@5xrIA{v=)E+mt}X#$t3zbbC~h9uPqka`vhGz_FkhN) z=>tk>={25s5zFIAn8Atr|6({_XvUozJ1gMffEcxywmDD#-=Oc2L!Jm~dHyX)V@|<#58&?Mo~h_@w1) z08V$|Ho1&>+giMTkv8vZ_+AOG0Odo-C5r!ixfYY%Ll3wV0r5B+TxNqlzwxbo+(%Qr)Jyul=RR}0 zWq5yK)zxf@c~n&YcvX7>{$emDJx*Q(7VQgF#3ltbnO&>7<_;F2CCAve7ARKeH49`T z$w~yU!83WF6YS@U6@h%A(aUlcrs&}^l?mCU6&7rTL#$Llvr?As-nhu+IAni^Y>9fgtfk?T11I*797Iy zPVLO+)JYH4W?TIpCO)gd$w3(t)SRuvgB^|%SwlS3b(f-)79==8v!(p7v1|+X%Lk(I z8sz`dClBNJmYy9c{~>w+)d<)rCBD_r5yDLedLQuSM=|7r3V`vvei*4Qf7$$7YICu9~8FhpA*|IeAqu=T_ zyelRqSABO%j?EV*^*JCD8>wryU-=0wn3F`VnqoU@zYu3_1Ce4dU@-?#a7Ku6T}y*BPm$daQt=W3$N7 zd{V_apnBSJ=XA(T6#4_I`sLe5oTmOKtKuA>@rQXj$$&0jk~s*IaM0@(P^BvZfGp1= zNkXU_&=3A~9ks|Eq7giZ`yk4jf!E%-%V#t@w~8}WGYBW?v}XIh+vV|&>haIq=%YT3 zsT|R}d*W_emmx;UR;K89QR@0q%dTh@H$H1+*pF4Pc8D!FCRGm&xV1W&0HW#9ET_@R zSoX0RiOza;UCfw+2<<+&Oi$pgk$1+2Qpf&_I?;O5Zzt9sEq&RqkCN!DL()cde)?px zR0GPz&Aq{W*V~@y`9<;w%I5$c%h)@ksQA{V z)hwW>@sZSN&7w|qFyr=m#LUoeSsNsud#upbB2lOdqDgw$dcdmeo}fq!elaz7))mdN zuv?D?jIysm?S;`e4ozUDS%(331@M#Jwf}0={7Xvf`lD&h8-4?svs`-%QXrHVyx1ca zEK=Vs#X1l5F-P%>!5R>>#F=lR?hL{Wz5;>BZiIWOr!YNov!WH%JX09v*JUiPTz7(a z-YW4Z$coQjwuCSA?a61J*N)=B6aLFR-*n9QrY<61PZs|`LqtBM-GP^D8KLCmK08F< zUmMoZ8k4Q*THi8l?^yiH3u8V0yhOc5d z1MQj7dCZaq3oC_?L0L?qkF)b?O%(IOSC5}w>Q>1){6Ck>dblD4@+!{S~ z=rdA(5%eVB)U!3(CQWt&OOlB@*RdN|e{3X^#||Ci*-T1Tjp0qC6gO~`)!Dyp7~R4l z=p)W^@&5M)viGT8Ic7)P=sxoXzNX8!F@=}&8gs_NL}$iwU@!3bYb722;|e$KyV9_A zMH&9=r3x{a*R!MS?y^&;Y4mGK{GqymYJVq~`3Ln&@U?Z`FnC<^<25YYZg(J9JM0)t zjNhj8ib~&mzRTsbBivU{ZyHBI^LQ<5xiy~wS~8yOlXlt3p>X9SnGv&5R(4jEqZQ@ z2C|$s)TNDJrZ}tmkw5J0t{it}1WNt;8A|Rj5W3nc zSbg2=tzpM?Gwz5RkA01EWL93GswZAXMnnlZZilx}o045<(@}fhv2#<_13ioAa$fvv zK;nu(_K7j^lgDO$|JM=vllwUp_D6ecm1fQlYFs3>g^SDZVChFF2WN~cy4Erj9?16dxDNLD z{7*KcQ8_ZZCR^BGrh)Ae{{YlPQ^Fyp7M0$Cv+d;5=n0sMK1@cXRLq_OkM@opH~@Pt zu7e|kkx3?224Uf>lRED1*mx5mY0cKlt|8yx{TH&TtA0<+a$$9JRx}uyKDRL)=hX8Aydju`TxS?t*P0MJhqok8WrtsQ zJlqgH*Z!gi=AoCwxs~h2gkdJHLcYbyrnS0A?lT^ivECIr4Cl@DELC|V)@1ScgXV)< zXkat2-H$xU!od2|t!dlbWwRuo_|rb<6U;cVG~^q3$K2zUV6@^VzEAY8=w<94^=k8c z&M~VjM?~CjD#y4zdi2|8TAy=1( z@CByMiI2c`2<$4V>~(UT>+jyylaEJkQ?oQEK!Q9W9KLM2Ai{a|7**^Qnwui~b`clG zKUbu)b;Tw(^V=^M{c`A;xUwM?OvbD@#~& z-t>F-6nFf}0f1o$6Ezo5oIkHQjIZ_Gu}i3jbDLU^JaaG_kzj@zUvv%SbR^gFtk7;~5-(i-%dx72O>R~Njmo`Zq`^tIy@s&WMM*eUa>84A6 zD!KCZxt`j4LtGc|-f6=-5Aw@eK8#I|eDlxtQd>3t6F6=>rJ$c}KhXbXvk`Nt{qaw2 zRxq$XvA6tf&6fYw*_DRFm8Ic?#J)^pB=%U!P6nZZu2>pTBG%B6kVsGzN=df}sw|Zd z9s4#_Oxao&iP*-z6(WKZDq@Yb$cRodQAk1sMVV72-ShO!GtYGT_r3R=_nz~9_kQ2| ze$R7AFiTymp$_%uELk$GbRHV7lyrq~|3t)Fp*jL<#f8qD*|+JV{D4n4Md1WpxT7*5 zwX-ZX_9l6-Vh{T(Zqh{wL1} zEX4g`naSThRA13=T_fnsa!vJ^4_eT625v{fTHFSklwP7_=F-DAxzE--pMb+>S!J~$ zZ5ieU9*5eKOH;wgj8yQEZ5WM>$czu6rEs5Ka@W{f1piX{d-rbo`O5>!3G05Q#0!hZ zMFgsIq$aBZ8OVreFK0>ZP|duz^ApX*7pU6xdBvBk}! z1fwKcmCZV!H8*yC7G7EPBtZ)@Gmfg)d~bYJiV4vforY|X=o>4{jSV11xRQ7;jO0Xf z$}@eC8EK4iKMdfcsRE!j%TNG|nYc{aijoo;>m+*BoOf*_D@fEybp=JpJk zzE_yvu%OhikSHG2thRMi&!fu^nD@oz?CTK!7wgE}m$xuheFSfZe8$uIp2RsItyoZg z$yS`S>rc_)%nV{hCZ2o@l;sZGNKvN}fRUXEOM%++-a*z1z7xe(oQ4z$V46E|{H#Ol zS5$ZAB*6)w6v1Ps(qWC;@3L`$6> zIw0;km<2%mKe&qLyv$O=@W#L5$T6kZr0xC~BP~yY<=JAKii zpI#@(*RXnhPp{c-TW3>b_XnTb>c{Lxm#3r)sbsHxx<8Z4(^R^!)$8;v4u}z|qw+bt z?A3ExRgsDGr@!Dz-@K!2qPgu%&`8VA5mH-xwOF)kAxK$9t4$VVF2g$jU z_We9|a?Xjy&kXtsu(6gSE9US4l3(P^W_JXTT${se2yju=B{|F%18p0hXTJwPCIR|` zv8=$uy$3?2(!YuMrNbuYd$ED4AO12p;E_X+L^h5;+&J{d+KyU`*VuELTQAK6+WxQZ zrN3yjzt9%BM2oUL>#K-D2h;KUFLbZ4Dz{_LBQQ1RJ4G6GuaXhX8aJD14@$9ev<7Hf z$yweHqxCOSIxdUw3VKkco&~JmV0GuC>P@iglLm|~Nl(ifp7JF%x7^QNFG+BW3*~N6 zJgF|zTvZ&1rYh$sSsK$uRYCI)QmTjEjL)qUFN~JKhV6WmZ$ej~l%X<9j`&0wEng79m+r@<)FM(t3@dyv>-Zd1#MWnHA|ZhZBof7m9NOZ=HVd9LrIZ|AJ|Ma|gon0o#l(aDItTKqlg$l2bp^fEp z%6m-{?Tx|$41(sl=E2KFUOwo`p2tW>Z@ZIpO8yh*wV5RdKTwpAZ*hFD#6omu`qtDQ zZ7f0@V$fFi#gksewK!Vxossz&~42pcQ|%v$0AKaF*__G5bQf?uUQM1d8g@xuEO2IkmU$5yKnR)b0>qO zwEYhNX8EjD^|vR(P&9gH?u1S;nogT)t273{{<@JL>vGB literal 0 HcmV?d00001 diff --git a/smack/image/11.png b/smack/image/11.png new file mode 100644 index 0000000000000000000000000000000000000000..bb34e8d152ca857e1dfe5ee3d4cfe3d6ec648ebc GIT binary patch literal 43798 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�b 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%0Dqr3-`LY=oLeTA4;B7C~3QgVV9}r`EK)h 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 N_SI|Zm8#a^{{krW<}UyM literal 0 HcmV?d00001 diff --git a/smack/image/13.png b/smack/image/13.png new file mode 100644 index 0000000000000000000000000000000000000000..b846e33ec9a0ef58e052c45252293bf96b6b8a26 GIT binary patch literal 19259 zcmce;cT|(l*Do3iA}FFDy$MpJOYfi}y-DxAca%;jN>z~Fqy?q-7K#u^l-@$`0fO`% zY9Il^!SC;V*L}-9XPtG|yY3&!Jo7v=``I&l&u8|0W|A-O)D?&bsR;o90Fjd7TP*Iq`*)l!rYpV3oGqxOq zI8&*r7w=n02I5w0;nJ`sdnxD2jam0Xj>)PrR1~~w!&Yj?a5x}nD!9CXK<^`YhaW!` z(Tn(wr_C^EGgu&F*QM%$gPx!IxAJ#Nz1v+iBrhUUU-4Chvv+yuyIHY0JBcnDNSv+C zX*V)8X`%IFVYmp^ukv+`KCIlEVUA$@#1h25RmaEVVy2mH|3xhnBkyVNfen?k*}5F? zt&*Y{z)AX}$YzhaV<_(NF49U~^skMl+ZYGDH`6LPBQV?wSgatD$C{+IFckhdrh%>J z1w!nrcnlvh+4_(V^4ohVH1-nMnEJXa_%Sy84rL!E9nPIG-9`pb?spm|=7B#ohjo0u)?~ zTleBw3fh(#UG{T-s4#-_>pOKFnQmiAS%(cZVAy~4~CAO^}pe-gh@w7Kj^Uh z@gMDXH`xfeY$k((^(H~kSgOka=pFPOzmS6bZqcYUj)9FwzQB|HCU`#NPW(T z196%4zAhn6Z9>m{tErN#ABM6ku8<&fkE2(bK+Zm)e+{luP;Q6abJ`R9punHk&(`;v zfOWDHtkwGoJLw?N|6vLw2r1ktA?)^{n%z9?49HgslaeuTht_R7cmMcL&dz*7d-ivflLj}N1i#{C_djUy|Kcowa9sDul_s6aD_d&SPf1@GB3K)Jd_61r8COVWBwv+gZrx;8usD-{j0SofW*MepPnE zJ6YD(juO0d3stZM{Sqyf-^@sD7cBC*-%afuFuG%h6{R z>?Lmalo7S_a0L(|9*?oy6|-@Ep-;_MzfpJph{1C3Q9VOI%w?16xb?C9@Qf93yd)FZ zah4sQ`HcCSOTTrpu8L~-N%s=OYhjEW_J<8&+o0qc{Tfs(7)j^&u<_jsuw9(u*$-#_ zr=o&Dmxqgqir{3oXFCMZzHpK)n)*q*oS^i#C9?M8v&CK z$A5PBe|%q*7KV$0%_IN9aY?PdU}VQ(jJwQMyiA};1rCSM=)Y$=lQTna3#saBXXqwh zD%Mc&0O!5(`l`xz6-4F zDmJXWtYY|Z~w``^dje;kOfMo9pL+?EAMVmD}k1m#vf){U(tm&T!@?7fL6mm;~jjrtupjHdui^54dbMad5OVH zsLR)3fA{!q*kR#dRyr{LHhr8NXD)6>u)NfM8(VfQ->Bl#>xnZbwbeClPrD)>SHDoQ z+{efmxt{whedjir+}{gmJ0YAKflyzd>LX72rlK3eHTJtg@f3%l32AcBhqU!9PFec! zm>Ueq5zo@=`kIyyPw=Mk+|yoF^m+c!^AMxUj^RKmQ3sU?;qp3aGkZcU|E%kN4sOP4 zk-<97hVXJoV=1HYCFT-|T3mEJi(NceTfX+*82I(txQb;L8ej(M@;h!esJZ@zWclMB zD7*f&p>Kb(p{D^=Jwuhpa!zhZ^C`-b%o*V(Yyu$0zvB6Cy*HPeRwGO~YkvJSLS`eH zJO5M2kyqMfWs4*Idc46SP!LNRe;9>(_gL_^V6lbE`IxX_9<_~jnPQ2>S+uyoz{E@u zLl%$c&(#Y}m5m{X$5E@LCgwCnol51s0zvlRiZkPm02O^Sqa<>K$DJt37>7QN%dNe7 z6;(CF6L~J#TrF7H#3E$ubh&hbXWFRW0@o=X0O17~kiY=@=3D14Zd5qe&(rEtXsVqS1yVX~Bj zaT^?d0_58dILlEPSM(cN&GxI1U+%WNf0>k0OpJ0^Qddd%6)>rHVze{p;Tq&1^sart zOe`mI6g-IXB$cvY2MvIJy^vE%3vQoCW&w7CMxxWgS9{UDp0Mhr7}cks*Lbc3Bo)2S z+Rjs8SJ4Mm#Vm>f2heLNS7NOTWC91SLT7pNqEKjcaxVSqu_FPAXmh^hM)Cs}7&|vymK*71rHTsbM*1&KCw;j zNz?QG;X;r^N$}mi3EEoBB3N7lw1b55OTD>0(7WWA;3rw;RznqC@Vq;mlwJ3CQ5-7% zDt2$FLSDt7Xzw<@xg zB!!GF)kx+72a<{`4w2B83IWT@+o#J}Ki~aKD z$@+Ng9)^7bKcV=pPL<&)+aUK+zla@Ig4)I2o0Uz$I;Pt$edtA??i7nEHP&{r98y^F zx!<|D09i=q-=WU@rh2zD&G}`P5Fujx2BV--sj)tvv^4S%$<*H)kWL^j{i`7D*zUSE zHv(6E@syvEEv<8Mr;bqUN>t2Kc?~vT<=z^YQ!T7eL0D;3+bDD&u90q6XlY$h>U8gx zVa?1D?f8SkB1%MYeYlA-fnNV1cj~$~rNxsIjsF8${udmj4gGC#uoH4Va251+VusVG zoiQQpVBb6!fmC=K+m^>dd)tu!c8*TQ`CTKXSs6k$2VlsY&EuxrOBa4j$GH*#=CCKY za}|7z(TAOHL8zCCQMhHqwBY4=?&XV+x1zgb+MFPe}#Ti?YS@_H_9HWC{efVFu; zvzLD+rmK2du9_J5_VB0>hP$WS0+F%NQD^U$(d&lB64uVkk(E^#n){Gy(3!41f)JOy z;!G2hOACnm8b(KUQb-B8h|^ERZDs)7&Cp%Dcq|RQh#r+#!X{oR%h%AQ^2Un%_C1v3 z+CbaTC5DI~@DT5d=sIVxU!3NxUwl3_`JsdOUeO1A`^{{&jR_J$0jFtEUITH2e1qBI zG&_Y0A}d#WU?d`AUd^4ZT-!Wg9bE;*TU>M3?ddy7_A2ikchA2Avkvg5all%OG6=5oGs z#og-H=>7?VDnR3yN?meY;(f$nuL}?=5?O~p<&{|6KqBBUOL3rA+o8Lz3szQXKTloc zKIwn^a#!}^JsV73%E$Sq02OhQjhYZLh!bkS=3-4-$mbHzHLvc2mVTm|iY%k4Cf-Kj zDZfn`h9Wdlcz^!hdNA3}?*Y9_H$P`tP;%t+weeepB6V z4OE({mMZ_f=*KtaiK%ycI?K2`G_Sp3tD|(aBd1Cv^0c8v$zRUNcsb>PA(fgL8IcD=0c#C$qk`*P9fR=zM%Uma zB(LH(>(1KnZ=&f)qoT3X*-u*jtsaHFtrcsA0U#VllLneMp5N2iUw3S)ziq0hqfHDW z-xt%E_ZHM-lTW+$fN2sJi5{5L6xcQj?|mCOP=Ju~c_MJM+7^3K7zB0^tMzP7q4Y0#hG%T45%v0tCum=Vm6T**zKhQP z<%t*nl0_)uY%htUI#G!*Lp{en;-r0Xz(o45H_R#}dbN;xMk=3q zta^Y(-^mK(A~r&t(2`kIRT^wqb`+-t>@Eq$Gz^rM4WOLHOWEBwh}5fkC<4aQ;=JJv zJxb469CZ#-Y>siARxto}5vEIYNr=un{tr5^ql|{%c|cj8rN-7`snA2xq|YpH^=D2s#5->(J<5zdx^|l_t zT4>6;(0CwPprge9%PT_Ldb+Kz=FaJaILD@QMJyL5^VO`JzdlcT znmn~wgWFas<)-A<^5{s-TYetIkXeTfNb~bbk<(_Y?vkbQv0Ioo)e}OibQzzULo*~e zdPf&M9n)7o73$aFDS3cCdXew=5JFA;@Y$wWhS{m=M$I3nx3Zo7!p^r|Cl(8%G}a~p z6a~B-Gex>}?TYlnS%Ur3WSNGTRIJ1Ij|5{R1%L{86yR6DJqek&y_(`9Wy?fOcJmE) z)UxX{)7k$6*PwEzQLY&BcG3m9;dI3N2psJ4-ErVVj8EbCE73Ll-G9SLo+vm?y zK=1RLttQ&W!?ww7Rp{Jhtq&ll>nu+h$Rt6Fn!o)4N~yg-4EExNVktbUL})- zyyRFK;p12;NO*K+kG!bo<{%yeb zuK(*>_a71fKK@Do0RFicc}ReeaCVl(NSGKmo#y;WyIP>$@9kf2kr{|QyqA9;K&xSU z4V5xNP$IMhm<1^b082B@64+C<3Njxfcr?*l+ul6_3% zDQfOngV4!j)o3H0$a5;Pj|nnMwds84-S>} z^vA_g*1hL5#_d9zScnkBf|!RGI6X?mH!{5AsDQ zDFN9}FJzbvLR@x>aGbZ9pdDZ)AUsMtWHcI&oH8qi0c&{(j_L09*ep zVuIXxkm_<;;EB)fDLrOTr0%sJm?WuJRi{8*h{YX z+vO=?v?S0fy0*cmZtkE-T^h0>`S|%@fD+wc!m~@+Dolb!R`D3$pGAZ2Ck&K-+xY@t zjQN|V%!r%MyZBt(?Ycl);L#S%y|YDV1H?GjT=LjGH-@Dn z0kCveJfUi@TV(f)&4$OK`q2XRcT=Dc<}&x8ugqbMU7un5YR}>C9|JO5S7X20{=i~i zztYPzpT3X8X3?A-X|wt6l@G%$_<|HayYu%@18AS)k2RQHXQF%UVL(X00 zx+hk>I+58_VeKspEbI+Yw++bo5pT+cUMH-g_ zYL`Q^3YEZMlMu_Bm6J?u=So)T_+n81^Ni&TimHI0z-o{N15Zm+(8}@yifL^Zb8KMv zBl81`JZh4o^!B&M2nB#gg+~+QI}if7ti$_g9ryozXzMvD&QPyk*VqX*-X8^R7gsjXUtaj$EgAgi*TJ``3ZRR^}Kov%TG3ltz$St0~Tgv~e zg}Rsf6|d8t3zQSWD}YhY#$*c9)`jea3eixM(&TlU5M?E*=UQSb-Uc{)m@3zC`h=J;z_MCKHOuJT{S@5GT*K&quI6e zCH?vvU`ks~d8<5aA3GNi2B&jhGMgH+R4xB-VHM&j36^ql^0=8N#Jgx+<;&}?DkIGa zP}2;DF7ajefmzC9<92pOyJ-G{0<5QysF=)qZ5{3}zvG=E?_S5lM@I)1f6BYIsBs$x zD=JDh5ba^tX0m%|F;gUu9W6Lq zBFz5um0?n%Joyn{cau)MUHAdxkA;2wqREqyN>Jm`A8Yw41V%6QN103-w*+}nX@-D{ zqf#oyTrsuTIP<||Uy%LS$%IPQ2uzh-oh4~nWDe=nIj27ZOjZ+&q7PKFQ<3(G;WLKBU}yJ z2b@48NR|icNjv(*G}>;8ijc?EWb{g`<=n;{jT03$lDGB}5~3UENG=byWJ84zDT=dW zAUAVe{RWv!Z1L7puvw!ng?m)#HjrM3M*Ei6wI(pgKoJ*)FG6cwE+ zU;Dnp{S_Bn&o4OR1CuimBMax0Tyhc!9Nimjc51LQbx)Ro#73;Hh04W_h@cvl;#)M< z1+$b5mE0(YTYRT$k}0lbwj*#DA*O zkU7r9uTtZby)Zl*+DR3Z!LwQ&>*8oj3SuiwPtiU<)NAXZ&zcay!!zNkH#9#L~s^oxgg6vwDdW$8Z} z3(eN=afi4+_KdpASv44G7Ev%86@EkQ=3G=k%Yy!3Kw~)pZS_k`AJ^jS^T?fmYncjK z4@uI~9a3J~rzI3PF%M^c>7J9+*yvQIGbLXX1iYttsI4M|*jX8-A^Aj5_RNnuSm0vgS zc7!ZEKP!M%)p{|Fd8T^4wUn?YBB;~c^^?i+#!mTU22Yh0N*ZTHm#Z+7)|rion^$KW zrYYZMc9o01*xahvNsk!9Ym7Q8;D#J0-(jhtQ1cuMP&_DE2IzV{eZS2rGFEzZuxmvc zE2Hrvfst{TCB0anc3tc^BL8((vXkCMjqgJF96l)Q167g@3U10FNs*r7{hdVg0m}5- zVrgG)BOo9$+<_83-%3=HL62vW>SbneC4MZufj8(>06WO!UV2}AGTAZlXDmDE+75OF=zA3sKjMqq= z?|2{q^pfY`3`ktg%|`|GF76yTJ?m4+T!mAUcHGa}pm;Aukf6ON-ha_(4`cjRA)t^0d~ z#hA(KEb3S^Y-q>kRh51_V`vahBtc(`MzUg^Kh)8YRD^bGx)KdV-n~FX`+q!Jmu5DI z%3^)Ih{2j--pIZgzu3@ztQpI*#eFxI=;z73NR=l=5su)y%~eIy4*q&JER+3ZCI{&C z!rTvi{55+Y!{__Aa@l3y^at|lBTLpF62NzWv5H^ioP}Upd}?PcnNHvPHH`!-sjz3(^fultVbu%RVw+aU3

D@F9Et`o_5{KaW~;;o;B>6OA&xaT~5TQ-{Yu?mo4snr4)ZFbwe<-mM}jf*1= z4&$SH41esE;nM6;cPl%nH%@k(T6A{S(R%iE6mhB-%Y&~=hStRNK(){ZgS0Mlk4%uO zD385Da0kI3+1u*bQ4-9O-=0e|SJ2-Cp|30y9dxT5Z~s#AT#^li)`{(ynxw**#o-1> z(sHCfsYH&(V?)I&8eZipB1rWx`b*Qz@rDX_BR@$ji7QF<;5NYyMXIieT=K_vZA6o; z6Es?qB&YRW0Ux(`i-(x-`@zhPKPXb05RQH=*-ZG<(DDElogt?3;7_hMT>GrlirX>! z#}qQn{v3+^2$wXl*X*rC&A!DC4@LVj8-pwgoJ+)iSII@*-BNC8gKaLnI5DO-9<%H+ z?sty%U|5TYO+wC+R@vs$^c zbG>3>k?l?M34vR0_Rb2XA(bAr6Ngk+9Z2Y@;d>*<*aVs7N3Vd zKLuiPGs=pmRA`#4P)2P53v~y~#cKB7@M97Zyl-J|=`~xYzOb=XZUWI%yE{-{eht_z zQpgH$Def2pQ_w_BCOpm(s1r-;?4G&!c^Pe^vRIA@mu)wa@4{z_8LTJH>&-0aAg*Xv zUcVx*XimQr4P{)}R%@IKg43*epXC*3`8%#~< z`Cn9%i8drMNTeRUb=Ew_;=kh7!j0lzPJQfn(bD9fDvKL*m>pXvpf_*%_@nbN@==Ze z^90J%h;415Tn0E-A+bY6vVH6I76skfi=DFWd^OZ56BV@vMi@A6_&{o5$m4lHUl}Y- zdSW<-eD!{ez@ps?e$QG)Mu|o?Qj_fvmNUUb7NTc-Gh~&nol4`3)Hkt}^>Iav4P`Zf zdi#0p2b09fRDanwu=OrMfM=zLw&O)LRXvy|;Bs$NU6|QVBWd-?x@r7D)i}gDq>;V{ zxy|LCTxeZ}It#m-W*s5#5R}K(F+MBCfr_)97=^!I(jj3^LmM8hZRdrck`jb9lHL~c zaiQv-s~R=>Do4{VG$N2M-kLW&OsU&cS5rOS!6O@x$_XoalREDI$oXhJXr1Vz#P=av z87@KQ?6+f+T_k{APH~FAKyY({_+NdJ=7e>kqZ5aFJyKe)^nCU$H`hQOQVTX30fAXVvBohT3EPbJ%fANMdV$C^PMle1&n{Dj`_nK21yp1&J&*9 z3O*gee@I~P`mfQ}eW37zXBEY1X1FWP#H{Nx9Nw(xxzEEG zZ`F!?pfPldARS|Lz^S8<5O+MNSXJ|8WxT|3V-D@G92- z=F~mlBlYp!n*`7>Bxwn(m!{n7jHV=>cIv2{DQ;}J09Lr$Y5px{;M#^_+x>bEp3|mE zGc~1vXf)j7Stq!8^6OAT1IA74A{TZFlzGuYV=}8s+l@Ju4fgn`DsXA0+)-cEuJe`FbChb#bwLtZ4dg_X;I6 z9AKT<(C86WVy|?nx!4dRQ`JKO<(mosJ^kT}zd8WaMgP$S;Pg)=z{EGUzjsUcH2x;< ztU-U1@7ERr0jd-`7M_{3^bSef6u05l4O$r+6wukom+)^tn8Uiafd@w-NMq&FZJl8~$wCUTv zDtZpHH((xDxjd1tA$hpAdssMZFVc9tL9mmx7v$F{CG!%(Hne`H%Vx=Ph_rLz5YuA? z^WQ!iwjPGUNpBcLlcC2`Q}q7pKu6{FzkRoKF8Tqf@skckb2*CbV%Y0$95Oxk;B1WA z(`>x>;@`{U3G3VkRX@Y_GM9QW-?yM_Ho+T0ll#N+;h$LGBpW0xA%yJjfGc0w941BkMa`YD z%(X4<`kaKwo;_YCCdKHNg5iG*;U}h? zE3tho^dqNySg0Bqf}1EE4q*q1!2(m4-o@c0UtdaI3xO_sw330- zu(V;4qD!U?*&rFqQWTp_uynvWC$a@=H+&XV3@7bByET-3%xi#*73BbwzVg|6at1{vQ5f6Z20{oo2kao~7!CYx%8 zimGffY3zX1rT z(M#D{U=vTOd9BoG@AEb6Y(_3jh6Kg-6-M8a<*5%oBXbK8QNb~YTqj``{R}SioCEJ% zWK?5NO=i%e?b97BC30?dVWBNG*an^WyK4ur;A{5}h-BaY>rd-4Cc`qJ;EUtY=4);r zGN>Q)eD8-DzNE&B@sRCi80tFnHy5lqk9U{N+9#4+;!ZKUj9WlQNp;f3j#RoOqqd!Bc!DGv=`f* zYP@9{xq#3&7ez=U9^{_RH|28f=_1LeucZRw>v%0TFISu!`L0XzkY9Np9pzfg#qhR{ zTyga5-eA{cb!Sy@@sR12+TEKUT>avZ&^iv6mdLV~xh}K^T@0ntxbvPo$pX3~e;(y* zfc!6yftZ52zRYBZonqK^xS@PNye#tk&cGl)2cp=(LKJKgKWh* zqwG{#rANg_i<}!8=9KmE>5HG~@b`uq?0Fx8g4W`y4f%&)w9drKu@uJxhdqS@yk^@j ztsa=`%BriehUs$dy_KUKfn}7WS*xR^yIED^aKPXoW-Y5&FAHyC(pbZW=tsOzpI!CD zwoZfH#DSErc~Vl|wsiO(i?p>PPs|a&ME>gqUp04}R7)Fv+JyGqq;g=DFun%qd}F8J zCT$CgcHU_q`duNBqou$z1d3OQvvn*vAB^7 z0;8>bm+ibg!KFg{d!#aM{t3EEJ1f``m_ga7Zg6QJq&6f*csRR*qoua zZKIe5tP*+SyJ6ert=~|OB$A@F09pWOP@EewzjDxkr^n|%Wn;&pdgtVn-p4}suH13% zC}mqz#*^;}*yPQgf?H0ZYaTIddRfvhb;F8s8g;v9fXd)1o`q>T=<}BvH3(6%wF&)> z)|V+y$E@;0o%4>4rhFz-9H6_0z^+N^rKrZ|+Gg4jtlulv(so;d?K8J0`A|mD6(he4 z`Oz9?&Bq1nZ8ne!3dk?+H&ial^`nncO-z#`by!l|xCqNx@yY$Ol;6Q$q?lweb0*@& zZ>N&T%yVds4fD(r*CuZ>vJb~NC9lP=A#TqdPyw%?5=tJ}B>&bi_iAkJklFdP#KNw8 zvme8EznEuczV3Pw<4GStBe4o`@cl;a#`Q;tv5~CvA+<9FnO>rcs* zJmq{8v)jZ>eaO=KFuD%sthX?=a=omUF{U^#YJ1}sWvwM!(av8d@s7EVe)M*;7IckQ z1q7AXIqOL>sa#Hk_O3Y&Jg*=e2)&_7)K=w`v5x2J-DsDuq=t4*_3ZjV4dYrZH0Aj^ z2pw0$4wXfxP?j1~%?e>g7Rz8Uqr2!&_YF@Q1?CUF_VqCu2};dE%Hjqu2uhjfI1D%+ z0G(>&HUDI0{!ow;8ncQsTI8N!4ZLeSyz|D)S}=U1MYP=L=_fT{Tb0_k`UCa7rl&7JIv7BU1zsQASGPvr7-L zk+3~Q}MV{mS%%WvyIgi7EPtxyQCrUq^#oW}WLT zRWP3#jaX#!W1VZ2byHK!awx(#Gz?z^`}t#B!-I;CKe$wJ?yN=c6-jxUx1)dUgak7o zm_$M+<#b!7Uy#F_+*oJGHD0mV#guW|!gJ9xOl8;tFkznEsM|vcku^E-oer?gnTZZV z?2on^L<;)cnSYB}DoF0T{Z@U&zWjm~9Z2ED0JT}>50L3?gj|;ssaDdqBY3K8H2sUd z)_m6vThISoLgeLP~Xf}-JJn(SL0~23Wd?$n4Q$#81iyP zZI>rnq$7@G@|+GKVdmk5PVcwgdS`BY8;iz50Njahhnap0%FZdy-PUah0_C-erz&_N z2>JAB>#{5EN^B_Cor4c%3&~QMrt;GE=-Sf@V!_6ft+ z(88C&?0Ylb+$&@xZ;S6Vo#|cX9hE=2o?6Di9$U%rAg1OE zn?!3q%8O|-YB@SUJ>`VO#or%2_d&ov*=y+Qypy7769rskAlxxx@k?{GGPuQs)v-Z( zt0J^Sj)0tMk-b8^{ql|Yr{cNu&Z!*^FcV37)9p817Q8P1su6ac^goPN^@ejnjOFzymIP`KdHcpO4+x3)*D;ZJP zdmqYYnGX_(wv}{4sl1rmy<5 z*SQR*{F^l-8us_(OCk(xpE@JtqK^|gG*p)Ic z0oI2^b81O7Fs<;$Ziql~xP1md@E4bIhr%Bhcqp1K;FSl`L!_BD^|eZ?SvR-YgDk$d2>UEMA}bE=yP}eg@47#eqwD1!mqauQXX!3A@(7(Gsof6=n_StQ zfKERIhI9oPDu*BVnzILsm5EiGy0Fc4A_g9UjmqVupTA1O2t2iIGVv8JY+?^6P+qVe zY!2@vnaWmyNUz}wJG$jfYTFd9m+u+2Za%-+1)nK0&v#YVl*`*vjk00yGjw~1-S4Oy z9Ndn~u?jG^=NbZe3Tnt1Pd};cR|=Si5uSB@AuZb&|g{~GYd}! zyY?t)lg|vt=wfA!PWR;{}H-Mndac%4IZV$zYaHbG`9y!`W&+^VgQqxepKQZrQ+elKs&1J2c) zbP7Wo^^MljcY^w-a}a-oiKZFx^AL0iZ~%%8)Z$ywgp*PWZ)6-QdJ<>d_GWV2AfU=M z8VpfY(t=^&0_7GD4({aR75Zg9DoE6C4nslTBCuLPZq#!1iL8zFE#J8EjRu4_SV@%p zL1obOMho9LGxs07<45 zFF3Io8LnyuQYWm|%p1qGb$m^;;zU!vKNC!ict#aZ!{Ay_%&c{@;c1!H^rwk#29IA- zstW5@cLC+AFNR0~yQvFgbi@AbmQ2W+?f*(>c$|}8zI8-Lx?kfTVWnxB^sg8wrhFBn zjIsU@IcZ0Iv+3KpPqQt%qwa5HVrIvw&;l~VTKyY^GEb%T17Cqz?Pt^Djhvj);eXT} z=~Jz41D1Nlu*Y}X!X{|)@mo!2U^HB?3^!6?eSaA#T``S!!PTtnXQmfE9XbWA&DjCX zr@uD#a?z9*yLM3~?um}UD?i&-sOl|(huX$XPg(>aWyIf%ZtXdKsN;gnTxC(7j4(Ou zfYhH+WY)m@+s>gza#c(mjo{mJvtK-g`fB{!{p6qM&qCX*KW*5KqK8U0Zina+ht2RGrir5YA6(|F0 zrU}G+^QjiL1}&YSH3yi+itJ2wZ(~N9_jd9lvNl`|6SGZ$A2zdbl&2Nc+Emwim$~Q z`-!}b`*Yvm4#89;&6Yn45qwX_f4F{zXk0bPJ8aa?xgt3Y3mODF&$J~QV_R+OxObvO zfv8Vqv3j&Zyw!MPW$zU9Sn8L`V#?0Y(}P1&<)(f&$IR!Z5P8(T z>PB?N1(wlnc0Ntt#8q}I0vHW1KAg&{X~1_ZqdAn7)%B-4s0597*{);W@SaY!ba4ZJ zvXo}UR?a?=ws5)yFzDpF3Jyh@W_a0uzvCJIQ?0gbmRlugM{hB~8;uRpLRPK@!s$}G zUaCFu1X@e2V5y>u5i6{D^xaz zbD?tEwn+Tl+j7i2MX_71-liTwe$rsYOKrkYEvv+*a)$D{Is>1bjJR{OUU_5f)2#Jv zV(3%NElde9DZfaj7=Z}MVd5rd6N6&WoAWuO8Oavxxu*$rKZS^N2S1SIc(R_v}hB1_rq!ALppwkdQycxKE<_wDf{4+IKx}uATR}zBu}RV=Cja z`-W#O-pM`E>sr12)+KL^Jg+BvY`0G>&i9?eHhXH++4d7AzCLyKcXw_V%RRJ-+55B5 zwR+2`Z_L(N1y)vg`OiCX>x^-f;FMBlZlL#tc01;We!s>YGDFk!vQY3Gt3_Q~7e%=l zt%`c3?K!Q@^5(tztKK1-cOG2TH6_-gu43}`UE$leKh1u*UFX%j(?w~gSYPd26`T9d zeEOW!koT<~Dwl6xymNZKoxjFck@D>UCLg8L&I3n3Z$#wiVy6-!5VcLAYl>qf8MLdTW8OAb@={J{@(3t&#%{9|Hkfng1=5&@t4bndj|hs&;Kl;^Q`1vfBwGv zNABO9bo|@RYV-f$I?t50&CHzbQ};doS$m;a(XHl6rUqfqXpxL|QTgxl|E~*Qmbd>A zk#`Qb!_54DQ8?4-ro5WZbJKp>*O&Z%=l*}~U5lgE`}38)RM`EV{{PSU|8I|_?~4^L zIsN{B=(miVZ3}kSJXE%Q@-F>5a4`MeoQ;+%m%3bDd2yNUE&)Yd;BKI=>|(Qz83b30 z?nU*e|Nf8pX*PA=qj|r5{J&!R|1Z+@tG7RU|L-VJLR|jt_8n=v|3BXSzE0ru%>Mg- zH=Yx|_m|uHBD?(G>-C?rxv!PGRsZSVp1Qu}d&0ZT<@GY18~0YN(aXpw>Nxu6+xtz2 zXP@{gq_+R>?WCXkv#M+w<~k{BCe8SiFpuFu3up%8c-Nh~_keR`GyAozxGVm9?fiJC zeb?8uchgS4`z?0&@AW#>)#mpv9i6@H^{?#tr@RU)Bp0&&_%fGU>@d50oW7Y^`;o`t z?_cy*w@h@eR_fk7tu=?KdQPd$uZ*D7<=>7hPnfptTT-<=a8Pwl0g!kQ5m_?t!unmM zd3jsk_Ql+(zb{tv=>qSw)u+!0zjB|Y9`Qr(=G458-8&t-?oVFTnFw?se+xK@xX%bb zS@-Ky?cPqkyiK=5>x~ufen0*excm2dzV(g8!13_@qt7^xZme5$^6&O{`!654w(oF& zjm{^XL-T&U0S9Ypd3)D*SJ|K)!g2+ra(Zvvf$#o+1c=d#Wzp$Pyq CJEhwI literal 0 HcmV?d00001 diff --git a/smack/image/14.png b/smack/image/14.png new file mode 100644 index 0000000000000000000000000000000000000000..e266f354d8d191356fdbd23bcc810754e9268430 GIT binary patch literal 17858 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 Uc3wRf1b#%IhR}vrDq4s98{_&Qpa1{> literal 0 HcmV?d00001 diff --git a/smack/image/16.png b/smack/image/16.png new file mode 100644 index 0000000000000000000000000000000000000000..ce887a06238e418fe8bb7f3fdb47f43ac7839eb1 GIT binary patch literal 63147 zcmZU*byQT**FOv*As{KBNT;-vGziilAOb@VDGf?V%^)q^-5o=xv~+iO=g`f-z&rST z;$PEuUW zMgIVfm0+q4+6g^Ae;jGz4#)j{`skb{OiP1N+s|pI=!VxNZ@?_bA0Y`G4BS>1|LV^} zC^!D%cT4t0;5UYOu3Ti%3QKPST777{lM2=rSVxjNu=l#lyNFJx6!si7& ztgM)pHD8Iwmktzu-ARFg-7X8A7OYA@TF^$%yGrM?iwWh&akHarsAv4I07~$m%#^E= zM-z(i^xkE+gNmNjyS4DN$9txpj;}ppnac(0Cpt_3HVox@T_xrkx0+(koEa1M;0v+J zx-{4AH@J}x-#Fc&sWp`K;njxUzIB82=@>WWNVAid53My5Fml9!Sv5I(pmmu~R3UMa6zEz zQ&US*>)vo~IVD4rt-go$$tfVmO{lIhL+Q+FXjZhVQfDI2bF!OuM_S?Mi+%U3^gcmz6k1@AXw2YC!U|yA|Y5VYlMT zw8+zX-T;8JJEoRgT#a2M`^0&(I^_8qg_r(`9e_~pC{g9^oH3n%-N1Vpshya`oU zy(>FznY~S$qgB}MZufsJOaBdG-B@lfbg%6jWF7q+!u_Z%b>(#w$Rh(O!40PR9s4cL z-r%(_6>$Kkm*Om89HF=X_GEa_gVUXWZ$#EQk0|kSE^wqQvu4p+K?V3|=XUg;WMfSE|=F`MUnVvP` zmhY+YDH0l@sB7W|-98CFwA)GR0A}m#R{9vzLso`ej)){agr=INI8AFUJoE$-FA&+X z(r*hdt{5nj{n;M6=|U55nrL}xrR?W9Q7BjG?9*Ai^sBdJR_8U!TF0`yQtJx}P3;I4 zW9w?Pmp)E@D8ca}I)B zSL*>7b2{Y1tMTo_Pt?{oj+k(6UJ;|&o;&&p$p;GHM$^-}Ta7HstaX&i4@X3*`13Zu zHfQuQCgi71(dmSjH2(J@=vqMfg$kfPKPI8dAQxs{Be;~1R-$3XVh`n)GG0^`q;a=$ z-lo8s-IK0MU_#KR7#DKDHc@guayzu?!`I=1j7MCdPd(X49c)_rA34q~)4)f#j!G0b zR=A6YXUcb~=XKm@T}*V@_ejrXqtocaLTt<3-#ItTCfdalIGh~I;v~!KTb`PX^)6R( z-;_FhW#U8^bDj$A%Oo!ArOm84|G>w?xJ9tTu|H71eC>nvGb_H z6oB`2?5cu#jeTXXI%vME7a_5V{#1=Od+K+YIsnWf^Y-kMbM#q?^J ztdPF?Q->C~wWMUQ@E#c(HYtW`sKUi zJ$xkXjQp;mdDZNf%^Sj~s`U`M%6=BS1zF^4A_HBF4K&nko@In`6L*(t=OO@G`ZXLH9`3E%bA$tqP4BZ_KJ5ud}?S}&SK;*@8!WS zG)la!57)N%fGqRa(ZVZ>a45{eK75K#^8Rke)_qHQm14T6bM6Xr;8kRvm5TdeSK|TW z9_ypzZKfvtY+Ks586_bmiaT$o?8&~dtlc@0KE&EVUxb`@xLl-eb=CL$zT$P|y5qji z!;cWgI;-Es!UOySQKb{kb|qtpTnBJUC9g%s>P4N0XOP1ZUM@pk#;^k{egYf+-&$Aw@qATMw@XSHy(>ZP3_<}1lwT7fslhD5%Y&+0p8^zDjIN zfGs$)Yq{j`{2^433T_~_hd(hP%4tvwkxi#P+R{*z2t7SyMpZ^U_1GjdDmeo!Ig zeDJI1BZWz+8uM>SFOA~-ml(5>ht5-}KbKvv=FB|Tuz>GBU3I^;lMJCJk2xO^TM@3; zlZul)b|cy|+pd8`^nj#GjMA5{Gich}cmrDwZC}OH2TRqu7y`P=7~&wjsWe#0jkb0L z$j=SGSXrZ?<-;cIAraB6ICFny)gKanj`!S@o{`U}x6{^L;lmG3 z7a00?wp0&M?zcBToxon)oOqOOVZZ5A&l^a-*15;43Tb4<1Mve}3d@wKj0e7rNB|fv zC+=X5j!x%vSD#(vwS=oCzPupdP}VShq;91^u7#8B`6qTaCh zV!GyC^&A$~<5Fg5z56|b`1#u+bEL{uJ~|7v%eJyqq|JmHF9i8s<|lCU=eRl4-cFS_?^x zWJk;^AP32?(C(B&T%oF2erE99dJE`4B3tel@k={8U;H1jn@so-f+%EnJh#BcAmH3F zd&y6Az&j74mF;IQ?9;%+g2}eQjtmRxeU!)LBZdCMCKT@J=(d?02B&whCHe(*^cMFf zsTZ)l;);$-z9sdfa-^Fd@S~{1qS9!P7Vso;q$Sc$@jC+jl7z-4ACZs^I!Q4tEdQC zPiR%I)hG{&4i~oQ?@(r%=CZJ7>(`2xuI8pMU!&wthfJ@wy8{e=!jc{F*OFmWjh2(~ zvuXVAo;J~|QA9Dg7Y8-ZPF()5a*8}G+E}hx&T2qy&0Enk0WAH<*B$6U`eU>3!9`ly z%K6RcFiIPZ(&NX3#Q;atIrZ!1M%HWPjpN-J#-l=;G^OE`QjM)oCnwOdn@Bo=-ZsSZ z-LIQZh?E}VaKy5no>>3F<51_oV(0xL+d8Hcc5B9pUZox)VKiM-_mh(e=)T>*Od)Q> z^r0wT`VJvUV1#?LysmQ2ui!S^pHztMu>FkFXhhYT%AwrRr3=2@I)VyRLJmxtp}wwP zE7HMN7u++@$-=cPDUd@+lPx!R>y4QEyQm>-m(&=&HEfeOh@9+KTLca@FibbHY{VemApR>%j>u{pfdf8Qk z2N4A6DP^nUPyHdrP0HdFU&2eL&jt3N7gfT&d48j;ejIJo^9%a^d){tluF`a%vom63 z8&(8pwsieTghms>{ef&wseO4L#{as-+b*3znuwT;;mQ9xAdzAJfuNxwh%rPgbu7|` zNI;ltwgf-(skkN3qO^W+lH&J_bYBO z#Zi7>b6SU9jlm9N#v$$pU}z_DXzP7Iqqm~KyNfZ}t6`cRD#` z6zhsV)w`!lbjn&_mbk^w5le1*zx}jmhNMjbT?2Od4tZM&rzxvv)n`A=3f0yjU8|*+ zhoDgHv9md=yL{zrs-8<i~uymkicZ_b8DE7SOQZp#SyCbSj(Q*MEHP_JJTOHruJJ zy(Mx+5u{I_-bqXWr)NPyEP0X}|9(MsR1byw;HR8$0oZPK^iG;Pj{ATplGt;_l^=Y% zYj3a0JhoWiUr$g5tblj(CWs6eQBTDm3rX~j%Z7mNuBNj4+#g3;@6RjvUnaR(2Cx$lwH23KJOMBk5(29H0FD5+|-z} z=(>}7By@KWvDS{o;fqc_2%8P&Xfc=5TgwV&w+E)7Ub9H_iW|1l{RqKqfOXJD4%kQCBG4sDr?EbSWW zsv!gF`Zk78Nw3eQ1mg-9qq+L{%OUA0);ybCAc4C@vh@7n z{op&%R&mwD>Fc{SItDF1t>q?QUTj(lYrX@L+H~K#p$3vb>g0{HrjnXvtLoBb&hwFE z9$f8rbJqG^au($-j)Goif_-1brK%=wYO+RUH^ne&9)wqkhgJzxAAo6jH+W=b zXvaDz6+ctzJAv#8M*q3Z<{0*BH@^HmLw8GtI((m_nVSY=4)-`#VpNaKJrFLBQafYx zb&`vov9z4xnt#WKa`56^HAK5q(rzx}9WsS$NuIxByXyI5_eMNAb;T#Ge+@O75I%zB&(;1=w=7t;u z-+ZVGd9BC2PGF^?0B3|qaZ3@?!vBPi>k?_{o&sy0+ETK@4U0H?ix1m$UfDy%T!*QHf zpelh-xVp8|L6*0#73>Sh^E>A+%|{3T`TlJPsgx{9IW6-PWNQyiZ--Jr?m$?hA@HU` z(3w}UK)oNfr>el^EjAY5Up4THSfMxS^wa*x+{IjO6?!-ksg8^2)$oSCXn5bD-R%(#XHKc7EV)e9-^ZPan^W1PT zPFdm}u4_p8eW!@t7VO`<_HPv_YHF7Cf1a#dtg9(og)V5-SbnxGm)A6s^g3KrPHUT* zkg&#VTnmZ*^tnP=RtVfB{g_2O_q~#;zX1B#pmo8@^jXSxfBXJU8N+xuHEJ4KJ9`-n>Css6z1c zGa(Sy<93$5kFxLE%N;N2i$5hU($mUabvdj|DR}KZ_ixS&46$lUSIU2=MImww+6@QI z{(i42Y_|IPn9gD2zNm_a?{lW{rB&&Olxaltt{5E_PW~iNmZD5XH4m+XVxE#a^>l7Md83^Q-;0;aWfblQ z0q$4AyI=P9ocM7&-;fVabmot69(G%#r8LQjb&Y&IAM{a!sFa@Ue5RCJ= zv@-8b?X_NCO(+Qsq3jBOJKya9uTKv^LO(9olFl3t$sLaiPs8I98~-T-Q@Vg&p{REH zA4UNO(o#+l$jTy76t~&iP?B~j)YW57r4ge-OLcvER^_IM6sB9q6tNvA0hhA&HAHl$ z`FYywt2UREore>ljjzBsn<1)Tp~PI*ARiu;ddd1-6V1#g&SVDr66g5O z5>D-1Z!c~>r4^8Qg_*wMTyskqcojq`d=r6=p+&ttRaToN76}*`;-g^%=^Ao^ z8SOzkAT~mOEJ?krA@3kyq;Z>*;^fN4oLW9!)?ki?1)C&sjWDsZkwd%N1ZaoVwnHne z&yvAaEE#rQeU-f-5(j!5Y*EY%* z2CJrIfp5=B_{~Wb#TPgzq|jb2fDi$OIrhX5$C2O`EdW%D63NfL#VplqIZMgKGi(7dni<3?c~{>o7I z?;EUPb?cCFs5_FG7eBS-_2*?#69o40m=0LHZ$1VcuLpBny(`Wx3j+^pDi89!gVt8Y zv&*4}3GNrnG;Q-vLRwafj&&W@w;fhjPYViwg*J2>{%CN;j{BSy7lhwzc0Sa8+W7?{ z|5-B2xQo?|CGIFx^~psBzM+7_a9&GJWT(VT84cDnUk34rRK)6QEAL0C`Sh$0P23{| zY{!~?btIIh-^TJ~Ij3O2@^brc36%r!$3ch~_(NZ5dTFjlJkbHG(K8_tCfUaR0A}<^khJ<<@0I-tcxqpEuQ&4Tb$z`mx z5FD(U9|3AHKALzSbv>wimvH&N9v+zULaa=QkG>E<1b6i=G51+>;X+OlwXNHvLy}3$ zYo1jMYA>(J|Iy4QSgeOB<0JWG#f#hbxL_i!(U!%D5{^?mu2GezwB!IGjda&bNC}jM zc7r$NCKqU#(ovR*ZcDagKq*w?AT@v+!7S%nEdL}n$|vT9UqdM2yE0EVVjTm-9!|s4 z-S!L7DLqco+>h$dhlT8DLES$Y>XPqz?39;X&ehPb?H-0&U8f-WesFogb7<=W^a%Pv zh7xpPrGK6@({fewLU8I6uE>Q#dVP3UnC;&1&imPB_v^{Y7^~ORCKfKO?Qd3xQ-wrI z#}YvIiP0Q`-o6p2Yj8_v=c_m!+tWYN8}T2k#UA|ADIMUXH>T~H@E|qCMmcY5jSM$- z@`@u`6TCL+!xjxiW#z{K&&x8A2%06N!J(lg@ZBNt87 z%qz^EhLB`ov1{6H)X*~4zD8Gx0G=XKie68GHQ&R5@kV7-d~pWTk=cX3~RmHpiFSNE_+O7YyB3vP;0}D%fAuAeR5Z*4C?o0Om!SbKt;GC6+IMh@4K-$ znpRt4c&(-&QP&^UVn*!Cbmc#-R` zOO{{8*D+s}Dq4KIGl0~;dq-_XFGgYV^d4;@;*a7VE(U|y8!+TDJE)eqH1RqwvuHMD z)?_GLbJT;t-oTr(rZai$m%Ya7*>7%YluS#cJZs(77zds^w}pG&8=q${tdhWcyg7HJ zZfdZ1#dZ~leICvcrN#OTjOfqJdN97vq>JV;CVzzJZJ%Qy}c#|A&55RA|)yo#|z*iQt!tl*d8TlWK{fZ(LckTRF--hT-P%E1Ac;Ben9$gzsKWtiq+AOFbB15Fyv{gPbW&c!qT{)TS#U8%%$#@G*PVy#f3hon^Dt~>UpSXYc*B}u_7i+Lk#is$4AXYt%E1S1*K=^E z=3nmOg^-59>@n4v1!wJGSET#6mxWXP-*{etnclNy3MR+y1#6xde5MBt8(gvM2|o)P zmS}CS(9s8cqD!He=Fho?Ok{v-^@NtebeeXY7to_BXOD%RlM=J6x8@Cmuw*Bs3u50d zHE?bBVtT4VMQvPh%ahk}GVAB?q9$7cQ~%@hXk=5BJ9U1%E!j{Q5eyASo-FCaqP3F! zU5~|NSwyBk?d(0%-B|o$F!o+#Xpp6*hy8fNb6D(!NnkoQ2wOb>hgOd?RV&$-l&$KP zExAk6>U3eTjI?Uv0N^v+b{7kp#k5uQ{K>aHXlyGf7A6>l_Lgwt=nZBurFMG7%4qz@ z1F?7GJ>$a@VWW++WoW6W7m(2GGZuKi7>_XT2TppprO{&4>gtL}3$hY7UZuR&$5za? z(Xt#Xxh9Vm&h*gqdum9M&r_i)@t>qXp*4uYJfyA2Z*J|d?S8xGoL+e!zhC{{H@C>t z_4kWddkbn1)NU_Epz}hB{P30xC_B;>J6;mr0_sX-QM0L4y21DkrgklES8wZj=NFa`EUDIJeobX4L{V26ah zJgm651O6)Qs=Y>V%$s$Km5AK(2x;wJ97m>d_KJ73lcp2XI_Iote}N@g)k)Wz(ju2P z`d<0kaZ)O{4;id*mEaE@_Li-mg%U0}E+@-nrSxTFuS+#TxW>05Ond6?3@#z^xl!_7 zWY)Ws{5dAFrRv|mx2?Ud^1+7q(+Yr_yTYsn{ME=T-8wUA_c-@cd*XxcVhzPvBpY%Z zsblCU)x|@|{uW?Gz7rE#FVWl+JMqO8{~K;zGKwLp#e7Id!;i5rADbJ=Yg44grtOm+|mU83KrXy5gigT(q=(P$f#_P0nD87V|>rh zjejxx;p+nb#B4(gm;DXD@b|y4soCf2eAZ-AeNFX>Xt9WrjW-}1TIP(6y7adJ6ZXrI zD3;2xgi8GPn>Qty$!&yO=;2$`Ccgz-TK7M(v(Q&GUYvY6z51Y({sWxrdBKTX_Zl!b^)+e<%WkK`pD7_aPAkgW8rc{ zQ}n^G)BBrz*YsrX8dzwSqUo0z)Xm+L-|fe&W*XSZ=|AL|US2^QMC%SWfKBb$!wr{z zdF@2s-!fqN2QaVBB)3vH<{#te6uAy+eNTi<{roRRO|q=rx4!;7{AaIvLaB=C^_bN! z+U%O8tLm}N8x5!e;Rfs=O4y0IRpJUSqg)ui-}tZmhsCNdmD#2>Ol_P2OMnCe6J@1O zoSgMCQP*YD8iMbizAdev-)QJPyMREScB-W&VP^hpr&uG&@wjLD5(Hpwo~1TVX)Q9L zGN*7wDbnsSB7Saf`lW0i<-VdW+4@IdL8ic&e1fTTh+g90=#2ZsJxd5kkm4S`@(6ES zzGTN`jbqcPb*UG|wH`b?-?gnkyxYIJeyUOR<|W|qo;a=*Iq-o>uN?=p2lzeHK??db zK89|2mRDj@gQ912P}Uq5Zr==~Uan2PVkuF&%V%e&_H_LMnI5kWk{;sNxm!3p+Jk_d z&iWV`J)1WEIx&*n9Gzm!TPkTMRas0F_HFvt#N}|xuK2DXTIpSsK5+Tphme(mHs@I%5|;MRfBcH`zYMr;+7a1R>kF_2cL<3!>`i`Ep6cj`3VFFJV#QbRb3Cdz z*g_HQE;gcZ7(5+@GSfoeLQ&wkgK4KTN9c3r5#16@F9-8I>Ro%=oing^84@#n%$moM z_Pn-q1gK=)G4x;i{QM2NE24Y@CpjLWV;1L_cPv6zi~asLft@~2d6eS{B0LX?+B`}` zw@Ypr${H<=gFU;5ZzEN<^;<~G`g0sxe9FJUQS$v&)lX%_z$_+ox5^RS5P%)OI zBvR6>RK`O3AZeG)nWr~!fA}Z&34L%fJrE9NeRhne=Z)aOB_`Pg-FMTuFHaDHkgs6e?(7;obx)O6pxEk6|Mi~8R^;*z zaOofR5i0Gvj(SdKrj+c{stT&EodXORdm#PTC%mSjh$KzFOM1VDiP%%*wF1vSZV+Lem!k2Ltvs?B|n^w$=Zj7V!T4 zLjd2B$3Q6G;_45OC(tGDiJ@|>63ycU;Ri8LFGQ!x`x}2-+wb`XeKB@ngb!uLMYbiY zQ6N42q}Xg=_ur09J_71x{Ize7PwPADAz(i8Lg!kLQApRea+rck=SdPdK*Lr7C80we z$09_rp^f*9-UxMV{Q6`oDr4v;^nA7SBLWW|u^1~umplyEn6vf>ViN(bV4(*kj#&T$nr{Pc*y@Rd_ha z-buf}!HsC~LO9;Dsfom-3ziESS5myCPj0=W&1v|s*h~5g7WX{4R#Rq9qK?fD(S=OH&q7Y;sWPg&y1W+$0elLTkq|!nGOIY z31de&Zm2Iv-}qsE&V2lh_qjLu%CHm*YH*_P_(rNVs!```9S$qD>N_l>pAhz>f)NQ4 z2`lSf)Vz(3*C)M%oII-_dme31Ma3Xs_n}Zxr+h4d&2BjyI1pX@Dd$EmQp=MaTW3U= zIJ$VD_-#3LG7q9zW`ed=qElD83?>pAS$1b zfKY2zdm2}!7|c{lSSX`rNCtUdL#ShZH86I@rqoWl=k!M%E9q8&eq`Luc6*+}^jl=9dAmE9?9vR4j#iS`e9`xhzy ztJ1}Nf(ZhiL|^50Hx*kab{}hl;_xV6$miLkPkWFo`0^H0ZZ;^19=kSB`yk#?Y&+V#+JZ6-S}gjo*or*K~V-O#a#V8BRt>ct6dTW&XtFK`79c} zm7c=V0W48qjT;-(5_p%X8Y#C%U!yI9m$+8(@XgQoOW(XXRY2G?r#*e`)-GI;0|1II z1q=_91pD-+KSxqqjXV4j-DUG;`iO)WAWVhs37ZnQV0msT{w2pq0IgCT%Deep43_y* zr>!6PszN&O2k3lR^x_}R@voinRQ~^i1OAsu9bjIU7{W$m`pwcrbjw)z5-HU`nTuk8 z#>3KhuT+ASGYWHrk3*{$r&~hxWSJ^jeC*O*E$A%EgMy6Dp-XE#%g0k_2hxPX?__ZH z5AZ{Y&_E$@%kPodnAipSdsTR_KR!4YALbQ~izX{8fUwv*Lf4Q2e+n~P%h@s~;gOa~ zc#%d0L*^-h)FFdw7B0O1`?e6|c1pGYW&Ik0P2QK;`fMbncQ2o>X)EN$xhqlL1R=V7 zThBsNu>inwHPs5M_nOb-hT=u=sMRO!nKH@Fece!gsH&HxXW_ZNG+Ra}40es%l>RfX zmGI{xIlrW_h{>ofw(zMhSc;_<%R2LCnRN)l-1ok$Lt;t>G9X^|>P9@#?1!n07c6vt z{pftlQ%vl%nH9X1(TXoXquVVDm{*WCagN_IGZPLRlE@;P(r@>lPn<12sNPfPxxN!UIRFn2-Vmn^xJH!V(4!VMd{}DJ~o`>KM4%#zxn0gI8>2MYOT(zFDAb>WVhid@*^7`IqucL$c z03bu|G|AaR#_a-U)|FOvS1M{6Bl{L>uYO197URgQd3D-x4C+mOT$~?oGN9$M z3_#zbM>zVk8q97Ky-(!i?fq9n+1Kc%L{}`orx49i?RfyGO?{<)yK`t~b*2M#UgEl;Va1Hfa*qaDlM9k8(l@;NW*q0L-MJ(*Pd|h^u1x|EXvj(p{i!dCGCUItl^=KKj(01@$`@ zsk40D3%)FQ$_{LJ*l(-C(>%w8gg?U25IVEEfJk(H3vdgVnAy*k^cmLC1uUgBT{!e* z##M1&4zZk^w0&0*QvRU#|Aq&jwwkBA#9Jluy>|kGTbzy0#uX;O>iT?zsbpbA7b2<&27&!sWebQ*PJhtD8TSIpxWSer+6`z=E_oi*8Lnk7JV$ViD;jUeGkpPb*CNk;f;Jclv#M+|vCCDg~4eVK2gKJjE9*gMRgB5MBN=er+HHLcK}3#u-bg+vVD zk{^P#^Bha2rkmf(svnBS`&);OmTmIwt92t(@}$uTs_{f-ErR;s6j^=DT#5W7@Wu;b z6lUlLXyz~SRP66C9!irQnKm)4Dw$EKUfC*9I~*&n{99NeP}IK+E@w9*j-mzhNu>KNx%MHDRRZ2 zMn4AZifuok0^%E^!K3k{p^5bsWAoi_0=;C6FsRQbSsa-Ug)@Q3V^7s$xNCfJCAKf# z$2)}T{O?9&O~6D{Q|TCBsW}hkbd2e!aN^4k&VPVXbS5>N;b30vg`i~`5qZI>q%l(1 zNbetA&G3YAFmKr4eAzZ4nZD$d&>%V=hje$|^uFsfv&??j2QibdXKR%yj=G$t7Au)Q zq2K>whUvw?DY%fTZ$$1o91+RWvJfqBHUt<5znE~pDsJc#!O&uO!hL01VPoOoi&^9F zOsgfQ8NIp{@SROg`pxj>)v9fiYf+W^77NgI@{3G!QZXI^E#~R8Je;p7b6e z9AzXC_rq|L+uefbEk&@MoB&fJN1le(Uy&Vc)X!1jZIckcT%PF{5AVY8Bzh~2+wo6k zQMp7?L16_B)EdF(yV>EQ_a`0YrR!Uv3u0$S4l5S}0QhuS!j9ANg45(3`)RdwwsxFg z1{n>-C9`jKiW(LFRFQ1hw?ZuUzOI)`g z1ZSFv8u51Ce^lPYut;D~!vnEmPY1b2?oR^5e2soMVm_+kPZrHcqp@j7IdULFXHPy-<#HUXdV>a0I@6>=ol; zD*tG)>75w-upikSNW%NjaN3R4;!w}%xQUoec|VdbdRe&2`N)Jgy?~fL(b`0uSXiHr z^nJaee-0+t{<9HwjvAGt5p72LDOZ*&oIbOZ|82SK`CCmoR$j{c%%N&_H4s8YYdmUf zGrNqe{t`}iVX&cZ*YQ64K|qc2S@^j+5$?P5NQlsJ(*(Hn#E(NWqyjPgcFjwAcXh}; zlJ_}z5XD;j1kt{t>6mk6Z@F1Vpy$MLaruw+`$dqJn=X!)lXff$jRq=!@;izIz6h3s z0p~2!#`^NAml#AJ$Da`Fd(rDfhqQ>&!2r+8m!7u}8PN7pt7+P~=i|@ihk6q5g|4j_ zNd5FK*)u8Pgsbv{PAL<~j4OFIT4IZB}vzx2zT1Ol^k+|2+VTZH!i*F+u z@;x*q5f9HLOi{KO#ct(-IS~w6Ma)<@t~A}w&$Kx2<;J@itohPXb!%)J+kuzz2nPs{ zJ(FD@c9`rcCKGPd=ovHtAN=PNuu!?w-`AfVX3egKVZW~Var4xw8uH;#!qc`S!j!4d z#MBw-5711q&mcy^rTIcdQ_?WXjD?1bM7~+H)Stz}GCKV%H&Zp5vWoT#YLbb~CyM8h z$Y4orZ19+DXNR$7atWsfe^8CALGbI!XF;ZjhLe|(c&RX6X#Or!`rYErYW?-HyV!Z+ zh~}p77G~==Z4hGEX_}woqqipy7&k)Remx=`z_$oZ!|o9@!(kMC5p~z>Ozb>YQ}hCStxUNa@o)J@URC} zpFgN8;vUS9(guyI85Cr{d{AfW@*Dkx>D_?&v465G<#(%bqJ&w!{J`L3T~)Q3bz#x( zh;@6vt8D7oVvAsVdwNft>Hlmq$}6Y?i2T-T^jaX;p6KObf15wxb~-C$l7aiihkC)9 zHHIJ*1HKSao8x|QF6&y}m11a&P1$soZ$_EgA$f*)1Qp%vrR)BlEgH z8khwpI<9z_&tcB$+P^t;Lq{?M>uYr`eKyH7 z@YruTZ_zWJpWhIl@Wu*jGTf&bB`)t;Wa#>711jFvX{V7*`G-F_)R!6dxmenIducSj#n0K*y4SZXyYKFM3*3DJ ze_Zoye;DSOCe!b$zx?`iXlNwDcw-msnm0%xG-SlJeRa*=Z;bd8HJEoC{VR183p^R0 zi&j}sur7*4PoqEmQY~bL>rXzdy(XEPL8zC^dGLyCfL&Fy?+vLoURv>-bhNJDprKQ{ zwq`Q^asQh9fwcZ_Wm5u#99+k z6hli6VR-ZdQ!)JnYL@H-3G=qG5YBgVibFJ!4p!L}?j9&y;W+}4J$;Vsmr#zg;B-Xx zu;1a=ui4;KB*!aUym-ib^rO9+`AJMZUna%!U7S4okmd1nx&PMgB20?|r2=ms; zMW|8JPboxJBlaVc>m9-~NWch5n0@U3_tJn&mIIQ;K;Y1;Ssp_J`I2#lOd{Sy>>0C4 zK>LNC23U$^s-AG`htPcq9anPsj*>-n62Wrs{9G1$XWvEOsfm9tV#>K+JrP~YvMc}% zqdw8wv|IKQ_rSs5aoGixsA4RwHH+k`Jy_(|eDz7G@iXzsk4%&{ClN-j9}VxaU9N|G z;u1f-Wj3Aj`LJcII#zfA8TTkgTDJ){^xHp`?3*aR=GCUV^}~uFo$tMVEJKiWMNO*$*8PoMiO2 zq|j=V|IzkQ*rOx4KUU2wx8{cG*R)Oqi&fy};N+Ll8|#haXSep#AK1pXhvSJli*c296&3u% zaUyY_+QnhpTt(V!kqLb_$wqEe>YB6i-n>|q+ zS9@5&G}PWGY8(CCl(tka-YR-Sg=9TxG+${7Cn%i{yv8TBJj8X;%;LF+sYGe>^I*@} zMMCu==Pu<|W?FfU@PszN?iV9FBRE-eMaDLmbz!j6W#Bsg1tJ{1LKtk;7IV|Sm2F)M zgLRp*joz^v(hpUU=%3{Wen8K|nU%RHzUoaIHlpOnF>RP?d2_v~J^g^29yGsulKVrZ z6Ypjht3z)YXNv(V;H}J7=hx+R)j~qUXok-=WRx>fzv8p)O~G~q2%aMHV`YRD@FDC$ zp`z4r5fI!1z9cui@zL$GYA@mwmsLzLs^`kEjG!5d`cjdIXUv7trsDNQi>t41KZ=fZ zS3bJMJjB2x?u9Xw*TP75A-X@d7PGa0L{u$6V$cpo=f4VLx<{+xupvN%SA9geaI*Zr zftHOjJ~j$xm>XY$cpx|a_y^@1RfP3R4NN6nf<@SLN38}Y4@gOyK160L9|!6R|GZ;f zP0r2nIalb$fCZeX%1JPzlrCPlRp(atW`24mUTmzQV1)Zra&$Gk0|U&+-&q z(9S|Apt<;mB&86~vBHC_)T4tG)84A^S4Ed(hAtzY&p{>ww02Xy3;Y7>KW)6lI`@E{ z)J#`GYeUo$Xz2Y@qZ=qOoB{&3%hxS4TbOPq*=E9k6>n)A3_#oyDO;z_SusvrsM)GN z=pi%AR|KVuiGw-E=di}Vu6xg5G#2a(EP`Ex7;nhl0X~J}DoYPHkYdokCaZ5KigEm& zR){oNzz{wBrbw~IEn8!%KDaYY70NuT@j-+DQAvD8@Tq_)OYz1}Fi|Y^Z#$#>`!j9n zUW1PaUU>L&3HDAQa@1SIv681Ih~VvJG~$#LXSm)EG?~&CJ$XU?5lIX!))+`;k6-^U z4e=lfkCQgUfS7v)0iD^g;)9FKzll?!wWp5X$j!m5E?H3MUJnd_Lq(bblGKV;AmR!w%E6VWB5aF{ANiC4Si5S$ue)hZ<2#qCYM>|?-yuMg*zZ+P&n|hiO z&8DHE%abc*f#!EgBo)@H@NOS;u_kYE41MK}eI@|4oQzeZ@BpTN)`gay)K0JVPVxR9 z4Phe$z}xmHZw`Rq12NEjD~>+_f-XJ46Z>A_Q-qc8Fzip+H|w*BmX@;a)}QC7R&i+g z?x2x_(ni0uQWB0uliW&eTB)a@>_!KZ+Jr{hMQRFM@iMSA+AvOl_M0l zk}P0|Vr+-W-|!bxudY!?-}gm>bTMP=VpvS3{7p%H#@mh0fAip0&Nj&EGf}(aDw6aQ z^W~maBWW6K9>DO7+t=HM9xs=u+~t}~6xPkqhS^^hUN;VgbchdKXo zdBO9p&U0Zx<5~YyQCCCb*BFS`ca-**|G125dG3pm@3f|XTqY*kmM-b#n;6wvSWE)Gx?G+pH*o*T5Ce>Q3IpsVp%q2 z-cPd*gwv0YKOeAuB^hjAV|hy3ZO#bTNk30!Q0tpjJ8Mghp0F#@sDixv+r^ZnRob3U z(j#rPjZ3;}3s-|FW`H%AqgYs8io33=m@!lzs|A)0_R_w+vSB7{JxOIAlQl_rEn|`O z8z$0?9g{s&g$tbH_-K(ypP^&VtNvsWF+H|ibEOrpCER>iK6N4vk$Oc>{%nToQRoZ2 z13-x1VyCvkI(x((`c9SMGpEXGkK+?x5$(h3ol;>6iAzZ9Iivga(dBGRdjh+lVYVj& z;A{x^Im+&gM%}mbLi#lP$`Wtxo~i9(O#GKDJQ*Cz`KTpjj>~0D#s}?B1I0fZLt>Jr ze<|yso!yt#n-E0|6~{0ctu5`HD*2~yuH`c2x0?+B$6&t*iq-znc$HEOwmifeK!aFQ z$^WyYv!OB{MY7b=353)Zg+Yz_WNLdcpX#+mZU2umQz?xLU-&;R=x}pC;TklY_ws4L z0&!g5a7HZTRT_3RBUSsq|7EarYlb>goKE`V5v_h<6Zqx|o#&tr%hc9NP02ak;-tRn z$?FH=RcbzMixoSjR0=)~3Erq<$5Cu4qyj_`-*R)}ELED3ZECg1x;R6>V($k?e%||v zeRkq^A8U52TPOYh(e~C+QGM_KC@rakG}0gpAP5K|jda%xFn~z6C?En7lF~gi0!q#> zATgwrbmx$wNJ%Rx%{`;<_viClcYW_&-?i?#{GqHf!#R8J^Xw;IuV*VO4K5XihyVQ7 zl#;AEtpiT&Tp#*t^Xrl8=&@f@O3{wEN4%1(cB$_VO1HANKA`SXu=#^@7J9!gU!^y# z&(=$4*^@Y3Jnu&@{9ToPDnU_(^Gb84tYV5XoiEAR5_cr~s(o5*F0Vf9BT^8*T6HgF zK2`BwoB(8c0pmo&_I}SIdp(B!w~w_i*vo};9sraUx|K0Hg)@r3rhw`2E7+3VOE_@z z?-N*WfeqrayFWdJ!dUffxg`#mC*IB3^^syDAm$^Q=AW0a*zx*7FT*=EqZRYXANImv zkPL4_;#n!aOmQ+4m7XCrX8}vT8JYAwLjo3*vCOUj#`N^#Rz?bddc$X>S?_-U!T4gG z4To>*QA8$rn~W}Jt$YeO=*@yye0&dn~Ih1(?|pi62Zl90%4q7)OGN&8AYf zJe-*p^dZNr*>5`u&=7qr3r+{~VzTsfvMiPpf{`lrc2%6YqpCmlaQD^D5A#U_x20Kfh5okWi-$@WXlrB6&4r)rqWM10m#<|E-7GwEVj_YyTGcgI-Snw|LYd` zOLR(LPTk9VvH0_N>{~3eoJGZ&t)``wVgeTZrfj7s_f|L@$@z8%MM8Lwr!}wOpbRoN%nj_ zqmK>XDJ;Nuqx4mws5;akV7*N9bY+44r_2Puz;o37a8M^U>lG^j~^k;eSn%^-S}LuZeq!Enh;m zQF@e>m`Pp3;%2P!&L=C*?6q${J#J}huPrm8qrAseB~Ino_PbOSXjFYu`rB!4ig>{K z9^$Ir>LpyC04Q?nL4=B!yyLIGQeX|VsrcFa^Sk73cEeS8m{uJXKivc0;QSBkpSHgT z9UYpo?GwH(d$gpO>Qd!(>g#{j;M*q%$sGFG@>Mw09j`OAXEg*8_I9H>wTx%_kL@ot z%TU74Kl{q~Eh;@%`jRwsvwLL}s1~)RrXdt^U)}X@K>{&wF(O$wm#PXph2G5aU*_EM zY*XbDI2l?lt)38z2=!K&6PCQg60oG-5d3h~k|ulTB8>E*bks5jwzC<4$Xz>K6K{2V z$5&qeSt=EXYk)mM`n3triGOyP{*{M&iHRY%;j2%3c#2PQnHr@f4lk0wTKYgmBsP8& z3~?wWAi7;%LbS~Xww#{Jm&dqsLQft{5T~25t$U$YY%H>I5(4bJ=3I&ht1}eKvrQyC zh|?c}iD?3fHA^s%XXXewP9y>x45Yrl-TUE0~&1X?{UNfOvnQ1zfN+VnE*?e8V<>y2<0EO3gikB zu>bKtf%JUuo4SKX0TY)S`B7ODpv zd;y7>>|A`k1(8q4h*M;tY1EdX#YB$@aAEd4&Z17#J}^o1Nqc5_<^#pa8vRq#sFoP9622qSVyIpq*2Gzk$ucoB{QY0={K18rjXp5fC&UXi7+;K?KEB<&%3pp zt|2N~<|fqY+DFaYdOs4$k7L*DnzovuEDe<}7&zHtbrLMPjnxcX%2Yn#<3g**m0i&> zzJ*KjcXrS}3(?3so8nHrR%H2`dqsXd%)N$k0-s5CZ;@Gi= zg6*JS-Y^UC?K1EaJCL_eL)5%Az7f#CLED}~XHxWs=g=>O_fN0AHX{oUvx z?r7X?e6-W-w;-|#6wTPH>NO4Ic*($)I<^nnLs08`*rtZ&ehbAFBq{1s-R@J+s+xYu&j^xWFlZ>TV$L?Yz7)}AF;8s2?Y z68)>QqjVsNILXIPoiIb8&(5beY5S=v%pFE47OfvLeq&3$Hbv`!!Wj{;c-9=r|GPzP zZZD$0B@!L-Wo5}EX(aMqfk@n2NlhD*v734~Z>js1EykM_i3TnWON)=+ni%J`{Up^2-FL$H^q2bAxoo=}= zmU0{P3))~z9dy;qx3_f?p?8l_adc!^P&8Ff@kJ+_IbIWPNEu1EOdpQnD`E3Wx5O3M zJ=m6BCZFF5mx?^I=2)=IYVP~AY06*DLmx*_SSfj@h0>7BH2UW31c4+ONvBTKyhnj! z%!*!vKmhkn9xwndSD6{h?Y)IJm{C|-1EUDK`D$kF*Mr>nrn`3ls*Ra4jpuWVD0ftu zYG6ql!RVba8wl;hF ziLBCWHI6D)zRT`%a`34~6$e?gs)DiB-e7V0TA`mmR|3sfPr6rsJg&<>m5l#axxSdI zxSY%SdRQdhdOCDB`#H{PR05M}txHBuj?%08o!a^Grrk&JT>eCWJW4D@Z~)}=-VXqA z3|$fMU=?26`5PT}7+LC$Vt$t^=Jeg}rKf$9eySS&&a+nOZU`(AE4ga;R_Bj}G{Vr$ zz`!op^{%vR!`g0O%g>f`F~74&je8B96RH*%1c2=I0CkF$uXZ9{9h1#FxPzyzvwLJ!vQK-Js!~ zv%Jp0vU^zd+sscPh3;HUc?)rQ-uZz?$X* zrKWIfU@(sxHl_Ee!=YTI{kXQ2$9G5gu3i$nCLCQ8L#FbHp-U-79;>HPpZAi8)k{yO z)nwtca=Wz-(dHCQz1yqV$9+K_;6F2=mbUNsd^!8O!JY5YH%!Mp*5qUEJpVqL^nu(v zNJbJVZ5cn)IVJ9YXS8Sv*2D0US8bf$WqH}d7Gtzh5brp0%)*(^*+a;vWr9Wfz=vMi zcR0ASV>HFqe|6=ob`Fz%q*_thb}=jOTYQqH)BJQ$nKS&^Ht7M!8-H&4!+9g&s_E6E z9nzF#gCzS_tU^oP`DLtt2?`E#&|M>aZ%(5qnfn!5WH*v(@g**Wsu`>rf>jWYCGHvR z>$a5h3ZGV=%&lpbZ^!#R)^OU+rR@dcpzjB=U+4|(NyZ|&pI1h@)1*X-)$?Jsh)>>6Br=C5MK z6CSd+m8`wJ#E(v`QpjBGx08@ZbJvBFSUM4k4ZxJ&!unZ^%Il30HPTq0%_taeD(6s- z-}+y?%1~0QKXrOstW~&*3-7-PuqUKUz$=$t>c@ojMJX5@t3CJIFX>EPh(}O1zMN{t@861wHss6daO-!edgjsIHz4tY zn&Z3Z_0|5`<^C&oVV0j=-HAM%PjJ~EtNjQmAh*a!30?X0{A1A#{Z5Y&>E9E%SChCD z5sH*jfN^~5j^-#A#LP&)K{%RN;iy@>h5Eki>oa;nO#3o%&bI+bm|4DcmRXlH)Bd8h zyi!Z()@LD!(s!41clMV=ooBOWH)=|1-MJJVO2k6%cN$KigP(A3c`mA{AQr`SlAH=` zN%m|`BH}X^59^aUDp>8j^uw%qC7%u1;!M>8_5C3afKVZOIQlrD1OVzA$8hOk_7*t4 z9)*b~)J{kG^6m68bQkuzsmOi&-Pey-Mh|p+->yam8MdK^2TU|dZ$=*55G9(iF?R%Y zKQdO-ziaM>H)Qbqo>A=VW?42)hk6KK`m0sdnqQ0zR4e@%*@JKUbS=-DpOc<^x9_}B z+)o|Amq<~>{NwaTZs1-Qtu%R%D%1#phZ)0%zcCGlyX~wW-57;_eW}^UOfruQb~F&6R=Xr%pF?u7SJA^YUR77U=DIUgbxwwB72fnvHfnH z#TyojBB)jxo%ZgZ*Y!^ZcH%*UyAG!U4XOJ}ptV9j{(SDIJg<>s5`OR|<1@emBCopL z=yhKg-0!cmWQ4EjPdVE9TdpuqZC`F8efN7P-t z28`Awy4eDV&|(oF1SXYTNJ7lbeBWPrG}(pc=;DccNDyT!{Na5VoeoTidySvh;{z(e zB1g(;hTn+1EB3?L?f1gMGCyR1Rp`)|Ug`HgyLi;uH}lYG1U0a{k>_Auc&m)hAQMzX zr#_k)v?C_LAp%)bN8xwW^I|VuC2Ke;WJ8euLj{R46$N`C;!w)Pw-&(H$ zz-a?uA*FIKa3NfG_oFW!Bl4B+{Pz1Wn5{G!50*QaAM@P$Jn+BBF6=1VG(48Ti@k;h ziS?=N?d^Bcuf2YLB}0%(MKLZQO+0sx6&pr-5Pq5O$~ zzkgokoD+mj^N_=Vn+9HPC10NZzFxc`>%EewLY%3rg88Ydx<{0*WSfS4sm_K$D2=bw zH~~m00HyJBr|z3J5>x$`U8&jp4m@Hp=*H&JBNXteRId{z;6Q7hg~02}Z|7fs&pD!B z&T?luxZcK4{_lFfajm6ZJwn7rKfg-MN2-z5RygBP$@WjLf(3M3S zfhlriWMoM0)_*93Tz=-Y@EJHgN}OlBdjVd46?oQq=k@T$J6%MH5IVV_EWbAPNje1V zw5mR2O3;sXGU?YjD&>a3TlLGG3Q?Yv-oU#bAW^pcEf5=cT56WAk?q&#MQcDL{#&hdNJS)I^XXQsI9~Z3Nh)xuBmVWVpsv+ z9eQ;6GmxbSd{9k2FXOonW(k=7p(F8CDp34vpmqPoYiTXsrZI!J!4Xjf&@j%(R~;HV z@X1@2RW9g9{G2A_?`?5xO=?M3va=3 z560mDx%{H;dh3YKS3YvzTj}j@#Jhl9{NI4w zur;$6gLlfY0iD9eNBBqJS|9%r#hz!R_6uC|jc8my1s0y;M#;Qi`}#@dLG0~&Gf4zl(6@1IYa zuKg|EH7rV|z2*lVKsE{Is@jGg^>W15yXjq=^vJd>29rpQMmg`+|4eiG*?gW~texX} z@g0_Sb-ty&9~!qkQ`sQ}iyE0f1Sse5A{J^N1tNOwN4$LGdn2;f7Z@v%`6rpFOUI0EITP*4)c&``fP7%i^PruU*r1zS$ucfCol zoG8+wweZ`U^&t-gS`96U8OhZk0E(E zW(${lw_Gl6_2_&$pB_30j}Kh^xXJsj=o4VLfkNbnG`Xd|&5{i>ZU7841~<@_=&G`; zAxosovpxcmv)J6ve@;ly-!2#x`~z6K8d9vp6Q#lvrC7)j?yZxzM#B%6NiVEeOvp=9 zWs4U2GllN}csvK(IX5nG>r&>2biFQGRRoN+wq=&RsnT=SX}t?Nz3 zt9_&RGtbpJV1u}wpjzv9v;v<;7xT^#8-Mb_Q+X*A??V38E$MVV1gmEM43 zS>ZymRVD=9AM00RrfK&gf_fO3Zj&VTx(E|2-e|$8LG(Vg!ljT(Ad}p-PH<`k3M&{e zp>5(&O$~xoOdgTv6A_vbW}%pAHQRf-p%cg;-%I`6_1=) z&dx&tOqEWWIPae1pmqHex{%@bORh=~N z_wzk?)YH&&xlawFYTdgs7&-{dKE3u;P``l`zNM^x@U*7uB)YxvNrknpGQk9BUN{2V z*w&_voo>q%YP3_+PkcWwQOxfHPcPQs9UHs3h+xiVDe`V6NL)NUA*gLQ zoz1ZA1G^?OX~f&}Oov*8W~?THpHeRM7fEcp;J%sPUY9Pb!JQe+UZ#smNJc>hB;S}b ze-KDUvr}>{*2%U%#cv{Z53^w0k^Crx`Hhr0oh6~BYo|LkLZhDD7DBtv zQC&(AEPx_rE|@c(98rc5ft%P68DWmpZ_F$wyq_}j>y^meK>7xrK4^V4Nbys04Ysyt z3>arNpov_VizhiqcNFA6^d=0?7Ux%bTbp&2jT#LV;lL6tgjNVyPPrJw`&=L*U?s{m)0h)%L^C;yfp;)9fxkY*ru?q(IOGF@V@*Ad{vvn4W&=! zjxVHd+72^D?Bn~^bI|P$%w}u86dcei93wDohVHiy;3Zz6MnSv=zt9_>mf8RTJ%X>4 zr9LQ0-uKBkr54n<@6fUnvZEhw)uv2cS zeM}`B%~lA?0M+C{E{yfZnGAI1IU$;7^ZA2vDoEn3jPl`jo31W3YC-i!7Vui(~ zvS%r5CCf!CzjVUfO`N0}W9bvV{$uxR(C~90U`V)nOK-sDKy?h!R-fA`A{|sYcrNL$b#jkbaKmyw|xdfT*{fMCj@$S z)43eb`~;r8x0HV)YbVZ-(%9P49V@OINQLi&bBnu=Pge@ma_GfV<(KY^f%uS5FK^EgB?>*p za~*9}XfLl~K-J8yNYPR{voX=A=$j{5xlSn65MQHxKe*~of=msb4$K`_UX%k}EOTn7 z*kx`PuBDY#B+P*wgUZ3bz&m&L9Uc&|HNShTF&!^x0^~BzjieMHy`SNw3=Mk&%PYN6iExpxp=wwE{+^w! z;4QEyin=!!Q$yogE%9oeZr>Ne%VK_NmiofLKr34_6ibRQd>)jVxnLWluWc9Ytf7xi z8IxcR?i&7BRD|37!_%&KU@QvDIcp;}kyjC<&8(|{h(eUgn@%~^An}k2)Rn1i;L4U# z^DwFKXC=^xX@P{z7upCv567%qc19b)wbG^F&@$FZII|_roBWT$8FBIIbgLaR=5(F+ zjpsXXgx|aqr)Sis(-deYun>{QI>eGkP!!AxT{)rY0*|;8lAEwo9l=hw8tzz^d|aI* z3FDx2)*GV+2nPt8vg!0uN;WXQ=@6?}1_a++4W<5gT&S}E>8?kFVETAcCc40Yj})Gi zz15_irldCsQh+4vI-q;ccuz$P=8^K&Hh#lWj4I+T<`yO%-otDGE;Y74a_1i|w=66( zW~MRdx_nAaG#B)1z*3~0_$dq5+lETPzs?AMQ)eoieEF`RoE%igK!E>J4w3m$}wYN851qfo^l|HR!F_|KiR&2%_5puuL44n{Fq0rVY9{O z>1(og?v|y{!#11E3NWXA9uwF?Ktlq?u%EJ=j#ZU;L#?avBe$bk2|KspoAEESY-A-G zdZ+NDdePs!XO3~ovsXMV#2dt^$-=~k`bl`FOD|K~YHO#~ zh+Gv6wq}*5vm4EqkvXXeuFtz4fhl`PgtB`CHPkkA_ZRbEguxD znhBTm5?$HJ9&;ql5{GPVSO|XEESs7jU@b11Vb7fCg_aafZ&n5rJrHxf_WklPWDMjn z6%H+2at$#O=Xak5NYbwNlSe@MpR|HqY6#~eYs-GfF$%8TW-x+XYO?QI%2+jBe(XToUGyWOtIGmOu9TskraByUG z*kYszpMHH=n3$q?J&&j%MWXQ?QiD@%uF24{7waJw|R)(Am3^e#YVoF@%FvlTIezwGmQZ(A^hc+$NH= z=w7_tE&gUtty}&Mk86sku1l&`&%+tbh&N_4Z9mRU<>6#SNt{mKLz>7-wK0=CEQxX9 zr4`$oYXdR1U-d^Yp@emkA$`J+nBMNyG4F?Nb|%*$_|-h-jGq~2%y#RHaJtC5W^E;l z=|V=6-q?G6CZ6I8IK6F3Kzt)`sLuF9_ygq*f#PioCQ@i9vc=_q8yP&g-jYDT`ow*+ z(ZQLkyGEU+cOG2QUIRBPf+Xe#L(v>UlyfsFhK5nZ&@fMW=M@)*fDy;#%$qvLh~MH> zmHNjSq!Eue3zLGP7KxTqfV9K?_+8f<@}#AkD7KndNKjEDf9nlsa-p4Fa@oV-b0zIT z==gne_kQy%QCSGvy(gmO>^M)IL%n0;7Lx5rF!+VjW-%W^CParbVF{Ev>~L+PVz$>vmh*fxNzkAB_M@McxF!;C&0gez z&3*D7>6ekNiWNXdyS2!jVUgGYNNGASl9XsY*io^5jvKxP3WI-l90wT|xM~DdDO`-Z zhkm4Pj44gC2qh&;WvB)ZJ5rB!N6>Qyb~Gw#IBN4wFy=VI=HkX0Rdw5LCXkT>TfrtB z!NU|*=oDmh%Nx{qxnwXqcyc;yjF8>Q|wfZnDtdTn(L|@N$<=fC zxQu7ilZAu%8K7Vlz@<6gvnN(UOw8e6LhabXZ+4={Dw6OdfiBH^-cw~pydVc^ z^@OOk8uB`lW;xe}%V(2PLusObv&&CqJ_;gyQ+l)e6*VROXozY$M4o7S+~m2JC7B#z zrH>GX*JUH;!cPLXQ|((y90*y`*;0^re}66B3hGy!4n%2h#<`k+XpPWB3{Z@VRY3j0 z-1n6E(W6GLM?YO`RP!N6!NCuynVRU?LOqKZp)B+W& zI83ybvk?c`SSH=8_S^TYzu5fXX-##d`eb`M@)!8CH~^qj0rGPR!=8QRc72`G>%e_&si)JLEMM4802+M6bzj=l_l)xQRU4;Yd zGBi={Zh>Q30zpJDv~zT)26D@s`}*QPqQUu_=tWl`w`eCU6TZ{JRGH8DeWSX8G(C$v zauXl_1*qO@1k&aSvKKE=Oa!fhn54?Vax3Z;=M7eDYNY%?Cf8z1Lx5`nRGs~?MoAx- zhCdJk(Oy^s*vC0(Q_Jqe9R@V#DN2Pi*xa@~YDMTMs^SE#nGDQzGJBtp-=fqBpCat; z17KeiW~4!+k7um!=KAdm2K-v`xc=pudwuak+N+D633=v)x#KJ*6%Z5ROl`Qi%2Lk7 zGMkZ&`qM?L{#d}`^e{4YMKk7YT~X9e?O9ric1_pim`|RtwM6f8GfVFc^$W`Hx$mMb zcdOjYctbvbjR5%EUjglNL<3#GCB((+fHYY!1mGkDdh&&C{?qGBgSa!ws@mucP}BN8 zu}?!4==imTEM7HBWAq8vS817>J`<%l#o=m*S^#qUpZnzoUS%>q`{vOWUR-IgqJoBw!aS+W^2g*qC_7=YqmaRsvb z7FTQC{vIBTt)dhIZMClRyR9qJL+{mPygl5{v~&f5@wu}@xhyhin~1Hbimvz^sI3z4 z=%aT)8S7KUA}-2n=Q7?{*v9nvKFRB=|vuXvVLnV?h5VUxlYue#?pi zgXi|pLS?jJ{qtfdeq<&?$Ynv|$M-h1ZN`X6cLf`v;qb?Z7E=Hzit$Q4?VdpKS&f=n z{64#7@4vIlPjY_c_41y7@8?~KunlMNIEZ0F5kLA%w_aVH6>^->@akdsTHk(FHK#o= z&CLI7TY(y}*>K8_ko+Du@_gj6S)4)7vHe zscvbihk+bhyZ%IJmLjgGvfTiRHkG7WIVgd}aUZdsy(dQWcBqDrYzl|VIP$B(y_%jM zKYvkHWn1pXe~eligB04{a}c>H37}$Tr+d8l`am4T;OgpI!-HR1J$`6AfnV`P7__4% zK?dB}CtGcq+If?MIH-Q^PeKCsU2N)Ju)OR7*@o_OxR!LV*w*lhSeYU6w11_$)Qp01 z5abNj^kuHBIsT8=R>;5vh1k?cz4>L4o{n7VibBT>85Jv@Swf`-eb9?jM0P6ls2qUS z18LZn?WzH(Pwtq(ShxH}oF%r8!FT>DAhCQF0^KpnI}>P`QOD#>VJ_AJoWukg(w;RH ztYxH4+l(19dO^2hP5Eic2bvhikV~AD@WRh+<{uH6Xapp2p9E^F(c?u;39qGbR2nZ3 zviww@b}IS=8f%e4Zm5FhF=bls_i@6S?{|M6^RcDZR^%8*P(t9YxtSQR^V4xKLu!N79^{!d#SA5b%9NGm_=Lg$KM- zpp_S0=%@si_L=(eW7QDX#5^z$hkyl-1I%(qjjMmU1ls<{=cbAJz>P^bzTPN&Mdw*` zF;e3BP!^j}rm)Xusk6UDFwj?DybQfgmfA=po2A_~QW|-s?wxCYlhw<;W2MEPajL&6 z)uRJ?(Z9s-C3KPwGm)Apc*WJZh#Aq@m&@JK7Us(#GR(AoyWk&3TpjT`kU+VtTj}n3 zk&SYzPv)#|fxD zmp*_<-8pMf=LTCuqk_`ttYJfGHDupE>sQ1e261@k+=Iae&%Zo&%w% zV!vIpdEpT-!4J1_>9@o69(nyW@rn@(BGH_5rW;1wSj-8knX)potsTPuc7K!0z5tz{ZG~aiqpy^{Ke}Vd|r<>a+?LW zGs1+XU5~rLYn6k-wBf^{^P1j2y=BTwWW&PSsqChnzZXlFt!X$B-v8843cxTXLE}cE z-zuVj*ZX~PLb|>Dr|aAe0d)>Tqs(&bZYbBOxNX19G*;q}=kO4}6SbpN0JKm6mR)*) z9q{|aJTNf0xUe&%zIlbQ`_)UjJ%1W#mV(;dkI#kk74$`IUnlT%B82-wX-}x0us^eF zhjMidQy0w(ZB)%Yw*DeeaFL$%SIzn>$s^i;qZ8u(%Ws+e@CN>PlrmkLTOi=HTn*vp zM`89APYcMvyUx6+l8S{Y5i^+~;OI?Y?H@#gPDh9O=!J)piVH;)wVJW-0s=AT%}6+@#hcdscP22}geA&X}yKO+$?$%?s9qqDLHX*9fLaJjy&K zSLQj~ZCco~k5QtN51O1X1Vh&vb>`q-=h9S(w{YFW0o)JFZ?U`R9Q-KR*H>@&UKwf{q?edSMoCrP5UDU2IqslY z2L9NgJXu7amC&e~9U zJ=`{4Je`72#4`Xih0*BJR<}4h;}H~9Uuq`dSM7gCbk=DvbA}?h+FYq?Zq5S(_8J*r zbJ(_$b=7r#R|jZC7*Dnmdn@t1p-?cSP~<$egDzNRXG&>M2q%HdA>LHPmtL1cDJq+Y zF#O_3i5R+ya{K7)DYk&T9YJ7In>K01#b}jVDy+r|=8wh$mBi89do~7r=?wTDP$wAF zklKlQLmCjSw<|U9)dzCRKnri_e;6OPlEXe?5I_PbxPG$po9{4=XwJ|Cbe|t8ia!i+ zmCfFsgOATZHE{Nd-}@~991x}ecvzBvq)bB)<0e?EL&pBoFu-3n$-!twSBwhzfN^)2 zoWO!Wr%k{X0{-|TAcV)S`;X)D|Ku{I4rXCs@qbM{AW(Vwg4fRlu6WvvWc=S3(~IRO zo>5XVEiL7B4o(hoxRJ%j&6{d%I5*7ltEdu3xA|-@de{SV#-y0WGqNH6*XKGiCyQpy zElqh~Zo@qlY$<`RAM4R}fpl3BD^4{<6|-^i8#NSPQgSyA6TF2;#&aJ4-+0d}r0_sVxH!nf%L4k4C+DsXGrA!!~~xO845G z60sHZ3~C^-R-C5ObWUOozE1EP3irAAMvi0$ntWiJNY;qU$Q;y0c#NIBY!wpmePmRo z)h;9aj;|*v{0&B+Op#|-A66r2gWGICg*VkQiP`o@-}5~6oliPT*M%mgzDLo0#@=JY#v@7--AX+1t)G%UwJwyUB5By#Y4o3gf zkeH?JVme2$1K}n%%~PX9B@Z`1Y92X&i!{e#`804+Q`CC{8V=L$fpgLySeJyE!}^SA zlKaygz>JyT=mHfIOz39IWAflm0r9vc0n~xugB<_)b>aNJ{GuzMsd# z8=mT7*m;^J2oGF!Ax-o9DcgViTg;vokwxm~s}E0}Vzs`$063`a6Z!xiRv4g*GItgq z=$_c1O6`ZM=;8K{hc5xO@HZ~FSq?@!9km_TWh%k^*4I`@Gwk{%m@;zN-5G;dMTIw` zxLUW0g9{qa)U)~>NaO1N^A8uxZhcw+Jb&(ju9>Grl0YE$oDF45TM~ z`+-3STpqE4Ud|}H$LS;H&n1yVYV=hm)hLPUx*r$W_=nl1GwZ)Vh9R?Ezhi3T_|t55 zE4gD>^Jcyk#s0|k#fZh#ej0Fkhu+B^iL4cWB&qbm7^sBMM%iBfRg=1X72R7yxeh~F zO(j35X~E~^DC${ouN%GDTeHw{wflx6VsY{DG4@_rJX9$zR$uITp4$YIrbyV^O-14U z4V0xUKD-FnA4ep2cyYf4@UVZ8!gen$bZ&+@082`cyy>!8>f-h7;tl_T*SssUsyykc z6Ks^L$;rx0NlE53(Fr}Nj0$39v)gJ5or8;%MMszM^|?X0ru4a?SA2HK>)C2|=%`NB z1|n-f5!tp|e0kt+7_jq?kWhrK^l_M$&XYqFt6@Ydug^xTYYp7%N#%&ql&dyzxp3@> z73UWpVfRqI59Hq*w%-=FG}tAI^&9Jj@)I&CttE!Ix(iE=Pj=DEY0x(T*rA1K2dSe; zgWZ9iWVRwn=mYnY`UO#(jY|+w6vNPDx1nA4&59VU`Wzb(>?mG4FC8bNFon-3$;uj0 z88oPujX2SLe9&Eu97=ufE_`e)S_A$XLg|1;0UP4L?>$)XLGxCJ66S)o9SM=mG#@wo9e>v(CqcNm;z62NW%I9LL7OMTCiC*TVr@n2s4 z#;x0}e=QHi59#*zWmH4+7!Z!dyTr|DA`G>K4+yoFzyXK6MAJfj6~CMLN2ZR-jUhKb z(wR!}n6WsaF_F`O-+D)%Mn_>QhW2L_tZSY-4IgbLxv54DQz&pouU)Rbd_YS6NPqCN zw);765{pgw3D#1nJmT|uGSob@246*Emr(N-b9KhPn!8_V`p!ttIeWPIR*0^-{}K9^ z9740)o9sCZC|I%Iz=ysx08}y{S9?GD*!Bu#d(l+1{^(HR-S@Yy5^YJ^#M~_ug<_(- zsE3X1i?yO$Sas2}ZuV7sqj^;|-`u-@d{Q1zCyL~q0SBF&J^6@uzJL3s5R)5zbpJ;c zP*G9U{CE+VMkoATHss}M#>;Win$0Q9=5JA626%)Nq5b@zUi31pKefV9Ux>6Zh41SF zUe{50e`6*oP4xu2Z)31r*seI_W#J~w5!U^4BqbiIbW^z+sLuhhc%Bz^I_kr{VY`|p z!LD;KA~YMa)9`w&_1V{}jKKOtDB3&^T!*1cAMgU_S%k$_U1K zWb@A3fhXOd-9W}|oB&6p0OZx`G`qjly4J7?Y>_ zegNkn-x$D@hrI=CC<^0_j>7-2oc#ce4gLGwbHH%^I0cMq4Nz<$$pi0l080EhkQ07` zN$qL`0T(e|V%6>c^(EF~@R3vV7*864*+uk_BqA2t^*ea=*BkcJ1-{<>#y6LCEV`pf zLDcvu(fmX{F}2U)Db=Lv0%|VuDvZW;w&Q(R&QsfThR)13B06(e#SPNx%?%~) zQ?<9vEiTPCGijIS<@KxGO;<|S-SX8!6M}$eUe|9WA|+YsZ6sSQ(6&}ccQZa)F=SIjDb<#`Meh*a+#-wRz(OU zc};;h#bayrt4^gVZtnIv$WMH>Lq-jhrXWmS>mw->B;2DV{7DdDkf7%;5IQ^4Kb?3)vyA3%F~fK@r8LZh*D7!Bw?GB&CN@>G0ps4 zzC$#g3i^cV{F@C?2zFpidmDYiE2U~p&t*Dhi1ktGE==-%YWwW4lSfT(}XT2(h0N&?=Q#dC-VqQ zK*NMTMHLx1#1MJ77r%hPzW*62z4l)%8IW zsat1SZir0;I1)zWLn53iMVf#^L_i6IdJ%s?azKFv2jemE;{(_JfaUao#rgmFQm{4@ zT%nv>+Z$0tAp5ZPe36$nwSVo-$c1I?%cm2`^C_G3d-@32M_6zVcX*u^8GjP_I3uv} zStmf(lz!40zZ-b4e(^#VUd1Q~8bO(S z_iVSv>2a%J65D)_fv1Sq%!|;3)i;1TVQ*4z?ZE3AcTmJ|%Sa%ACdiWn3xN+ui%)0|;!2=Pl-{^KqpAs^Kd*%8e?) z3ATe-HEHf*@T={{t*M-e>1VBg+A?2qev^Rxz;^|=PWX1w|AdR@u%lDLw&`=>h#im- ziTDpL9;HLu|9fHYM&n(2-8iw1+uAAo<<<}MM>I9iphTWI0BnL+gYcCv1JkW(;wD9@ z>&YV$?sZt3*TD4-vYl2_j;h{W_6uK?n#p^;>xFR^MsZQMTYttaOZZ4A_1v9I=rT@* zy)puYtu*ue6Ho#BLeud~*#A9{ZleUeV)fK`XW;MBgJPsZ1)AhFBM6yTSg8~YCUXD7r1T~BfTuPG6wW(Id1`?FSt@-c<}HELR)6Sij!eZoh!A*?A{4CAKkHf9cJ7R% z443kB^t5KA@1P5kXJbCtbZy~OXbjno^Kk@|F(mEM&9ceZkktN6kiQb8h@a$mTiHV? zd<(N<9KcBZG2X$BzOq{^kL-2qpkeu)j~d9pEurrtZDtb^Y4ttHk>lprNQIbLW7Lez zOlC^U{I`3^xTgx8(4lS*>+78VnWs!D;ewxgJihoWqmgsOt0JfgE$VC+MA zn0Z(M&=M7VP^wY2`e$)5bMBnRvTX~tK^JU6W5|Lli%0u{vMV-ss74+)Ihjxhw0rHA zfHz9Riq4MYVt{^3p&x(Z(1bDVBgEbU&v6 zRPvbKv?AYPC%lnlVc%hC7hLQegHz#S1$Bf?l^^_O`BYw1=uMZri}7bFF(?KTo=Nx< zIZTncP!70;i9Ah+|A$Mug@Na8*E@SXEZ3=ZpTeLhGfb>%!z%~7DSPpYBkti6xWbnj z<#qgS{xl594t3)dIt1Wz?>Sy&sOk54wk2nY55Nv#|Iq6?4IZd7I+B8`Y@6Lxz3ZD*UqYSfHcbCDSu#Hb4^=&IxLo4!uD#85>95L{+*M>hcDGyTGJMfM&OZ&+UAA}*||KjYe!=eng zyF#=;(Y?<;dtc{V z-}k=!12fFr&mHSty?*PY*V^QyJLtTXBw(-N=Jc|>@$ze($JN$Z-EB)@_N70-0y%MY zdxAFvE4+z-HH6iIG9@03gKEp4$JsGHJ}yzcfTAIQbQau~49k<@vje&DriMl?t`7@X z_5ghG>%iN-n9ThhkGg8rH#ajsvqP>PFO5npx9I? zIH|*$f>O7xB&o!tnVhqSbv?YW=1J1Qn|J;987&KRz1*lCgtzk5K8CA3`$!CZ0H8dJ zZU~whoTg7^9Qle$Tuu-9I1tz!r)50(DS%;(H+2`e`}3Pg@Hbb=;(dXjSS)n#vy0!K z7<7T=2>B51dm?4=Q2T2m!@@>b@v@&=`+Y0^vhihCxifqILg+)%S@3jit52n3v$2eJRBiInhoPD!>aN+5rYd`jN{5s74?iL6aw*3q@`Ko7>50Gx?fb_*Ru(Z-K zffGI{Ir=b{kl2u_z++Ydj+bMsR?!FxD=kulcbli)n9%V|->ki2bCSSmp<3z@v3ne` zt*8FD()xNo6)DOne)}kx3k?{}=GXyi-L(8-Q1F#z@lUR<1Xqe(ygDHbe2EiIRu_5=JFZxc_|_>m}^kh&%op zEe&e@Iu+yaeOwFjnfMh})vq@E%s{hkpY-rIkvi<|cU;VMq-SbksjG5}7KriC&=L7t zvT5GiJ$D&VNnnqsP_pgFfuU4?f`L3PqncoH|5gZzbs@YMac;;>|zJ zm$_|OdNSVrP*y6#o3dm_`Q zg!W5IXzGm1So)yref@5#M;60>>Gb}i2!s4js+^6W%iggSfzz@S2nUatxu5jY5WY3MyOrGJ_dU?oETG;d_&{%0Y5v2fV{J#v8S(Jqi+W zB2JhLeK-JjcAEeZlCQYbPL~HQboR%|0Tpr*ZR&S51{~=f{2Bu|+kMK+WovA}8 zet7U0@fqeg5)!g3TmjDc0y%HcH-;o~6=A){CPmDl_M`yJN4B0ry2p8QZ1;=?${v+m zB|jAAZ`PK=C_Mx2QzHsu2poVR<^k?zXE;Uqc-9@+(!U3uRXO!2;X!L8YZ3Ym2Psxj z;cZDId|bg(tRVzFT-PqAj+GX`@~64==r zE3-tzTD}KpAO95P$>qZRf6#tyDCy|t5&uY2`kyLDfYI+wtpEPqu+vl>#}EQM?Ry+5 zTWRnR__Qq+a0*iJ=0E22z5RDM^v`bdJW;m!>z-`?F`zfaKTT!MKc;aafLFB#00mv| z_Iw2D@}1O(8zn@x`j<&TR1A^;7vllS-vBfVih!%OKL$I=-{JoNa8BA}WH%jcELQ?G z{j5M*F$#g|3v_-mK^8#UbPn%VpQMQbT5{mvL4|KhRv4u_L19c%* zh3&C%2vdS-`WUVx_w<+)o+|KM1ljY82sZ5sdB19)x%95yu}X;u7y4 z4@_6hXm^>()$?jJdhuBRl!9KfG4scdFvW#J{wd{=kz#}c5i(jXW3)kgXtw2-pXwyhG*}t3m z2b*9`mR{Y2hUfZvYu%cZJb2>*;*oUhtr+61eGLOc&`%jDqS>zKW`BW9v{4e{ zxic^0$NnwT7I2tVPCfo^lh5c2QRkBEE(I4!su3AjPK#v`(n?(Bb)I*URYeFgJ12xBDDwKCzdJ&YsNKYZP)37>2SPNjro%8z?Q~py{Vby>b+$Z zUd690$%=d|4U(LhYwbS2hR;W%i^iY>Wnx9fSXSFM;nmblrnS8&OTuOx6{bA&>jgjw zJihFg?dP`y`n+0L>0zkSN@4_sNM3BpVm|ZMG8>z&FFA)-SD$rG#S)X=7u5C-r^q)` z$I>`&Qliy#Kr5NL2BoOYykRXi&Qa1vUju~0>Cd|e( zTKT)j|GNi`16b#?7US9kPEc{fn@76pKIiJZO<@(&0Wua&TScl&VQ2cegxt)|xq`Of z&#;ttLy%Z34Cuu{a?1mt>u0u1tq;o7wi!46vp5b^r!##$R^9XjS&8eeIp{Y} z+~T6Kho|8b^X{HQpvxszGsWK2i#rDHfvDRH0Qbd0+?3$DIfRE!6^@gd1z^EsX6ZH! z<@W?7g3GOpr(^G-e^_IPAbeG!ZrBM5@a9B zy$7b(_;tkoUJ4#dicR?QRN%F*OQQuUiiB&c;JF2grO}QeP)$v%>AgdAVPS4H3G_-I z@rC?}&}{z>f=FAb7OF<|^A70?*n{1Qzt{9?CPebS2Vy6-YLi>2IF3c?KhlL!8q5Du zs`vL_nND^xr8i4ePWa`oYZ@s&DzCaOj;fFDgKTwyg>Cw z=>uR!c?1TOs`)=v9o`ftK3Vkumw+{S!>KHLYc}?Jr|$fTIz>B8flHpyT6a`iT_?(i z8B=DkPjo!p0x9Z#2k}=&7+^JmzC2V!#j?!Z6yQ>J#w&MNk?;}wH#}ys@G>%SOX;U! zR5f;7rWin6YeW$BK^Yhx%4hT6YRvv8@$;v)aXkWJxvN;5knH{KNVsVk{>bpxd~y95 z(PG)=l1ztE8lx-rYRZUbH6R2_@f$vYUvAn*0pZ{%W}PeP{2X!DmrH`_1IT&5Hv_!_ zR9FPg`0zsxZYdKi6f_1uDwsqOe8)~e$berEKkZJ`Ff`G~nXin@#e)*y%fl^W@2&oWhSr zOuvKb8i17$3eO|p4~A2Ye8WkTa=>TYHsDs~AY>{Ii-5S2mLHOllK%$+u+zZOdNqHN zkLCZr2?}uLFSO7bxZhr%qOxd%k4S3%{1TNb^8spp{|*q50TDm!=hu)pU&bU6L)n4= zHpQJXpKW{7^sC70zW%1Nc=gy8}t&l{wLqQ7Lk?toJ?Dv?k?N{{f8J~(WsyD zzzkzFiZY*_`n4^-pL26_*QX1C3;w6$o5#jL>^tCc8-SXqyDKxZm)WyDutVP>?!7di zqvBTK)yWB1kYS$^^~e#uPYvG6Q3h|gSNIwqEYaWIFBl)ykR+-PazEZ{Cz0IyiV5Vk zWTvLRbpi%@Jv!z%;B-l(1Gum3!*~ACgpS&Wivfs;EFMy%(kU6;K#YJ>u`aF<1@!9hSYmOQ%ikI|_aXAB@7?Y*m|pMi2_Pat0Z@>}$| zA>>s2Y7Bs2xb9!Nt-WcRzui9h(&D>)<2ey<)XY27bj{lw(CW!^s``(|^HJ2)mbMYW zQ&XvZDfT7|oiht9-3RDSlWs=4dB=bFw)V?;N*;}wijO>XN4{Q^i;`?Q7-?~8+FvmB z)UJLFhBGVWufCNBS{|~k*v-q@R+7$ACqCV6BEV!((HTxF?Hs8ox|Z{cV;%8=Ub8++ zRQR(uKryzC(W&4tgRMwPR@P1O?S|>nWV>=-_xb1qq5)XX3r$qtE}*I9&YbtCny|6! zfM6y!JnHt>S)=65+i=fYAC)0W`hYcBiJPRr>Xk`ic-8^ZRrr$cZN@k=wgL;kd@S-6 z6P_hkp(PO58gXTX$d7G!VQIfCsTEB6WHiq5_lT&mU%lUKW_`xYP2ZY`|4>7p!jT&e z9Ou^M!tKr6oKZ^aA^;G%>j3pX(_7d}^}L-hz1h&JS{tQ2zM7#O1fW{ZQCJ4s*}lI% zlc-()uD|D>idzMw^FBQgPGM@L!V~ES^)Sjx#2mgc z%VOa}xCFGenOGwgBPjC&(>az|{v3?O>$7u9TCvfC(U0XOLQGu_CHd*#oOIYY02(kP zzLSgs4lwlLdEh;8`+9Y9=kw+3p?Qp2ezSnQE~O_K)MAQwRH|tV(U=VSVI=4CFOe}9 z_E2!d*gaayXdxAyc~GxQFoLP+M!=Ui56|P>AST+mp%vTTC%#dGkjm5D_gDegK%)ocCI0-JA=- zzi#gP)6%~L!eCJh%q7cvHMKB1;38D=>eo_?B=M!4hsO!f=jo#*AhZ6AH}KyEmgy@g z1YBUBfdn8xh6q+AR_A#0^pSHTRQnIV=UR^IJljf|{+8`Mx^}y1Ybg2pV%${Xye-rD zw!hu^`m7_lr4Ky__0@JXZce_>-w_*hk`S@)aWLPN?0|!66yA@5n0tSgJW(qE`ZMTP z`MOt_*4pID7XbUGX**$e+B2_wjp-~gYnh1IpB@9XP?|B|LAKyB7Jg2mYR`}ivAmxmN z0$cM=g&qod`Vjyb!U;S`$oBdS2QU(ufIOW|0AS@UCXQH1=+~SE01xIn8rqQb&~w9` zq}xN@mMelnzm;Smhd=;~Xq5HFcKM`hU-;@OxW%sNlJj=2QSy2rx;{Yde2&WcmH^AK zy&kb`l<^|lYcYH^rWIODP5BT)S~|H|85e5-dG4BZpZSGnXagE-+izpe*jxvMJs?z# z4`1i*Bj-}`+PXs*G8JLil==B3!PnmhmT6(zPi9wtZPE9cF9nY@;3^Zt9g?~Rq%iU2 z52V8hws_d7x20#zM%$JQxiOB-$vaO#RCwD8+K(s8ik^~5KWDr@I|Pu%MKH`-T6o@V zbX?E$+B5Lf69wD*T4<$8&8-iC3Ut;v&Yl3>+X4U_ma`5viG83|x#LXDdK&?+*yUC= zfH{%@phAfQe}*YkvHos1R=@`58u>6jS ztgHwC8i&0ne_9D7?00zOFtrxo!zeE>16q#qd4W6PnpGU`RgrO7VA_1mwA;K<7m%O7 zwz(^L40IX<-wcr}eA$ifs}uj(C-AlvH!0v4aPFYsv;M9XFV&Yk%)im?E4p?|q45aV4+J4cdWO-<|dz1E*B!Ca8nl zPib3--rju%OhC9NtsrNeI5XlI!xTyK1hUf?naQ!oyP|00+?Jw*WzI;w0mUj1$T{Hd z{w6kLPm;!sEH#7WFnY1Fvi=l?<57>9*%I*OWSBu)E2~nZDhs%NT)}iJOU)BFrfeaP z;=c=BF=7{6xnaeuFsuBEG`(U}2em<|#Bdo$f(H5zagBKT@UPK@z}8}$7}6D+{W9Bd z`-(4ADj!XM-3y4>?yhS-=C*jRX1NqLR`L=(DDY4?5c77T%uw)UT%}&X*{8KS|KH0) z*)CTA>Xn|#&_dMB0j)&cO4Li=7SDwQq@w8e*6*j9>&KI(yIN(qg_RzB5!KqW!|0-T zJQ?d49l{IM_%Lwgs3uqM^LXIuK6_#D-a&s4XyJz#T|Cbw9daGVD7sfBm#!7knUnhp zVNx_1^!i|QAi0oCF!Y0|il0uDU-gCXshz8^F9KUfYkC%%k)L;^z`+^xZs=YJOV zTyDjszFvS6|KU{^4lM-@{DW?vJiub1;T3}Irno+=`R8*K-ZvK&w=*w zDBdqeBc0+@_b)~mrM`T{qzgao^==V4_+@&za(mM3nYMOy`sMJ`C$_JL=KxgLAf5QH zjF+bSTZcF;tW}A=5c$@JxP?t&9qYEZ2HH>EiLI-)xi~w59n8UbY^P6uWvy}S%II-p zQ-&P6qYVMrPyUk3sY;qQm1TW_S24GD18OE{!m-*n-mN-f@wZy7FNgKHATgTFI*8cO>XymZ&-o8w%e)?RQ?26TK?r^ zrZCH=7s2qb_7NHE2LQ-dN?H-qPn!WXb{m$f{Io})vk{3e#!WKwwbu~R4&oMIZ8> zPN}a0kkd$Qp`?%R$Ah@xR{w?e7EE~WP)yiSsg8>i(fgLWAuRNxR3H@6VHS!~^13&I zVU*NHHqc|Htv!_b@<%Uv_b>ft{cg>_^q+szY*5xGO5=gy|Ch1^1^v$-M$Ey$W$}q{ zcan}V(8Jw_7NuhXEP$P0pLaC?bUoR|&t!upaVr|$r3sr^nj!6{nP~{28TS}ilie(^ z6i9xMHv2(PJEEV4NAYSz*y;|xgE0l!0hl&K$a3Yd3hlMnVmuG-Y>>Lhzu?hTP;sJf49fF z7&x{J`ff~=T-)1K6BfTP9PRXSS-TIQNUx9iwft`w4V?v8bW(+fn?68s*NBvCn?wBM|mFBzNpMy z0D9j%m5URrFj)qk;3x_`CRFPt>#UwCARlMRZc;`cUp-tpvsh>Yba{hXD~_m)P)h(W z(u_uEoYWE|^p$32Y%afsAF~rVGu;Wn@p%bde^$rB{lq@^GK~?Km5i)Zx18I*9t8!o z2|fJv`g|R!-?f;M4Yy6#hLpPoIh#16GjIp!82pQ?-aO#ZC=a|<8uCZ zMDV^##jVkSqM z`bn0lRjS5SQ;79<_CLO0GBOE6WnQE9i}23>Ou{mK{|mi$lWL1Py8=K+IEfdl1`Mp0 zNB~9HMN==;DQj254yp%VRdJ*&1}kn~!jmTC2Hxd!HQF4|vi*2dJ-Xta&YAFVWAg!E_)9Ag(Z>heeJFvM|3lR!eUdVwajsO884cazVdM$FaGy}>qYKUS2k z1J68Q-=nZCt|u{j)6<4mcc1Xwim8iglAC;R z%%A*xf~t>5u$PJ_tJOC?VWIl9=t~1A1d*6%`hlb@YKF8{#~3NE)uW~m9dFrPQ9+>{ z2`8ZFPq*=JFX&5v#4YfB6z|MuHk>LuXR6k8fAP*n4k=1(_Y?5_F~CU;AQnZjhhCC; zgM%2-J6EEf*mE0A_0zRaUs4?ziDaY~2wGW}OZA55e`wu9kLUh@`i>r11$(hFlmgV(b zXXq7irYHed!xSWm?udId-=8;_?F5T*s>N-jsnG!474KODbfmIzl44@<^9l-l#-)CH% zr#gAeOrF#a2=Bc47Gh3nB?r6BKA5#{LK{E30!RX*KrT(<1OD!iTG?(ey(|3_mL1< zd}y^T>?z46>)GqgE(EHamSfc%jP2ftA}*;hA$+S@B;;R zx!LDJ2upT{qD3o>Q!A?Mt~-ABES81B=z`Zh5@3abcF3Lxdc6O3KHc4!cL-b%QxgKc zgUXnlhr?|>mIQgR1t2j#&#V%*0$ZVhSkcHRTBanc!mV{`$08X$kSNEbS<}SKs)1V; z;OJUWwjk?Q*K>)it5zLT#0B@Ix-k?cW(ad9nkN`oRI4S*^)lL2E+^6q)K-=X$Tlz{ z3U(&T#vJ;+s?=XN%SRFbRm%R><&eSjXd4fT{s|SBny@;=VH8P3gqtg>Ze2w%T<9jYG`_H|xq!LxU*pW@WGkUS-LDT#UTY2!GVm-;c}iue&_kT_0$Gxxm6chDA603 z^;(4Etx&OxK{jQ&Cn8LD#sX9`6KmWUXBsc(oQbGsI)};@Kf;a)jk-IH~y!Dfr=j`{FmG49o|3Zfcw9xQU4)>y6tiy z9D18)YVpbgpA-YX8p{F(&{x0_^**$X1Ny~4eOYy2-;4pt&;I&{_dRT7SV68JG&0|o zPMyR5A5K_&l^RYaC#AjVa3@0pR$lWj%wH^(!c;f+T44N9i7ujVpBXwOJb)yU3uzoS zxbtu<50-f~meDDDYDD^l;d^Ta~%KVX2I0SQ}n-m+@Gh-HZfsL7eovDj7rC? za3nH|q$9z7-EAWb-#uP3DP(Bk21RpbuhzOx&XklL)Xnn&M+PATcxBjEB}I=0hC=bA ztueL?V(#D-QQGkY#P6D_^JSHA1G);Sr}>*+?+c!9lc?0nAdRJ}Eh&)_UmU4LhmLy% zS@qm)UKfHRK~9<6eX*QIxz$viv$6=Kc5(TM94b1sOq!QAgIU&3@pA6)gQJZ2RH}(4F4%;Xtw`Z zkGh)>nafnT3KjK%cLvT?Df@v>cO*$jlC(jv7orC8h@33$TXjdFX}!)9vlkWohRmH2 zBP|17Cbp_$H;HaqIU?Eud}Cuq`PvQze7ncJdhG1rwQQw+Pgv}g4Wa~@oN{?* zsQRXw<)B!5`QuN|%b3HHBCHQPU1r<%^JQfAo<~};DD(;6OA1P44{Xw=;%+WV{JufT zn`Lu}{?KGcH4z`u7~`cF+umI?HGY~Me9X&||{ zT#=~PdQ%O1%FfkC;u4}V@l^KpH~e}jUEe91vjq7Q6iCYiY(_spV7O;0LZ(2yu{!jg;chY*Z>+phNU z_fCWO6?BL`m6Q(^m5exdRa5hPn>>D2kz6J+kRX>bvI**%U)*eyk#*M+D0t$lz`_hW z{q5#Gu;J}^yj-`D-$37!2IGlVu3oI>OR}MbM#!6mv+Ja>8SBo*ehd#I!1BH!O@hJ7 z{UFv&iOD zSh|gQdAU;OGLwcF2&tt#q8{;M&}r81nZOv*Qk0X{H@H#6I8gj`fURTj?#6xO(T%e0 zMD(hdLBh?zkC5S~#Xb0gmywoeoT54PpS}#^Q@DH=^VYOW6FqnjW~W$3XRz~}>z@dz zF?ei>AYUPm)q~ImGNX&!jbE94;ETbhOw3)R50)R}IriD7DfE*2*aXW{A?Rcc!FT|T zk&>|2G0DGgnH|a*ygG ziX^D1E3HDlhpw)EB0dmAz1@Cv2r195XnD1_S?rxy9ZZ0L??o(=6+hcK?#;wm$e z=W^~f&80*|jFA-lT>M|nXL+pwwr)7l_TcfCE+*M>uNcn62V&lRWvN22q#5Ur=-M;- zRw=c%hSoMvluiryy0dN?ttkmp`s2et?@tYB9RV$wtVaA80G4Vk_BddUj z>|@AtqVKixZ`Y~%2p=vJrau{oHOyrH6GuVT zX>@1mC!T!BeX^xdFRnGV0;v5LGkGt}& zW)qCk^eXCuMI_fA%X}Cc8D5T!a;+2_u<40Y;;@e!=dncAmA(;H-K2{VPJ=BCDr?rn znPi?-PxNy0_GQmH{T2O$c>bP4CHx_V8h>Atj*t+h{1++u;{x`Om=Q#oYMbYaUraLU zs7gsGm}IcinyX3?dOo@L++7ao1@5*~QjAh$r&k0K@)|1l=jg}|0!aFy;f}Ypcb#5OJ3QQ_U0#c^qn{DX0c{xDeAD8{Vd{XsG{o3^8H|UPtiPR_%+Zb3dK) zga79<5T#ouiL-ifJ!400Nn$)HUEMeZxuUwSwJ%7`u({#C3e32;yZ>!gjn*uynin>v zXAjB@q2_|M{#wfX3anH)mbEie2EeQufbw}ek>W8iDPSr6fVmS)C;-GvQGKa^jvU@+ zKvxT|pKpOy5{q=NURTO7pBgOjDHdbx$I4CCEm!nF}L!hugB z)e@$DcXt}*Oe^Bqs0OUd5VL>;cqI9Jn%a>p_6aM|_R?``-ibnGz+FZ(0mjdtg9lO= z0DS)q+J&<&Ag}I68-h_K*wBUgGXmIc?m>jznjT{#M{O{IJ+g-@<*ZqA>mJvZl~(m| z0_9GoaM$65_Sw?@+oBTlFY*RrfS9lh1^f<}18rH@dE(y%KeHsig#*MkkI_L`AaD1! z!;1LoA@>PE?u#PbpZz&idHo)*eOb643E3fn_?iZRfNfn7h>~Ljh}c$d0T|tT##wqu%{=EAz#-aJEbn1PL7CXwj&8!&# z4R)Iszu&b{>%2VIFmrscKq?Wz(my6IBVwRyq<%tKx<$~rpB$;>byh&NI6yDP;BLot z>%PS3h-8N1&;G~VUw0d_TQeq^7Ke+U4$OI7`cE!YR%eQ%C9JQ!Oumy2I{##t!0#OH zSb~}0Jac@?=7ucwh;i;NE$&A2cG6aQPiS=R571)`Qj6^1oy5ckq~EVWmJ&W$%gxUt zt^JlpSQz5}{_~&h5Cv{Uv^grI(fRTIUjn~bjb9(V9R;U1H@nUfonCbYPG8g$RGfDN zwjeUaHOnAFl54^w4uST5*&yn4WeGP|R5xpWCuQ}Pb)wxXc3`W^!npG%Zmzx*#O)Vv zscSi`eFl3x?o%G%KSX}9W}(*B0qND&mFc@HbE@!aq;o65WLotNV*mTu0vEiVUaa~! z&G%t|jnnJ^|D?n1kLYxdfE)Vqbu*F-EQ!67GYN2IG0=zGtF5?@X}%iy(p+o~H)8j8 znG2pvjS0sqP(R9}Pf51Kx_uu-ZeqsPXJ`JP^*eT+ycK1R<+y?>EM87D0zgfSr3^KH z-YqqnNzL^E0AI@j@JIlF1qsi5u^XK94b!H;1HHgC4N{R?YK#}{XJsFc-fPQ$w$AVR zutI?;|8Po0jVbURr?Wj}tP3N#y}#q9rsyOQ;fOZ!@Q?kkkC$oW`$}TYoc@z`Yf3*@ zXZs6fxzkB&JbH3C6>ss;NasIzFpy+Go9uASc(!YL(OBX4vTu_2#+3H!giZELEu-_>DhS7h~s zZn&~-YkiI2%a$*=%ka^ih+`e<4~hO5<=T>9ugNoyads@D6H7H|G7Bms;sYYnhPN%Deisb3gOS5NH?U;3?NXrlB9aylcH;rLqhoT9={t zj<|Yj>O(u03h-FvuD|DCy9yQVF+91WvH_( zX`JGLDx3@uj-?WA1w(EB%ieP0R2rX=o z1}B^62bsmmQ4L-hpGsVOkh|?L@_SI}6X^DO#45QgZS`W_RnaTcHLD0Bw6uF_Dzm@F zN)9N@HWkpL%oLHv=c|-1Z9bMY`g69!R)~#tAYkqHY}G&8_dL`d;I;`dTQ$6fU8XOl zk4czNP?FuN1ndd46Xo-d*U|AZ8+xvZbFac2q|*Sj$B(2vF~8Lc-*-IF8eA1iS10-< zQ@g!*_}qR3C7B?U02>karJol+?EZ2p?l(D4GWU9|AIQCHzIneM7%<+~d7t!@pg7d& zF3*flp6{F{aG9u>tz5Dqs^?zq7~oo4&nt$#9N@K{Snq*n{qUg*A4*Eaw&+3JvklNF zUa~N{F%an_H|NlZ3)XCmCwcpMM+W+u>?*_{cKW5olcD<&ldQ|V_~QnfGLKm}HM&D` zrL5*cj@fA(ADO}+)S-q@2!|G7)3CCBQ8CCcoyvl;YnIV2&`5udcp#UXr#v-usb5Zv zC{QLO1Y9>!8@daP69aP6rT}r&APC5S_GIpDPA(kQg~aO82&9^QABbPyWt}QaEmKFh zrpDL&UEwE7ELPzR(7K{sCU1E;9zY(ki6QgVGCN%g5_4^0Ifj*&AzioLh}}CQEKXbi zsmQWhtxpTw6cqma^Q5cV9bpKD_}hSTEpa)>tkuK~T*PUx^n)ot6Br+*F{h|wCnz3ZAqf_a94^J)EE zlln<5oQlUU7o>5Hqocn21%nuFRhS%7+#0DjY-8a1|DlhH)YdWWDa z|2mdGxb&(&%+8wKgHg{+uZk#_Gwi)!S+jqb$n2_2%}#v`llANb(@kgk!#lh+7wG;nt=og+{&PKFpzvzYi3B zS{qp^s5DTbu7`}3lugr%BxI|`)JX=XQLDcgrL22l1wFIFc;US=d&mzJ7Gxwd5cjp0vY9iVKrvKayx{j@soLL+dHS|KGcItUwzb-&) zhG8j|6`yJjfc^)SPw4wVd(@qn@P~hRJD{%8OJ0%$o}O~<2JD7@6Arle(sFx4;{RJV z@K`T!dJusDtFNTa-vXl8+uK>TSjw|H(pbZC& zih-9E#alqSP_;-jV6wjd=4A!XL&i>n*6mjNKi23!e?O~0md(k}t-13k%8K`0E4}LH zC@qoBg4{dRV)M-rLS8Q}f75i1ce2`Kj5SF^IuH%{C@V#(-+~4m#c#kJL0p_<0JQ*n z3@9`Q&Q9m)E%iThBbx)h4a_0~*1B3Q1DgYm>zV<=h zB&IQCYXZNK=gg ztGV0n&v3vp2}uA1n}1U*|GYW+ABr|GV0-)af4u3ofS3XLECU&Mt_X}FKUQq!JkB}P zoc?8*-`<|=2+5akHt(Jp=SaN`$|EdPe*qMg3m`3>O&(KTJc`mK zRwd7pqkQVtyJ>AMG<6!PExNXG*@}Mp!*xjHbkNRf@O;~Nn|b?ynNvyAbMAHM^Wudo z;q1>BI!n`;hKPl1zn9l-!V|puhsWtacB#TjtU#<4QkHR1lFsCuqv8IekV=8FHVbUD z6n9m5sS&$`@%<%hAhop!lc z9@}V(g9YBnq_XwxGEIBSh9U^2nH>sGFiH6)AcA$*{?Rr~?*)&l71|rPERjr z+hi2q$s-A_+Dx3tb55Aw+w;neyRHo^h51%MNMwm5o<+uXV{* zg2wz&g>%vp(v~i%l=a}g&Rw&hSl7MJ&n#viNRqPBvnWG26__ENExXq7N!w1&`ji3Z zn%WO~K-?N6mj21Ms#dengcUcb(-{U|glQ$&1UD8CIhNq`?5OA+I&oW13SSPS2Wt;F(b4)TdhiuzEL9+jd%xO& z?B>4TnUN;m`qvlP79}l**%LPxE!Q==9=8NqK!sw58XaF8<=C^|Zj5oQU#AllC!>U|eZ@wKe-@ev8h0>UTE%#h1is;YOeb|DD5v=7eYJjyUHz zNQAk?oqUbx#m?0-GbF?_yCgn|e5^=R^4y;-VZ}(H!XBYr;%b&rdIbAIls}r;s~BR{ z{L%=Y1Rd==39u4@9q31q6BH#qWaD>@EJ!Q`eYODOv&qXL@G-PgTDNfbohMR*`2%`M zObm^dBg-f52!WN`VA+LDc>I&@R7Um?7K=Y6Q;%A5Tb+Vhp!=IZ@)`kRD>>#!~5{0E4r zH=L_Kf&F>Ghl$qzjFkyBv5oJ)ba05Xrs{6b3r`=+R~`Ob?Ge`yt1sh$D*0WE-=0Y> z++@#A(>wI+%*9{dSa^I}rro^PRJFqje%SJQ(v-`{<8)x8-{ZH{ilRy&Om})eKXPnM zr+Db&NOs_g@=cr$r@|E*2E0o;9k^k8P;k#Pfy86u|C;>FO1(8p97n(IG+lc2!mI<| zIBm=|KlmXyn{JL9nk12+m#V+@X|VOg{BrmU$n$)NU{Lbul*nVDf-a~yRYzWUCo{Z2 zRP5h|1a4`|Rq^f_z*d_%F6Y%=6vQL;hp3JMhDs({Ph^t)#vI{~pRPOl^4eRpLG(l( zBbg(#S4OHtu_yTd?HmA(RBJUrqog(@wnzKRzhui($g0kHIwbf3HNaK* zQnlDA@I&}EJJoH`$lSc+lK@KI;|5sEkoCRuOI=nS%WS`m$$(2&7e$(>f^i4LGhm)W zLOaAsYLK?~@T$(6z>X0?tq1WYBVCpt*U*xqK*zXJG~mZbD482d&1yP-u^+Q@aiZpY z+i|dPrFYvLs%okGqx#^S?K4aMj)c;8#BE(t8Gj4T{e_PazV*67BRfZu&{PEb#gQ&* zoZnk~Y@E(fR-ULAIm6|;2n^tlH+97El&E)5ED`nFD#8K_^_yP~A>-=j-1!kF6ww?> zhXqKDwlyfa5)*KdEMyFx0B5wt4t$La#V4edAghOd#^Dm7ptG%?y+ciW(Y(eMz9HFy z4@lBuxQ=hCE8Aiic>HqqdgBJ^A2>(|a$Y^)R`B=^a_TQMJfrLj)bDu=PnJF$OSu_)nUKs%g;URY|2d^d z#aK!pILiNnhwAnGWBMEiyP)64FgEfLl0W;z@@gnFaC7He_(#@2+`+WN;AC}ujHRC1 z24Xr%twGh|Fd%W@(oX1>O@D!yCl8kEweP>}?AP%yk=s6Ds5gn!JlmSt{*|4id>EuF$H;I*Nej{BG zoN4yG^L^*CTHk6}V_Dy$uzB+B#;(wBL(_CE50u;=jE|Bjz-lao_HuQp_W=?kv|d^94tm)8)8wbyD+pr>!P?Y z^!g*qg<#VoCk~#J@I5MM{m2g{&@z2K6Pj{GU%KBGRRaq>Du0mR#-jWwfx-MM5D0t?-aIJk_w-$(Sy}{_w z)v$EU_p5k`7&&yamDc1rzY~}T4l~K8d`B}nenb|LixvFA3b~Dt&E%nJNxW_wrG(M> z952bv)DKhP5q(W(@G<0H{?gZyRD4>+gU&%O{e`;Axm&vUQhExgJ*abDaPq|X7EO1# z&P&sZT3MWOn)3z$%v6-#W)og$Hbpi38e)pta7 z^VVa?l$}92S~;hrUsq#eWal^w%)tlVWP{fGAg4U zgc8mI_3V4cIQO3KeB+G4uf)^JCO8!IT+o5x0r;18Ktl;wLw1`K6K)_UcPw&0o5_ zrX=}#?!?TepFzrJ32nDc@=DbYli&tB3*7@pL=^oK8^*svpOvJuoxgc;wzKKSif7So zxP{u>%9nJ{>UJmmW!0$=TnrZU7xE1YT?%B|^-^J0J-r`aDsfit zu>4x!ph;nZrze6dGDk~ZjWxIBU5Y^rJ8LddIQ^B%97`ilxla2K%Vz{j*I)aW0}iS{ zDI!PXS%=@%?hC79D--WAVQ%lVvexIjVw0a@sXHe+S5Dp=;Z}~aUdHpEU>x{5bhQcM zvU%XZ`OCPqYCF=Cy^Uj-)mbNbIH}++;`rtUTtB7Vx6JIqxtIzz+8vy)$HbMwtLg|e z`7kXXGjT@jdT+Ll*8~35K@JImZ0l3yhx0UApq~`eBJ9q?C5Got29kXH`qNhyCH(e> zgKvG<_Sd~|%R)eZ1i>m7+a5ASOD4EJ5*X$@Blw|Q<1!T@?BvF?s94G;(zPHLN<17X z=SBtc_6*JQ&cLvOaqq5%F_HD-E@peV`}58s%wsxGC2KFx3k0$kEx8;f1vuq4Uwh+= z_kln$7v7B-{M27w1_(dIQ<=5bBJl5t0apmfZh`KZ$RkAiWz>yHSeZeh{V{Fc8KHT- zwDK|_?~KQxzkGQN5(JVpV8pw4^&^H$ps+6z_{>2FzXd(<%OK{UkJn|W+X=gEuCiq~ znmOBdSSkjQyvcWTp?TC*nmOL#Yzc~CJrA(M$m7y2#lsE_Y(w)Lz)>|EbXPUkA4$z? zXTX2(na`1rXy8tw>@CXE>=v}14@h%?)8keNU?)?xq-E!;6+;&G zf@s=y;DdUh*p>Ti;8NFuJFLb!nqT;piFkvBDB22BifAE8+#=buq20#K>rSQ+X_RYO z=#r@QrM~hjlRPgyvReq9uKC%;SQ%Ff*C6;RbnH5k*6Uf?0NmO5DQu~^#;A`9 z-BLza2(Ro*)G9q}DO(!BGrfn=BDQRZid*J54dHLk5egL!63V6iyO;8=IyC8aljync zpG^X!D#);$X_{LkoUgrJGh!_k&s$M0CIB|p5zdjxx9GFP3cOzFms5K)?yAO(HfNke zYPz|Z*8LR25(PZWwq&E`F!C=B((*S>IjO7AZ1^#uBP{<}td+N&U?@b~u{*U+XGtGX zx!vz@yz~LxUN{hJUb&}KLUR}9U@4sp<1N7(?r^^{`o&@yZ{fO&hgfQ3s%C8l;&X^1 zz0J@=|Fs+aJ?8k?sy$EK+8hSuC7lUDc<%wxpRb>sSmfGkHT6hOWm8I&C(4|pBHf`l zw6JPNpAbBd;(|??>B+llHhXK5ukK3bGiy&l+Odjlf}KFhz8hEtn>j9_1d}X+Pp)&> z)|_+n!%t!Nq)$Jy+cpXJzngh}Zx82>1A`5&}gZ3CyeE4U=-odu<(ua;}0NwLLd=6U*dgy zaF@@9Rhm}`zt(z?5pwJ6pF;>sWhcT90S?>lZfv)kwr>YF^N`MnGWi zHCzl`S<4rfE9(L!EvGl+;Po@`$FumO-=m!)GL6Wg!RvXDwve;~@$&IY*RTB6E~cPs z?fF43%;wPC&p=c8zQ3jXe`#s6?-h^?HQAjDb@aJ*4TOBk%5~4=|8EYs7%p;`F#BRv zYVRxmu7UU$hYsHM9keur=UO;D)Q+R3`}STsdo5{{bI_5MX@AVo6@hR-*>Yon!{&(! z8rvM%ZT42Cqb1TQ9annTqzigyrECXxI)rEtwKE@;ce?UW_{j6P@jNHtU}YvJKWS0S zU)98p6ciRI)g$X@chRNe+v%%020YK3q5h;zg>b`kB8;@iCxD+=U7gVFuz6SM9|BORFBA=eRLZYA`e~TCq7+XE^%)pbg8bQ7dJ55{hoGKr{5Qn!nl7{vRoexITK zzBX#NpiTQE0;d^O8N@$g_6Y@!GX1ExpOSCAK4@7@87F)8bu;JCJR)(rukWONH7N#U zdhQ);dI-CfpD--XC+N(^?rGcTa#D4>LgXn6#29Q2$HnWdta#=3`$ofF1aQuiQ$X2| zN_Le!9_zW_2Y=<-wW%duVk;J88p)p-Xc7K6 zXmgxEoYXEDwo`dbVC#dY-WdNgF1<8u*#YE;PT%jVyHE+-zD25*@4 zkE9T$;JrC#dt`V`jW~@j;s;23wF+y+pWvhY-ch?PMfuCQi%Bc$e|mJ`Sz96 zsUc2NIawh(oIY1D{5#ejClGcJm3ZRYr=Z{C0oKabdMT|BOMj$OV4Z?a92~aEm7ldC z$A_$$ezw_8^j_7#TI8%fzV}Di9oJ;DhV%fE1mQrbwFzSg29lp9Df+0`>CO$Ax1OxE z(Ml%u)Pn6k*>$d`SLG**R7??-`-a1Nm?!zsu?%vu1W~E@Y_C?wr8MkH`2HS$kEk0X5%9E#C?a5Z=-Y~I-aCr|{5F`dWtBIY1480`J7&nwny<_&jr6Yl$8 z8u-C$Pt$BIwBGjRr?Hz{$hyMo#u1)+q5Y-H>8jXz<9ir>_lSl@6QO~xn9=Gn^}&(S zb;CAy>CO3Unv0keFmBR&zRXY1@xjkc6@pnusu&Y`h=ro#+iTvLtVI#{l}ZIt-c#O} z)NjZcdco{mf2A;~BU%^7-v=R{tW(k*A1;sb+3%9<&mL4Qw=8#Xs4e;uT-bbnZDAXa zOTAharMq0dS=hym(IxVcY?b)BrcgVN&OnLy2*I~HwpmN&8=fD1`0()2#`69)tIF)F zWAI~c9J1E&l>2Tk{Xm+5Wp=jRFei$eG`sD3dt zEIQGiDzG)R9NX0x_gy`idyo5So{gX;!{4}XU89Hjx%mw#LKkOHXl!u*Gxz4tcxWHX zyp|j&Tj)2xVt2AeP1va>mpS%B>X-Y(w8Sh3WRa@<(@Ev$(8kywJS)@7vqrk>Bl|UG zKP%?u)BWugv#q7}yfgi&i^obIX+c7A{q2^+$wMd)z)k2F0%YfRz| z{QX}=hW}%Ql~u1fTFEW!JKx^yWVY$j<0hjnLrQk*r_qrou^Uy>?s;e$o`<*`nSoj@ zJ1}JiXZT;c<~$(tF3e>*dZPSj6W8D1h1*INX;?fHs#&BI`Eha-$8Gi(Omy-*#FbSK z(=fb@DKtJ)VuCXWag&AN+&d~x&E>&Iy?2hA!=rE~vM3IBIl}^+hCTCJm%)!!+GuQg}A#9SdEoz;f^`YUe$h0VCSecwHdz(!JJLK6vahJ**#Q0jR9s}-fHnlkc| zO@T{Rj34FM6cP@b3cXf0PkpQmVM2!xk*(dZTE)pDHa6h=fh}O8xNIH7&j%6xt9+Ixvto_cddLv8EM3?ZE_}qenOsQ#w(vgy|HAzE{L8`K8d94Y=}26h6=s{WUd&29XGk zt+%A^-Uz>4wU;u&Yi%7}55L$N!54y;99_F99t^pA^^mG*4ayD_acB}AC6e^DRrJjs zC*jN$JiE*BE?EVepS~&aN#_kYD<0qUcah8)g8!^77DixU-9?^sZI<2OG^TO?A)@|2 znHrEz!M^o{Lyj2VqP1G^D-@mhrLpuZhslC6RMeK`+w=-CM*ZKua;CS2a6BbPx9m5i z{2!SZ3Kby5BL$s!6K7O%S*7)VMfd*Q=uY`D!%HCVYfV=*O3%YM=C4J4w;XPj^1N>f zTT<({TqeV_V!@FQ5xHb)r&7xPr2eKmm)OIi&7s?ydGuP+^C6#@_3QMbmuamSH64HI z3R7lOA(iy0bPm)*Ou#aif6VLbsBA+%q-K1vRPJdC8OAFMlJ-l*c&%zIfq(lS(;T_CFV$;h8eS9=oG_kAgXPKZC+%wlju zk`f^k=_*<+DEfI*#&whqNFrYp%RTo4%9q^3H`koiJxfYX+>h)%>*{Lnj5?8g!LSXC zZ!1qBe}D0KSY+(qnD?jfqU4ovvC_O8E!vz}S0O#Kmt;eIy>3R=OW%BLuN-{MNKY#h z>>5@{Scufq6>24d+`8Ft{{$?>O{~M%OvJQ=b|o2Q=&lgr;^wFRL{>-0&7G7*a#(7% zmGoDSHWgTqdDO2|#sEr|2)2aQ!fHO$eW^Rm@j5+Co}z2Fde8KO$Yy5TxM%&)j6#3N zSi_6QYuePH#wtnOvng@(t}4MU{)0c24?%|N;j!*{!@k1n@bW-BxWJNdLyJ;6fy3u; za(@DAzv`iUcg}}P+J3-}_Nc@FAIr9cAodM!54ZcBUhE}FHTQYF?{W$zx=C|QXW}Fn z4_}IPYGrQDHqc$g#uPLgy6xEGNx(9H;AI|F^8e$O|E2WqU#j-}fqX6?p;$)vB>(|x zlK%xj>16>Gq~Oi`XS?TcV{tkN^ytMQ5yh{kdazqbfP& zeg{Y-u}IHn7f91vH{p|4PCboV`{uzBJw|p7N!=a~YE4z5y9>0(# zUCWeDbAfl%-=!Poac>=|NLX#-s~4KkGz+=T=-{{BH}$H&!R(0ij%d1r%PWmq9y5#h z5`nnErOIahNUP5m7{~&!FT--o*r_Ho>Q9mNS2-_)+#_5gF0|(=fNG~@Wo4_IjDZi)21M4{8X9dHF5xl!fYjL9UIWws%X=xvHuH0T( zeNp%R{=<8wFou<|G(C0A=A2Zmmyp!^n!RntMx#33I1=C4=rDa}{&BF3VNEg3$(V7V zFaA@Bg98c|?6DL6o_a6Ky?HB%6^o4B_seqQA(=quK|Ve{6Cj6oT`wP6Q-6>bz2D!t z0qF1F=N5;HA)n@=3hXVBPLJ3jY&@=X!--#0wpF_fHOz8ViFPDC$g^)K8E{8}?E|XJ zECiCPGg)ig!k@&71!(eL>6SCQTu+iiFa3CtlU{uG5L$IX9^?$~bQT0b;PU@Z3>YhAQrZ0Y1`TBYN zy4oit1E6qA3DGGNh<*rQG8;gnOMb_-nDIvYW?Mj0^-MC>#s-m zAhpoY4(xTXxfbC6l4kfm0?lTBr*lEZX&{R-bGhz8%v5a{xoDEzb}*Jhg7bk^f6-Rn zY(R5adtp&B!VtWpmGR_NCr@A_-si1##`dR5t2E`SU;30ewX{+AVkQ0St@zXBmt-Pb zL_$^0zG&=J4D-RsCrI~dbx+wD{Sb!dP2s`{_t%CExFUVQZlXZpF!n9p zYEqq0d?{l*?4Z_5U;*;zpirmIs=7x_rHdH6T;LDjE05uWCD*7~WAS!!J^4RnBuUnh9! zgbwuR$6$!&?x>%e6?^?P4IVi5;784j*Y?cBhe2;Y9{sI#q6*9L8joYgTC!J_mf8%e zclvc)hv@+8^$e&LKmQ+q8U}gWt9ZPLLnppa6u;V8_z<;gwch1V_pe^B$Ngodb{xPh z@ekYqt_o+3o@>Ah=J(V2TP7OqzpSn%?(rrqP|ZVtCHLnDC_}taOw!7y`Pe&cLSF75 z7d)Z7I?30{%P17b-v7*VCyy6c+WC!oH*sF@cfX5lfJHmLuxJrlf?hZP-SuRR->EvT z^_rhN4QGs9kseN9IoiyBK{;A2<>H~#Mm~?P&hSJnpGIC6+9K&)y`FBiYb%z|ktX@k zQpx5^NA0-G`V!NaV>3=76E9rNs%Av+;Elbc?M1BYB?os_w!* zXU_A-B4d4{=x9%~Jr?KMqJt9t#^|ZVxK)#$Yp2Q*hVo`%}SXy6d ziadumeq-nt@CFS~8wD(7(l1nE;jPHg*!pmSNcY0Yqj<0+4+6%qt`7noN&Y81QRa04 zPq^A`onWE5hiMT7jfVsv(U5sJ4*PXHkP+Y@0Z0ueiuGbZD%xKI$FToD zc^AK&Fm)FK;GLwgydWJ(>{?S<+wb^SM zH74yE-E$^~cV)_3S@m1yY7}U&en#jR#`SBP@AxYr^=~kOFHsM4EO;_)Jk?ra3Pc+0 zB^blMS>@(_6W~fUi02H1#V1fuFjAbqWDGP>8sMWUnwc0{!LQlHr}8B#nA7EJTJh(t zK0gDpd4!>Ac*5(wA1%d>?A)@2vo+O?Z=h8!EKJA?(#jnE19+q-OV79=+FH;2W1#5G zk3xacQB~e*4m}-{^s0*-lObF#@>cPIsH$Wj#s`K((hLGT!zQ)y>TQm2Ovla0^qNzi zl%ltCr&-C}wnx!;>2(NFjN~)mR?s7SR`~pZAK{i10VkQ~;F-$2I1IXl&GtvklY0&H zAa4%F?DOJ(gr48af2YaqV)l?!|Bb}|342^qaE$J_?9ua?OVP6qgYGTLnPA_jT%}i= z7q;bq>_2(eZTZthT|fTkPTouizK+m$tk1_S>=h3z$w&P2!FjWROqV ztD^9wx=RFgY*8|HRam#`2J9VjU^@I=Eo*K^5hV!~_lIz({lt=%ZTE@N=dgN{e2Z6(+8M=J;E8 z&&LLyi_D7(j=67G$&!;t8!9@Z65yLG7;w1sdak)^Vo$}x&^HI3keBs5vBupl&#fd( zj*^6^UG6K#HQ&IIiu1V;Ey3SRg8B(&{@pHjW|RWKFl7Je`o5ZR`z!Mk&zHL^(`O+8 z;n2|F500;v7b)%lPk3MAe)fw%qyiX%^9%n)6bW1gJyQL>{!u#Nm?u4gPq?{%Kfu*4 zx9PFz_Dj`z8+F3T8;Soqf5d?q3_atSQuI1fy#{;JlO*JE1i*Jd*J!{60{<3;11v)9 zd^C#|0QPQl#XezEOcHcl`vJ60mAROBC8IDXgE|Va*8wh+sp6{4KRGk~XUu70Fj;Ov zBkpJoh(;GGFxZ_%UDxGIN*!mh7EE8dH0fPIpvyOK_VfN4z<34-9Ka#sqcskzb8~Y* z@W#f<%40cJrQiBK8&L8FC~4txao%BbtIAyu^YOJPr-q%xP1m8?g6f4hphe~W_@?K9 zTiI$s?M6N55s2b}hF+z$;Yk3~TYw`go~P2j@Aq!L-8ehd}v>fP@yASMIc_^YPWpa(40rF{o)b-|cnU*OL8WwhVd8ah}?FpuiTT zVaNrLAOxCg*eO6pL*2ZS=9SjfvL6UzMOk(?K~lwXh{A>=v~O-8CFDq#=qYw3Gg^lq zkgY_XYPN!G2fydZpq(Ey%w>>X4Ug6Eu)*-7V#$sqlt<~S zu5pf!&;_<=&zf?w2cRyrWFW;br`8=-X%|+dYwBT)SEafym+6r6?e~y1aa_dA@dJB^4wJ I#P#0&2kfjxB>(^b literal 0 HcmV?d00001 diff --git a/smack/image/17.png b/smack/image/17.png new file mode 100644 index 0000000000000000000000000000000000000000..bff0ef5936ad5f2bdb14c0a5bca99eb30b343a44 GIT binary patch literal 41084 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 literal 0 HcmV?d00001 diff --git a/smack/image/2.png b/smack/image/2.png new file mode 100644 index 0000000000000000000000000000000000000000..f16ddfd9bca213cf5fa99d5636bf60ca4ded1825 GIT binary patch literal 6841 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 z�r(&Zbp__${GE$*B={i+4s=+F^pe9On)PV8Qodl}bwh2wpgN?!%2cCl=u+;5wQO! z)RI>#+X$>1XAYR?H{@d&IT~f|mEDWE10-M|m3o!T*xx)H`@Rv1BDKful6?#ykl~uA zV?npXcu8uSxN5Q(G{ThekI#Sf=|s*=6N!xuhGFyA{aHTcwLEjnYT7YpC7rN|+FoI9 zVmBLbI(ypdxAC$pA+NssJETP!B?|Lw$abMP5b-@FS9mC~ z{%-flUJ)O05#O>5#`%kK-hc-;Azz!%?y@0ZRWbqhaDp>B+E+mfd2UQ{Mf(eh81QWi zt&3-h8qHkTz6jFIN4Q<@Mh`g;4_ogx6=jL8D|GWOqM zjuk9levCC;Rxmawk9`^p$_WNB1#foZY+4mbINFD}@2_hLzBi10N$CoSj}hk8^OkvV z&lI40u>~vlEiq-gFq+9fq|L#x3g3g@J0XG zGk}$|dRnq`4WBe7mIF4TO2Cn*F}`GN>qLUZA*nyTg5|x- zDr{k@oo$7-a%A6f+7-e8;>ojqmE7Sm{=?mfopsHaJ9Aoe8hD)o_8cVh-!KZFQa;qd zntsJTAG7ezq5sY-&gu78pQ=7E;@YYy+{7@G?JyHMO(pl7Dz@JIiBlFRyjo4{$PG;2 zc?=Y%LjK*YBi6VdqMC_T*mjC`Emufl{1Wh|^wL&f$^Mzx{p%f&Qia#rLQOEU%`upj(iem(P=jsNJcM6jNU*zOJ#(M+J3&VPiH9b7mMN*7r*F(qY;P`-rW;f(B^a&bKfk`OmeGu7HQ%u!7hLq84G^AM zZB7`jOL^SiK2iAEta?biyU%bj1w>1#Vo0Djh;;kB)?-spOt zmq#jpQ_0;P?cF(%?6Wd>5Z-o>;+FhC=yp(R>aRb;N;KM>Y=4_?8Ht36O{Os2i2pZ| z9cFipM+@#3@qr1BU}8W1>-B)$BYQrO>x6j~)61vHVt-oRbk^4oS#f^8jb{2U{M~!; zD-?L9G%Gaexh$!k_-BT{C<3tT$a%Qk{Cv#snxRa{9uw7OmOp`QHERo4J{>~#+X7etC4hsG7pPuO}E zKg$ex{%4B3hRsR4ikmzxQb#7h{Cqj{P_&!sj1pjuEkEOKx;GdSb9VP{^8tvR<2U35 zAW+K1tN#;d0MPN%|Ml>1-vMy>&v&#pQ9ZzQZgTni&tp6AP3eFC0xydj90dMTOA-8k z)&igojDOyKK1;h=k^5cfzwguwYVFu}gXUaqFkw(hLN((-~fWUF4MvWmOsumY;B7|r&Aqi}~M1MTH z;}sZQy3=%ZY3+58be(8Kh=}lxCgwLJaQfnGx0N8>)Ps|B93S{9Dap5a8I`SSaZh7O zkLC*KE6@FI=7)0hM&!G>B*hv9-lsov2t_2)r8XtfxJa;@$8mm>6xc`zsyppyGXh5p z1;R6gaIVXLPTql+Zit6UNB*W$DxmuU;6UuUK<3DznvasFM_#CbT zywJQgdFT!tJ=yD|^S(S;16#r3laom<2e#vgdY!JgE|2EiuP){hTs50qGF>n%wA=UC zQ0guZi@h(nuJ*aoJodXQEheny>ao0$Cm!gJPE~PxkKnE7$jeS|>0deANV?>ti5u!f zXJh?AnwO5xM1J+9;@V`~mD5Ft=oNMS!NiqvIeQ`rz*gZ*N^2f{5828YfpgS-ig@Is zdSG~7Cl&adeuZyx?9P|~Z;rH5C8^F=|1z!TM z&K-Yh5Qx}$fTZB^<)*g|BT`Z3w*A%6pxnYwpDWLb^PNXUPYupPL>HLLublMHbpx$0 zH$Q^0?5i)SzhET_yS>AHCkBIYJi^EMYLs4Z>j}EV`(t6lX32w))pY}_yOkYs4-Ls< z-n}EUra+SlyCw5cK{JBhVrcJlv)CKRAV5h;NtD!d+|G3g&?vsv)oDSpu_q4!%Fe-@ z`;O_y#rnkV9og^ueL&F30)pL3)M zHnvKLf*izpHbSEINCGV_j<~C{olOymt)F}KSRT_8KG37#HGb?<(B59R(})9B=WJnb zTOyx=IYPX4hb#rccii_e>F-W{rabV0M!jEpCe})Am~F-{OZ373$7iVp?e>R~2hVqz zN6<8}O5)*-%f};iQS`yx*qSK3&bL2A#AxKjh<*TuXe`k|;+fXf;+(tpF;l|zBO_w! z{#ieFFBdGh#5wBquO+*%`|9in+#2vO@!(#^OLQMyTL>hMC42mUUxTRoJr7X}BcJy! zssc2UZrDML(KedYQOgjF&aAyhJH8GHPkL1Eex>XWrK>$=n6mDkqq#tH;c6?rs>CAL5yTeKnNymGEVda36o4c)xXIw{=nJ8+KXUtTB4#4p(XJ zMUSFqj}3YD)P(AZ_C4j+*r;*7$#p&Kf(3;o&%*?EWN%~P&FF0l3L2wsJ-8p)UH-u} z&EhgeFsj|AZgfp$+-7X_qvnWL^#HbKm_iYk;HLxA)T6nrmCOz)FxQK$9$JuV@tRpxKVVZgmat@&XF***vra@Is-(3_9X? z5`o3c-t9n0=J&b(;_`PnI`Tgwq|J2lkh^YvV_15heC1avJF zdesFf?>erbB&o5}%t*!Zs_{$F$kiuzm5vf`O@;b0?CIU<#pZR+U|0h?GtZRy?%s+H zq)2A4q9pU?k=#+{A#JGoXpt0^BaP{LB=Z{YY0DYg*DN`u~amn76ZJ4dqu`B4yeS9=^(0N zhAL`=6u-W24eHOr+#g95=1<|~j)&t$FAFz3PI|K6+dE^WZwGFaQg>9vct&t5eCp(5 zW&36s^o^Hwswzu&rp1pm0MPk@KNn!0D}CC0{o<0hS-Vko%XF+#vGGzH8AK6^u7^Ft@0Y?jUfK`n~_Qu2kLyDYf6I-l@ zhuucItq-LSe}efHvVA6FMSS3QkQXRPU!d`yUtb&V1AAt|GIF3^DDd4qU^qrJJfDIA zNw69+YLKuk@m9p)W#kNjcKt@*dZf`8Ha zQ)?dck0T<5?Jo0C~u8hK5-db76`w(NLK&3VRpHZk?Nc7{bd)U(?_g~#a;& z!OW`9{Gp?_l|y+(>WvHY;pOT5s5;Fi$s)gQv6W{*us_}s;x`4$?g=ZSc{U~IOkvm1nhAv04hBtU897N|HhIE+Eh zKgJ7UXwCr5m?k0)E5Q-ykqj8vg7cDNDIs_%{sPCpej3a?wCO z<{yJP9(4B6omdonMZQDOrtGsW=@R!DRqa0@}3j9!f#WYILYU;7U8^rcvVk;$vM!2+Tw=~fK31Td;B z^vHbMbaM2zPhaA>CWg_xr=yihee+6`(B*|x8?My&Oa+Q?(HluJ<3K+}+3_z_VV$4l zrkSj#?bs$ zRoGQAWs)mUbx>tT=54VlvQ2f3IZus#GVi;~?n5ADaEsH>=>=7AE9}9}%y5LDWFb*t zu6|5RP32c}QyQv7I<|>xiiW5dFJ`Zr0xamEE20HPHV9ivq?w))=<2iTT+$Rvl=9vE z(O%|qAy#4el0!n+J}@57PJk9eD&{obiM#B9=zt63fj)y)2t$$W5K5J+yGKazHwZo- zgTfYN7)9z!6$TmOcWp18g=B~}aF!X1(5{B=mF<1@s}yKNWw&BA^%*aFnD=D!&DjKP zN37<~UIv7%Q3Vo`HH7uVhpaO3AU5*Eja9;Hw#dlZ>4%nSL$3Bzyl5i)?E96Zo|H#* zMT)>DrFoFJvTx}ptgZ!r*JqjlSCSCb$Q@Vp9_73eK0|a#e-W2I&DP1b6 zT|W$b#BDu2PF{ViNVX>Dt0ku4z!lV|#w>)s56lZ&|DU#&n{^ZFN-mHC++kAM3~!q{erh=1Bul1(;m9q?G~Kt)9GF|}sG*Q;pV}#oymmgBxl$Lhrb25q zT)RDvMy`v;zvs`-{hkw3Q++m_3y6!gNlWg*hU=G z+|K+D)%N79++Z8}c)_aI55X4hcp>U#QH$sBfg($@xLc926PO(8qDz|lQW>{0N*3>D z;<+TWJzFB@8w%O$`C69C&!AQHi9#UMvhvL4Os$_j5o_-50+h z1y_vQFw08sF)617QfQ&bV}9dzf&P7tzb-2tPyg!e`KJF_U^})p1g%BxsaHbXml}u0 z{50(twX$KR^5e?{ni3aalo?H^*0h(a)-!@-tx)RV+|2aDGpF2AP6i>Eu5WX*_*m@M zz*s_w<=l^d1`L}Egp9GuW`2fFnm8AZjrY8rjaWuU&T<4*>oRqoT<{=MAzdM#Ny(VIBEfU1q+qJ9IW!IjW|bJ zl{dR(l;wm+_Ti zD9#2M0Z6sX!D_|$J4b3l%y-3xPrz|we1btSCv$khgg}#$ThU#@>~JT)GiJl>7W{3X%4^lyE0n4uapvSYY8&b-&~A4*p>t74!8QWeLr=D86`o!?ZF*!CXkYnxH??S zPBLsp-<0SJ=m8@+=klVYS8K)$G))a$u1_U-S!VLU*q$6VDP9d6z%93S%kS)1imYp} zcB=yp(3(a~7H@1r&oE5r8o1eCm zw_UeaPrEaJCf0o^Ii?{CA%};t8*-!iC8<00TO#|!J-pNqUu?bkzLQ*jk)tP6qZsB! z{_L~Sy888D@elP#mWVMttnamBzty@9A=qiqDu(P)XvIe}xD_kZp#Whp(Wv~^Nc6D4 zSXpJM-1-ZVS82PH7mYNB^@G3eQZ<2sX@J&Q4w8V++6{jA^V48Zp4AskC;xBGjsuIC%5w zsqExZ?A%Y9)Svwgd}G?>AuWXsd^6$*pR=ktb4Cjy%_-r!S-!Kjd=>;3-!FhEbvwZ=IG9$}!<=F43SFrR_Rsx+}RfxYzijj(SW@qEUV zFa5_HeTRSj-f{K78w=C4@di<LbCJxtyD}=lor|rwO(mm7=hvjapL-iu zJ7OEFdrTyD!^*c%Yg!>7J|ZQR(l%0NXML)-l$oo&%3<*JgJjO%>Mnzp3qYi6a=}%m z5t_pz#Z1pWd)Sz{d5V?~83Ebu+$^jieAN&}`FrCfLL*|ZtpqsXz8LnpqLXzxhfQRX?(Q(dY2kLVgl%)St^=~m74b5o<9EBL;I#d? z;6rI7u5=od+VgY_7q2mX!$+08Wb#!A9ZiY~a5BN} z83~IWbL*bIeKDzS0)X|Q<|frG1Z-0v+*OoGB#Mkaw7??s+oJC!Hd&5D1v3`Lan&+0WMoQK+l!r?PYVnscRHo-Z_X~FT`(DL@ACc34_>AkueT*1 z@5K?){YA(!&IH0Ew+PBq(HrE{^ey10mf$?oJXbf zEG<(B+GR}|Ox(y6agD0L@oN1O>Sv^tk^a$XdU?tH7mN0hj+TpP4LPTnsz7YeEzMyRGk}|4+j5;ZK|5H?mIoM1>CI*UX-;6XVB-^H1K%2f-TEbT@AI7<;5Ll8ACziK zVUUp6O6emJf>b<5`q$&se$^SfB49IfqeVyvz@r0lafFBYrB!@FGyF!0Uu@Zqa$gCR z{$^Dbw%YcIq0w;02~qBpR^dl}<3_gn2K9NWD}O6sZ2J_GP&eFiKk|AFFkJD6;;1=2 zbqvwn3}aLtC50EY(NJj5ka1YzJ>vh|1*>*wh7nV4-oFXc7y>H>khY<(q>QaTGaNd+ zOdfq-Ztf8Uhowq^nz5rPni9v`RL!F(?$={PevTq|w0r$2_mWX;sPvdod+CXZnYj_! zN)T4`2Pc>xv7Of=BX@~oBlU1)045p)mnetl8rzr(8SQUi`%J0k6yW3nTmypp$m<@U ztP9l0VYMooDq~~OIw6(WZch7<=ae}Dma_`}MC^g`NlysyMeu3&wzSiS$=H(_VmE?5 z-czlT(eE*Pyqg=cC^O&>c3dp?c|*bQ!CAe+|HT4U@ADVPb;3G+zo9aoq|J;wvnxW+IWALqL_glucGNdDMM5S_eVo;r7Gv(HI(A^89r@`QweEk{UUkcJkSWD5xCP z;q>?!u{sjwy!Kq?_*?e0VoUB~=}{#8G<8*#q6RbYW%5?$fxv2qXL1U4;Zt|ws{O;# z4ADQcn#si1y{!kiO>H#~r>3C%_EYBK-9^joC~8@{EVaKza=#I7!ljv4@Q1;)q-I2X zm3(E+)6;EOv;=YtwmBkEFA9o=6O|_Sx)1b|Q7UAg_rqRpN)U*;mN*IhbyIYvx;f*G z-mlW6TQ=OIz#IPxEcFDxWaQpt7#9k@-3f!Nx3y4*>~#(E)fWl8Ud0!)3xgK&Dy4v? zOI^Z0SNd$2ZBejTVyRaEv>Sc*JbvQ`3MXy;yH!>S==rbas6+(&eBlOWE9vFw!zNCS zcXC3-J&E8y;k?~RXEG|)KvGI!o6~4Cu_33`h9vtkAU3XHu#y5T*R|C&Xn{>s`;S+l zZSN3>gwpLjL0yc3+w8*!)Ta8Im!z-4icqvPwWj%Bu{TsZ2ToL>rSx5NO}&t{H?vM# zp1SX9ALvYH)o9);Bg*79AHGOxP7+OOhqj-Ce>{lCj@-d2Dg9whMYse6P<<2hU1e;v zxcYb;mOKD|8x?iY07|CT-7o%nj{GTetOzBFdoZ4rqL>hg;2-;<*WD>CG>mxqsBQ zFj0S?@OFYMcl(aMVqsg{r^Q!|J##x)LR+^#9Uen}oK|r+c}3y!xQs*0RlZaVsSmGn zPa=ieWo+pxxej;1uqKA! zk|9dL7%_owgl`v%{rvo(TC*z6Jsa($?#{SYSg8v^f#trq7`4M2dc!`Mz!lY4r68p;%yY!Sb>??3?rp`qSao4Xrjq7t+Eh+E480ra+Py!%VOvnK|cT3^c;&{~#C zu?&O>Is>60{hzqs4pXzg`=wra5|d69q+f0^|FA$!S;48Aak}#)^Xrg$ABPv+)#oo2 zX?K;sk8}A|IiKz(prqjr*Rk9GbT0pRelR91o}nV(d>q+*$A69DZQp_lJ8NseZQLFc z>iXd3PFzJHYi@>7t&!B2cfaI6$NY5pJVwsA%z{5Njw`w6qF_B(6+2u;@mw+V^5A&S z!_ZNgqc_!>!td?V4fq^w7w!ZURjUq_c@UEhBpdt?+QjvG6gTcOy9FMQBEQ+u5|J;W zx&@@{X_1agrNCg|n+F(#a3@_K8eved4I!0rPU3NyN z@~1E#qirL8k&P+F@_(Q5G~;u%_ipiAeK8Vmu!>C}5SC(Acb|>@5xb5o{R$ZnSUTML z&}UO9T9PG-vh42g0GN{-8(-+#*VMGP4UgNPSG&}=tj53?A4m^Vvsz)3flqKY8?;0{ zu#TPyAv(fd=tpOzpc!fJ0=s1SFEvBqjACT7?Re2hWa&Z1a0o|2c^bj?#u4ebA{qEg zQCy|(c%lk`Aov3d+KQ0fJPf^edXiNl6OO-eIoEaWnK_f>;vC^_gR;u8^&s1~J&s?2 zmiA6^{g)$y2X3&D<<@r%T}GRa=cqh`f+V{PuKh(xlbR}yk}Nix+q4dxfb2uU`s7$c}4 z@ncYZ53ZvWhK4*kPAHsEOgFOiO&c>v<6BaB`WwU$L^@h|n`n%~=V7GpN5t)}E7Vag ziExd^0|=X>Li!cK0_Gi4B<%07Nd!)@rxM-vUo<`1^U_xgod~^-A*pn~a9ZPfr{_&& zJfXG0T;=RWM{!5YLGb+?xQ-}Uk{VioE61y)&K&p$J~0ipZ9S~rU;;xMTAGO?w1tJq zVN<^04CxuKwP{!T$-<+tyYNzob12O>J(`PNul)v10B31h5Rh|vV}6wKeH{&*5@2CD z;PrP#5@rBFj}KXV^*rgg5lJ4J<8;W#vm?p~TXXL0p)= zpF%%Kv1e^I_#diR3;-!%!sqALmdT2@<2c$Y5IZ<(&Fe{1!L&NoKOcH#2vqzAm%3na z{)tT?^8ARZSXqtw&A#JpPA;bvqTV^ig-nlmI$DEAQqTrAjYShW6+h9063D9EegSbkJPx7xzzOi&IalG?D=kB7k z5kPx;=%wB;p$c9VX(ijwR}PN@E7EQp1o_vOHBr+4R&Fb-Awl0Z#Q6!PN541ZAz+rC z;vdHFAj0)kV}l%X;T7=I<|q^RS(neyW;3a@M*aNQLNpnW$lGGzQ?ZDE&f7=8trr{V zkDaQPrHi*OU;T#f0KbrtW3I2{+mzPqwx|Tc+vU3C?bPpirvR0;dzkF1R_&3_;T;Va z_4_7&Kne=x~?-H`S!V|z^P#P+yKy=RafxukYQ#4i*wfl>l&IV-BRP8^Re zN#A3DX5L}~WKZ@65-2OCI4jPMQaM2bv`aPZ-KgJsZou8ibg4Fp+oI%aY6IC=DEWA3v2g1Eo|`_Q zg=R?aB{8)oM+B`tz+d)&EsYfjWeuG13y{yhc@uOn?{3 zZgB)fSn?QWqzs$TO|u8IYXJwxgM%VnD9I`&}SZ zg%kiA#T`GW9NxfN=d?1>K(@ zYb%VIuT>y4n$%K-AnlNrMgh=cd9SlFjR&h@%d%Wj!vd9wQwWeb`w~d^q*-1K(oH*&(kn{{ZEJ&gvsZCN;ITW%ZUD>zX@Hd}T}F1YJKG{x z4Tm`Q`|!uRVdXFT<-$vjmzbOe-gB{OnwOVgu~`Xrjp4mhb9*XkhG$tzwe0&BLU&&_ zGWi(eZho+W>N%H*Iu{tF*Z;-YJ!eNW=fXKn6Rl-BII*64b?i`rkxhKg9wQCcqa7w5 zsb)9A&=K(12RWX5tqc-_;;GKtRTDS5GgwU&t*O_oIHr%KiQ!@Gh#hKH3RN5>K+@bhRvMuY+k}?b1oXUzaUd(ed*#pf+BQkD5&xij7 zL4k`D<5GZRy&EF8yuGz6_-IX%-fr(_4BQt zXr0mwJ!~W^XZ!xmfynXjVvUx~<~sY3d0{@CVIeQ?!G2##=D)-C#2_J_XU@~4z9J~e z-8uVrKLXMGq&5YBtPGYUVQ{qv#` z#9oeu4BJ4`t-lZ)kW&jGb&JRFeBftNJD}j(_nt*Siydx?``bDU=M>D>?F6VFIM*A;DDR?ZsX1dfn8jTmU zb2`RHLsbPsx2)(ye+X1H*+b^-es@O%l#63=dR|yu?e!zIS>CEy@v3}JL}OT~IE|sZ zDCOe9u5I&$c3w57=uih~Z<_Yn$z+oE{xv3OzKHAr+l|pA7-5{o- z_D=1b<^RkMti!}Ky$|9lmtV6v5qf`U!}mNWU7?)-$Sr?QOGKe@0L zcl;eEkWO#sllsY&|N42>jdm&V51KCb58ah@=O^7R8pAfv_<1`A@BVB0>So*Plh8Ds zD-q`5d9T$|XC0`Qy5N5kU;aa70lYG>PNQ@m@xKysCO*1K-E`MAcj+H!({wpv@t5)f zILab_8ez4~rOg1x`m3Ppq-2bL{zV4}IFUCU=F^w5{`~(@kHBTHle)LZHQYWUSfay;|DVb6a}zEcwe zoFl-vF#%No>yz*upb-Gu?(wz92_*gk+6DZ`j__sxVBYFI1<1Tj=lk-mhI*X0-N7Ov z*vqkJ5DZ{Q0^eL;L^yogo@P=7I%slTfFCtlg6Qve>`8X>E$7z!Za!j$Z{|I~%0zRiaF zyA(;d(shgN2ulh)jsxg-%|VN;@619 zMA2-Gt?!L)%0S(TqS~?d0H!hfZN&6tnF2eRZ&RSuy|h8*z6&57KNAo{yyI7Zf;a`Z zv}2fb9=mn(7x)+wf`Wn)5)uLes_(^)-G!)+&Mtu5ZZ;R!`OdB-{18D3@NZ8inl9tK zPvU^|Z7b8276wyc?QYF|eYj=qOWI9{n-*M?jRj)2G(HQvXd;c%Sm z&UM{H-|h74OLXJ83n&84fhzt?+ZndL5EY@wpuanWT@!${62KwVe z1W?dF>2S5kQt>kdr$r#tCOW&Tak^f6?c^mc$D*;jB`&sC3PRMGz}x|D Q2S<^8ru4K(O3&y20Hv7jOaK4? literal 0 HcmV?d00001 diff --git a/smack/image/8.png b/smack/image/8.png new file mode 100644 index 0000000000000000000000000000000000000000..7183d8b7072786a90391c32fad31722739a3285b GIT binary patch literal 61142 zcmaI7by!tR*9Uy)?ha|Bq#J|-hX#Q|gM=VRcO%_`bP7m!3&Np6L|VE8q@=q;^4sWr zKi~7d-+O(3aB=qRS!-6!n%}IM9RXF5!$K!V2Z2CX3i8tGAP}N92!ue43J(Io(Z4K| z0banlsLMe>Rl}6qzyqR%q_QLkR1=GFYk~wkqdCg!xqv{}-yZ+qlG(5+K%fH~1!+l5 zPoup%Z%@jpw8Pk)*wc@jzlZLRKb~fMO!R$fkuBE0$N&ck7$v2c@8|0DR{g-0`2EF4 z#}3oD1^k|XMB`6fPYt39Q@D(6O=%1;NtNVbp$I~O0d}^5?1KoXTvJZdz_S<&!(w9&Y~N5%q1u)R*l`$sI8xri{g?b&=U9O$&Y}+Mqy8bmQIj5d;V(%XW^LA@oJa`53?LZ%q z^XSby1>4_8?KcQKgksqwi{xyic@6!%l1(6f>o12ufnDJ>1~B8QQ-V)|hnwfA_rwdKB3vh*7_4~!U|KsAUsU1vu76(zpvJP&tX%X&xXHVJaR z-R`X4Ry_L6*_^=P*Y}n-PodwOKgTg2(I@|wnc$4#lua6xt*P5D!Pw#I_81Y;e^^pp zp9xF6eqH}Q5%%WEJSXvd2(|@hvSPjzWm?9HR`l34Z0pRqst^`CV2Y&FxA5kDH{G+| zog8O%aS|gls=h|`5~AP{pSLw?l@~!zH=8petwdGJ>g}?I*Ycf}+8DmGtI^csHnAF# zhQ^1%ZzJOK2yMNsNyHowZU;FHnZpqId3Eqi!(uVKv3-Kf=}l4w-9{lz*e{u9xL

A-}m=h;$q`+-GAbKSu?*zUn`v!baX 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 =*dew4) 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

1gdY48L!L-=tC+xXX-2IW!_NAU z^{FpvCHT5}lKA@eYGp`z&fx5(rthaEC@HNbw(A4GEYbp?%~MhS5#O z<;|>zLIIhr4sb znv5F@VCG1fq>yp>KT_ezb;qMyQ^}aj3Do048IRYx;&EvT&*dMnwKTrbS&NgqJZ@8n zlquS=l_`}!I#Ovj1_!<#Bw{9Lc*LzVXI5pLq)f1dw8YG)14n?1>>`f4rP0?YHCqkz50np$f@Z@;KkpHm@9>^uJAT+gkoh|paRbW5(d08hrZfP+<3=erT_287>E-#LDX46Z5W9G^MCceC;!O6w2b4$%+Azz8nernE7}*I zFXnpP&2>#9yobb4a(MdZRjo^*$7t7l#80w4-!8NQa?%vq?uxpTKbj0QdM>+Gc9QjN z9hF(t6WO+f6~eJe!J%eGb)VbBgT2J>InptN&1~+sq>U45;j?vSC3Mmy)hd&39EZT5 zF!SDO+NtEP)n5+XSs+dlVlhf)7xy0DeL6DDWGPv11m|LvDX^Y~x)Y z^%$Zge{B_piJ2ADGYttfFJBi(<{I=#yRZpYb{>|+rDB!C&4j*`C0dz_3KX^Kt6Rj! z0;i}sC=Ht573rIRq|n)AOeSj}KqQb<(u;aO859kbqRhOvr|a)9NpW{iML4g+>UNNj z#~y=E&|R5B0XmduX_EQ?f!dG9+G#Gso39d~XQf5> zo4h;IVFJd^1QWnO-|3?Mni8oa`39X5W%X7-;`}AuzrPYNcGfzg&Vtcapa?e04MgyV z$FIK0o%c4<%k0BzaG7aX5->(geJK5?FKjW0`n9s^b@_wvr8F+(TQ?ac7k_qkfGU?q z;SxT%vkw;m+VE7ZPw@vwn2f0J7E*on_3w3BZ}0B+RFB;z1_Wvz#{q!h@bvVj!dfzB z3KtIA_kxV%A`i!pSBO*OD6&1MHg%tYx{VGypuQuITVF`Qw>MrR$_I^5Pn#Dox~B^E zq?WVa#HYeUdKkViSd3VYKh+~s?ZdyHoGi73ig9bW&oNJ@UR=J!Z` z2-epBYVy-B`2qP5wnl+Spt5V=s(07-K?&qz=#I}xkTyF_Mp&Bn4r zg936(Y@gYXy{qX?fo@>C$Q%<_YnrNN#c?cs;`elRPq9K0^o5Vcwnol)su`A@zusGr z(07Rj_>yjuJp2(e+hvgUD{R75g`*8l;PI944$tK%k7B#iRIYph+CoJY9?wjb9-my} z>aHMfL{D~ZPJ7*vSNHp|3+Ljw@%JGTJ#Kkl19GAE#!5Eg+%Hca>ZTX4u`hF;-=l2) z5Q(?bR>4IfQZQAxDn_YN^o);mM6AGBv(P;C&l6$#2gZJCw0{|HQGe9FRCCB5P8`c3 zwPP)gCN2Kd!-ceMl;>#|5N@ytuFx;Y`pDkB*^-k7)gH9{Fw|NxU}aCVnEE-@|FzWG z@i^5%D5fu?c!3Ig7c#km`eEsPOBwwITu1WdbLfO zvo&8VKd$p@H}nyE5iv!i1YbTPA2-Lx57?J2*YjCW700;`sb8~FGkcT1H0urd4}RKS zD7EHN8No{UC@DqkM(yxD^OvG*&7xLc8Wo->NWqHNEI&_7N1qvKQ-J7b&qz?5J-3H- zhn?XP9JA!qg|h2_aN~P1^g@b+j4Af1Bhlg;G98KpZ6>o+Q;Yk>_m=aB_$8A1crBzJ zNWEhEhRH-e@GxKtNmfaS86uF6QLXelfH~=vop%E-k5lf>XkdZ-L~c=JttMX_gww zi%x!oG0F3M4tMh#Tpwurj`}?WST<#j=Zp4{_O2Sj+=Ys(xB@ zvgjd`uY1J_`NVNgj)Ys2)1w!}M-O;O`o(|Zg)-Muamo}7KlWGCt zm_d{7W!d3-H!%f<+(>10W|DsNC7_xEO++C6ekrAeS8#&l)5+X4FODkHNIiX1$DdE- z8W-;yE-8CIDEBCBjd=z?=xHr_Klx#Fi3d61&=R*i602U|=vOB7@w=p(-O^2?_Xi^1 zX^k%oCi|ak1;!@UPjN?)dN^+Te&X_On_Ej-}Twf73IF_`?BgV;bWNumC< z4;6L7xH9H9(=kv`Eu#Le%=Ujae{Wl7Kmjg$`AZG#Ji*?xpP=pr3V0>GEkK7FV_xQr z0@!_E{-GZ!^YR}O0#AXBn?^5vPp-U9PWR>2KS6EYgk$==r7sYEhnZm~rr%pjD0r~E zWTd)%E=Gk|)!A`6UYf)677RD)Ge01+w()YHvGj&(!t&u!-FI0YU?pi|$z9eGXq|_p`Bihl4bLg{bVi~B^ zD_l9Q4p-z4bWPP&Q;8jMH6~I%lO8*gsM7KvF#je%fA%LTNoQLrO5xS3go3`GWqIn+ zcY_C=HvC7W0YDn_vMR3Ads60a$TCFYwxG+B&7KRt!_nf3>m@itDmqTedIE^>jA~Ye z5YxXxi)g*sQLy#SJ{mTnxoxbe9@1^~{?*s}Xm5%P7r2omh8|8Uajke1xKd5rEEaz` zGNA?)?YYp4Jf4_>?>7tIyr|2WW{S+Xo>fMnD|RRTO%Kn-p(IJv<+hq5@`n-^_(td9*Nxtkq-KJ zQZtfgaCqqy!E}e? z!;?Vgn9Bz1z6zHCV%sxEwS~0G)XUbh8u!aA`_Tvda%YClAn-NB@MIY(v>}ptQ=|-s z8yV<2^)2PEVty2RDTW0%4NIUdMHhZ{a||fgNA`Cay2&rSMJMlzaeK6i;8-q+@w_(i z=ZBH7>Y9TD+I8!Lyd*E3na2oP(%)3mnwQgr*R`7!&iBT~sLbX{h7o(~TSIgxWM@*> z7L@we*jI^BCLy$du#FvjtK=q$ub5i&-OaU-m0JZ+(#HB5HdS&2t#UYiy>5?7(M`oN zJ@w5iBgae58(g50ie5Bx^X!muGrE_ycKk}vE%XZT8!WEnDuD1o%{mO)ComQ zAYiG~XHHKBK#LDKN-=H=eyz72Y`?8RG5oDAzv1Yk!`NA8<)hT88ZVFIi*uZV4{2v6 zS_>z%v}W~{ug)vNX^UP?x|#fVF(&@ObZl33b?NU+zRsoRRLYl|0s#kohPr3&khHhp zHJ*UZx5KK>HcEP*bDEhQK90;1oH^YsT#xWMuP7pa-uP_V(Rra}JyG0bs(fj3ueZp4 zTvG2*J4jbL8fBcD@L9zS78euK1yFCy{?-Q7zKO&{xw_i*ER6`2@`eV6?*8PvH&%A! z)*aNg=p}I>WS5UR8)Y9E->_+aWR`OAGjR7D=gsB}XSeKS8Ad|dU1Lnz{tprj2OV3N zOod>f7IA|q^J)eL24tP|{_NAPf0!<}m{BwHG|b@jET@~A-2O#~%yZT-akU;~w+Xn6 zDGFMiikXuay;wSsMfEOeJgly&tlSI@$=YT*12wZPrQVc972VycC$1f%cV(UMnVunL z=yRHv-v>Z%Ow2t7$;&@Q9u}9UCWo6xty8YVbQtn}U&c}nn}Vm2N2`zCTjr|2WA1-1 zSbW-hI45XaVZGL)r=kipq^l!CQXLx{W9B?Gv9qWk#pQ=|Zr{2?13P~C3p1%?cEQi^ye8^{Rq_~{ zz5p$=Io}G0t!Z}r*W0af%~CbCWOmeZ$uiv7+q{EW6wC*8n;S^A{(X&4&_Vx%Hzyb;MBJXQ zzV&88`T6;`Jv|q7v|=w;e;ihNpKtxXWWta!uG}JloE%8+C3j>}#i^AsLEb*q$(MBf z!>{Zo%|MOtd^;!Mix0x2Qff~iCmDwW{Sja5?0*CK^RP2GL}7CBA8%S(@ zbha#(0s#8Ih2ID`7*?BGEjvRA!wqXKV$9&PZ%^s9Vry{-4bOiEy!`;+o)O%GaAH|S zzv2j=&om=rp=n^ZT0|;@Q*${fiYX`_`DCCr|H-izqt97X(YCFmhxec2-&AwD(tiRH z1B>$-)~WdaE@$|<={KD5u>H)pv6emB&WexnG}ZcfPPD&qwoa&rAU<33qRAh(IL>}k!s-Z-|D#<4tn`@UJq^QK#n12K7^;QU2bpiPtExf zE}SxYlVHk-x?bd(dE#M;>~)%WwBaGG0dSu!soMN|aDl_H8kk|H$|q?0!8_FvFQ4G! z2cRoppIZLF-#jxXoz~q;{l?)sW-P;k6z_#<&SF{7qiDvrm!B%Qzh~j2A8oY&cVVqk zGAoxupUKhwKw;$YY}fAR5=c3al-Q}6T$332CY14Jl5nNNOh@#04_JbtP1mQr6F+L? zpKHQ_#QIv{W8JzqnoKyo(Z652y)m!WPt;gvy-0~`6KL|rx~YA{%UetOGAcdI2i%QZ zEYELETT!2eK za6T2Ln~zE)1+)rqQO_P-d@|fJcKB~_UHGkEz8LwG?Re_1Mj0Kr_#PJ%F&gCPqy6vg z`>yGes9}}%{+_hBn2q#vaS27$i{e|yEnLEYcc{k#E?!N3l`fBihzq0^=r-Khc%OCT zW7gc~6~7_qSbr%iZ_|3U$Vi_Q4OOB%GN~eAi^9vBC4e0js(D z@OvLs26Qlh`g(L!vO&DXtjf9CznLRR2BijFQG@~~WiS|&a@Fd;E1HlKanwY>1r=OL zjc-Qikdt_@qHB+J;XFWJA^Vl)a844hegRnxW|`OPk$2^Z`injzy7p%sIr>diAz=8S zW62onM4O-2$7(nG7bmWl_J*X+ku=H)wwqT^s!c>`rR=>|90T)PS0nlEm3uL+>HuFg z+xgYUZ^jTv0Z6cc-Jwdsyba#XoDwSfG{T)#?qAIFC>hdz<@(pUijq=C7S%b!QtX>JYFw#<`;<8$FCHMs?>)=>D6enld-fX>;^ebSI-u_H zqW|qf#dDF^0o!iCL8_5&&WW}E^K>hD$ekG^q_du;yz46tm>0|*Pl|8ra6xrU{yGeEK3dl3mHKyyJ9 zOOBe(_4}$bp+0v`Y$|Hl|L>uP)9+3fJ_KI6=*thJ-sL5okapcPeI?OE-k!YMl6to{ z+-Gw-^)CB^r4yJNTS!hfGx7ImwSRPhX{AquPVJ1*TsUrMAQ{8I8fnXR+Tsl>Rdll8 zF=^5A+@>Lc`2EP{nr7;+Q}}NI@RZ>pI@;;p>-JKfbv-d@gzrj4&3l+ zK_4~Jh;qm0{fT9pjDXOn0H%JvllkUuFo|LvhKt_SN()kF(caWb2XLQe@7-?B(%lTI~F4 zH(;rXCqNg8J&x;%P#T)D1X{8UkqH&NSYFXhf0F_5lSUrR=KF`6Eue;2IK$nO)2&A3 z{q^F;4zf?6*XUamz*zMXRN~3t4k84pGVi#oRX_*3-_Pyi=3J2c9Cx}1n^0Lf`rQq` zq6qPr*_eUo3|$`8>QbmQ&P}*{-&05Dua5mbdE*{sQ~ixVnn)QhUp;wpdanDRq?`q` z2;`;;9)o(7y`Zk-KnR8xAX69Nmt;^svL!O%X0#Tt=JZSy5F_t(4N07TN`$JZ+IdCj z#KW11YY@y=P<%91*6Y@jFE6LW-8R&hJrbxb3PVCd06uyzBaop*J5|y594u5%46Y`V zoAtLucH-M;tH>Eg@0hH7cD zUL@zhJ&2kIJzL7~d*G`@CbcB(b)A=INpm+LeiZyh<*U^zspPqRIoO1^*s38GM8J6= zBMrg$ypb|wBKhl@)ab)wV?O)em8s7`cNfA0kO|epTU>`Bx6#pY&m9}R41EC9w)&*L zFTl+$Pf_3>Ohmw^1UF~R;X?XOr#n7TXyQ`1-iiW; z|BvDras9Y2b^yv_YWF^Aa5Y!T8}hcMXo2UH^34|JH+joHY@D;qn`TN25S8ltju;nW z%vS!t=gU4py-EGNyXaJe$m!EVetpT1csEGJD%I4VuwisV`=~LS$vJCU`M()=FPnV* zDy0dS2Al75NM6C$E)&W0UsiuRc#yLxF}02;zpnd+)2eHF>N{E)2*#*QY{#tvc05Xz z3nzMC#%CxK7)^!Z=)apm7%n#dDOhln7qo?0L43u0tYF*AkzDKO$(WY{l&(5C(D8B; zx=iQZHe*Tyq9|}NP|H?{I=K%=hKFt0B0w8Iiv$@$W;Pd?HWRS$*DC)51wky7HEuxe za$4?n1dZrD0?GPVYO8v#xRN=Kt-E$XtDv-}mEk-K4GT?W^moG{R1ZhBiJr(RWhUL!lON;7O_{*E*YD&o{_5NwT(`Hsw@OU$8YZ{JzFm({4LWU0; zrImBD+6G}6G(d|E?M+~gq~)8%PFn4yqxJ~&+_j~EtQL_A+)^oD{$sb!HHi{@wQh7b zLuP0BGruZkr%-M^P*PaBX);};ZFbImg`UlqkkdCjr3E=DJY_s-9DuMQ<6|@L@pQI%*yWH7G2i*R7GV)0n&r_k7(3ith!p= zI2Wj}xe3%o>{M^fhij_LGxA#W>Z=f&_wvxpV9_MD-@C~Gij7h8#J8k~{Q59uBj#%4-Kbh9w((;j=#U+x7w1c!Yaf2GJyRmkV zE%hj4_56;s(=^c0))>*dnS59YT_ zW|DYrZhp3VkBf%)XKWNv7PT*9Yur&Os1rxiWp`kWB_?$*GF50Xn(k=ip$J8Z*~D#; z*yPfiQz7b;Y^7P8$XEtb-3Udy=Bd#bd^X=c71_+4m3^J!w{9u&l5nNzaHYwS>`&nwuuhm`j#j7fhIbjrUb7F%B?KbBzFA*_ ziI0`jy#KT{8MJ3#f$4_zdLmx?7Z3`i{So$YM1Qe-A{!R&lL&2WCQmpt@6Xn^&$?nj z^g6JuuZDx18AKM;OIid+n^1V@*ToVfOJIq1biG`et>ge10h6oM`yvwflqyG#8RiUO5L1_-fyXf&B@*wm(qRGq~Ux=zm;^#sd(l z%7a?mzM2%Pe={ECWI|8Q`-?(TZLU1pQByRaCRHL(z)PS=4_aRQvy?yLDgM8nwCxOf zk^etyfq^@9o$n$FzM+K$QNe9szj{uvPt!Av>`3QAB zOw8Gev0t7Uf}N)3->GeLRay8)iJDXlbXyHo)ouX89+{e)EH;y?Ak(T?9_4v4{d+nj zXFu=MqY{VGMJ}pw-^ZvqB|;m$TLcB2uUb$I@{7 z=!S2lj1l2aiki4xogpP z>NE@sS*tirCfE12WY%)-=k!Bv*E-f$ARo$RGf}@)4>EidJmUC`KMKGegM>?_&SmHf z<+ZnniY<1Nf**bH|Lv3hUnXA%-fQNyD5F9{Qhq2=&V+(I$CMC^wL|Gzfw!sL*V+R8 zzZ>c zU0qxGdekxP(^F{M^*##&Al^Vzuy!)cL%{D(4XA2CS^&rw#L^G8Ymx(;&9S zR-()nvKAWTVwKxsOJu^&LG|?QXLe*LW(UMcy5UY$_G)0ql{VB8=irwWHSxQ^r zEB`o-gt$*Bor~=K1VNLdAT5SrDEny0INBwh%I*#umX@T_*?eqXm1|O45PlrXBLfz~ zH_U}d>@{>dhej1l;^^iz`fNrT#)VlGy-x#AaP=fJRMve@r%-Bb5>p7K`?C5p6}_$WFDiClNXNjws{?&m6*W)9UMv;H97uWCb75yW)uG3@YXPuAS&&)V(r@gUx?=?3%(C z3uS!Dx+H!b=`sBJx7y+U#jCy;!JBT>CaUSsQi`JDK!@6lNf_cP`tS#Jp0h&-)n>63SEM^Ck{XRn>kEB%_P=y7|ljRs|s zBxF~1+!9&bVF(%eCiKe446pGXpKkgz=TF^_53F`6G=4j$$2)wjc24KnilDLGqU%ah zQQ}2bWiZ5hd-c!am2Y~s6hnm@&$o+3kyi^#0htubw$xxzL||z@q058{!~<2dHY5HB zUeePC|3s(}dw&V0ez&X*PNklPBS4 z&uwkg{1-R^7XP2=Z>n{ag8%<@2Yf$qArJ58AMW^JoCZs|r%^ObfM)995JKV@v809tBRI;Jlwrxsc&wxfFgG5Jm_y4MLCf{0$2l@`A`~*EvsZzRDZZ7A* zt3Z9-zmddtT^P}|*^K<$!*KC@3}l zGBO)I`CTlgT=YFqScM1DBz3(bsWC*G&|_knbN3$)B5mv;kEVu@VLl|@iO;^-nBqya z=p~3lPM3yJJ=ZIo+Q*CZ1YM}|bsQScE8UJVY(e1`EpD`bdmAv4p%#;^|3hPZd_`;D zOI56{;9QziWKajLtbnefU+$cHXhR6uU1a1c z+VObUp*{E6AQ>CU&z+_M5M4stPkz$2aEOzm8nggf;2klAp?YE#>VNhNXWsxD`3bhq zuCwmB)HL$5Du3r`^Z(Jcyt46lod6_trB_fvttoMTWfc7S^}z7sgCq`YU-8xFymG&S zwV2Ra<(xybnAnO63R=h*9LQCfj{Yo~Egg>(d%s%(i5JY`ETSoyVxg zK7<@1AwD%mpnxatBp+fNV(O^r)2|V00asNQRwe;>>;)4ZA21-<;c!zZG6kk{i4c>QEx{gfszu0EJuWvz=gx6hbra z5E2sd>VG03ZdAX2#l$4PVsQU`4|OA^yzZxn)w6rs18_wnEH>;^qyG*8Yuw z2uMgO-6>oO5QM9Z&CP z{~m|@Wg(%XlP_?%Bx<7YI>QcVPp7Zm5rrk^|9KvF9Gl@A-L+ z831muyIfo$y`JaknnEGwy%!Xiu9qCr)c}e7m2*(H$bn(M#U}{xCg#*VP6S{R{r6%} z(fk0em-aY9D{KH}@eh>+KBQ}kZhCb0@L$>n<5MvJ(Zzpr0Zq*{8jW-g@S;I@1m*?T zTN^-zDFdN}d;m?I)AM{;5;$z{vchX}*)af^U=2#1o|Q>QZ9^QhrgR`fg4nrHO#GWKKgMCkKL1UALQ$1;dqh*cM#mzMgJR1Q9QL zKkj--O-utLvzVLc$D{TjzOBskI%Lbpl`JmVfRv2(p1aF;lEia)Q_}z%T&F_S;~De? z%7pU6yoU3X_kZEQD?e)G(XlgIgMRd=-ScM`C1#3($R;)FvjTodSS&iFqyyn9*5|+n z0b_xW%95F){(EL$Bs=xq5gg`V$a?4#2uy8aIuib$UWoD|n}_0}AlELq zEpo#}55V?XCB=2BI{G2j_9Rw>Te$_E3@7x~%jD=g>!krMaRw70-~iXtpc@}s#)Dtz z$pR6eF$8&_$wH+FGGqce`%mz}ufxzB5FSf`hi~&EOvn))KN176-#8Fvo^hkm5EfB* z+fZ!8i>5qWBUg2PV3YNbk66%(2u;UfQG|#I0*4?-_tBq-IFec}>tn#nP%RJePg3@e zbVq_>latY_FhoMjUxnSS4>71fq36KX-2)~vSoFY$T<#ozlmJ+4<1y?nY`~Ftfx00 z9_adCXW}<`{(a(tD z2C#cj9%G*23-zkyiIzeX^i=BEbP&^c0f&QEg-?F<7y&qfj>+?N1WT~w3;^E91ynT- zF{5HLX|gSmcZMf^_gzGw5Il8N+m61qPNg(9JZ zWdSaSrVbT4rhnKdqk!z|dxi(Jz?ZF$XF#UfBtH;y!w|1wp(H%Of_-PT`cz&R#0&7; zbkNHPPhgkGNzS812+HTEB5wfxw86PorkVgj!(fU$y}}0~>xKZS!(dV|!- zoacsyF#y@Ktfl|-3_WTcKZXBYKwnU1mN{YLv4w?hnUr0 z@j0-10FX6CPQdgeTLU&o+F*c+P9QLVObt}6$xnglhR$4Na!jZ~k3E0GzQQMaWfHiP4Z6IgDg(kgXkF!H5IDRkpE5mQ)Q?4kA>ipw^WhfDT3#?lQ5V5N!kph zidN_xBCY@ZHNOJU(63^?*8J#y}eJ ztu|2Bn1n`knHm+){;?l169(!0v4&580RIpm7rRtVNS*);i}%~hT)$+t>w@aIScJ!n z{z^oLyplx3Bxo@Uyz+~D@_S{Dmw-5K1N_pFO&*scpOT6Xwc`MZVj&j z`<$2nc9zr38NN;=@^2kd>Rg=ix0A!#|Kp+9zW6f>&G)kawWT+I=noJuo~eD@0r0LI zM4X}e(*neMeo$wzbSEPH!)$<}UAR#|ts$rD-KzHECCcPLzG>*9K=-m{+u3AWf6Kki zAI9eFQJo?9=&(m_=p^`mjH&YjQSaYl7l{MjGY>!{rgHT}(aB+NqC!O$5P1#J`d>DN z_Tng?^LHbeV!|4IPB*>L*&b4)%(`rmQ^>Vh~jG=0GN-(L0X zgCd{)cT_;ET2{*~mia#d3W(lE%|op3&BK3_$)Rh?kNy^F1PZwq%{2=NX=CVe{3}{EI5uJUiAhT;d&tF&Tzcz7Pqj{Jb7wn z&0$?)5YB*G(4e|I7At4p`t}d8C{1YNjsxxgOrdBpL!f)`!8)DPPqPB{F_%U~us-)S ze$>Lgme=Rq3Am=4o3C4~Gvt<%RD(ExoCbF4?(Ch-W1!MIS{!b_!fwp$L3DZ&q4?V+ zcBM;hMMr9DehZh+x{NOC0w4@J-1!y>U6M3gt^W~_+ncAz8EdZIK{u_HL zFTMLy3_WP{3r^_u&--1)lq>cNWK4a{lw( zW`N<&wfLQCRc`n?87hhI+62a#%5!J;+4JzIKq&;mlx)4Hb>OXyTTzvCS z>j0xZ035D=-Cik!F8!aZE~DFfujcOiTkDk6`(?Y^eg`<0?TZu%G^Ot0?=;T-{708} ziF>aW3vi)(Wl*dQI)TfHm(a|*2i(CDKrcAnW(r)8{XymEDn7bvp&yhAra=L+Szi6T zJO8q?Sbw(o9S~lC8H93|H)v-e=69&_7Pz4DbLwDm?f1R=b1q)T(}VedUIu&#Lj4ic zW9Bn#XqMvovI+ev5GsHkgiRJC0{Vjwbw7ds5+;N-g@GQ1Rla@QC99ZesXgdj`l#LO z$M|t;x+1fX7giMj(&56J&gi0eQJ^~HqIN|3if865SkR}{ho^MOEV%QiZ%7~_m9aF0 zE_pnykdkamI9YHIDC-f{hKG9inqO8yulG?9V^-k9?-E~FF=NNZy`G{ecN=P$M3a1k zOW{@PQ{7g6){6UG$RmVbNi2yABC);HJ;49zBd@Q^mWN|p? z6+(}=IyP}99;EY9R$?`W(4#&|?w|mGrUu!=UVdD`5b02FMsCvsxBozFjX#+@Jom2%{2gc@p0t5<>4GfyDwBq5HnJK&L%p!eFT^ zqHISf>SvN_+YfPPgv!Tg?_CjeB^T%jncxDcQ5U~q9u?aFNHXyocuz<0Us^CGQOFR* zqJA?C1`5tSbbNG@qO%}^SIkTD%o2gD3vYud_C>b~l^AClW|tnO3=vzy-~-q<*{G!K zmNNOgm3S@)7;;2E9e4TWeE>pa9Rgy5sL!5dal^iQZjFtc|K)2-i%t!qK5LcL=lzzc z-e>a~)dQ7w{HW0|PS7lQTO3*)15WYIQUO67faVboL>~i$JLPfDFUb9RjVRFUW!$&LNFY4G z$P&S_s6<|g76r0sfmCP2WME`a=#rKaL_bb$`=2@bxdK3o02hVrePKH3z6794`c$NI zm=nx7<*bXYOpt&x=64@~3FPXn){10J*a-FZm#liti$m6L5fQwOgM%3xNIornNbmz- zPN1LEZ6D4iAQ9GNc)Mj!%-R}}<`94nP;$F5ZC9d1{Yd0gnT3_lEWa_0pRpMu_Z<_@TI@Ov6M%BBF zrDC>RP8BlWY7^18!7odN%O`m{uN3kS%`mP|D&pmzTtD|g&xc|r>`P&U6xOeMLThGS zjy$akbUPYJvky+J=_PgS@D3bKYk`laEdU@(qz8&F0YnvI0qot%vppXlpc0ka-W1~b z6tkY%L{TopYTG;22k}hRc|VO(3Igtw%%mOU`ZhwoVBNu_wG~t85+j}Y-cCp z$hA+jbA<-zX>US{_CCP5JAZ=C|Ay1jjh7#Rs|hpzlXd>CV*m{0`Ny^bF#?P4ITJy- z9znyIEyeP6ZjC%h({><^q219&f{@LUEV5cfTDR4* zjwKk$xKahv9NCkT%#`Ze6^QSV8K zf{_`Y=-$Wi@#e@Nvoz;$@b358jL41a_*AaF$0X3p#xD;|!c2Lep zD7FJ_AD z;bo90BD|chh7Xo${h@3^9Q}}j46*@$QGA*{1}N^FN2kpCd{5hl^c^R5i|;iG0l)J3 zmeY=;8=_~40?Ph7*dgjOY(2+rOf(*=8McjN-3Af`Uu2d%f}JkIwAt{H{3gX zz!4m~)D?cg^+xW55;4^L_o&0xIp2?$AU4ms;`@Qgwn4UMpT{lRS7FZem8wL@smuZa) z{txx}hMMb$&NN=me58MO6N$&>F!Fu!F(_@kVO7H6(l}wh4?-4wG?cGXdZb}3+^6v2 zz&z%)`^vL~_DlZJyv0ZUb@WmWEXBkWCD_3|WM-iH0sAVB}v9Lw9W|F~Ve#Km$={HPiy z%HPfbf{v~?5bNjaScdv383N4(2=exN+;Iq_SDdiRZklNxfb_gI(ii2N9m1%aaA(}2i089#%CS2-3fX~dsE zNO*J2#iTYz>Qto1gb#!{sx8PuIG4or=4k~MT3{9-YDZma!8fm%*r~P3x&9^U$HN81?Xc z<819ut{aioAeyb}6jyz5z5e#0EbSu^Zdb+v=vHD%*a<% zqho9vfYi|44tV>)4RRH3UVpHVd|6f`;!(y@0a20Y^|Clznukk1$nFHi$y~f`?cia% z=&r#}f`y0Fgw^u%YQc#)Lss-}J-psv2f|y}U7+LX4^$i)p|;?f-|(Gr81J=2Yt8w? z2%N>YWIul~jR4s`wGimFt-;m-;V$_|&d6xOj=;#q6_c9qTzFmd4wquWb1NvBzZ3G<8gJRBSNzUoj_P=wEmX33T=o9w>J< zJr`aU{Y=s}NX|d_DrW>>CY&7<77!(oHwJ>BJA={6A#1PlD(hd_cHt zfG-kP+u8iVP9iz1=S=`!2W z96A7c1=xJh>%;gK?>{KZzqJGGG%($ti*y$6vAB42z}5l;$*n5DNhs*U85}86|7wmR zX2J6vD`H*)ga$rW&^l7i**%dg;c}H&LU?!)KrLWm(nA4io&lxLhyZ+9NsT!qe?uik zV*5CiUXS+2c5tCF5drXX*(o?UI9Za(jsQxFrp3@20O%8o?FN)Ri`KNoS0whJAZM5Q zz!U<{K9=_>gpNXYP5M&^F~uq*2G#l}qlcIK#LCZ9luG4Z%% zDFVl4^sn-V{X27qTL{<|&`?1x8M)I)MkN(SeA2ItMRDo@e2Uk*HSUXp!*rkN=s^40 z_}oV-O%N~gkCD9rZenj zZ?JLX&+{zWg$oYb_^$MH)sST88_+}p1pPR9Vb*Rv zAD4B0;+Buh0YE32OPM1Z_e4frc=E=d`h9NJNwrmZ#$m!iUV~04t8b(Fe2l@(gtBHY0_Zbe&mv8^h>>DR9X%5*Zba@6_*(lT-M4SD zXig7qNM-N`xr2$@gEDfSEH2w$smjPl4kCY)6e|~el(0u(=Cm1EdXlE9 zh;ROhNMJ?8YI#PxZu8s9hrrydZ-F>tIJtc)@t>YN(CWL2X!i}7Fr+}p%QK033ga6z zNqQJO-PrL}(g-($-CnD>e3uC{N+!tq;SJn@ZGzovJ(nR^Yz+udW0D~bY$GSPLnvr& zXy|dgsjo-$00115+6?rbY~1AV6*$((7)r8Q#hA4^cugK=6B9UH|A@>q%5-lIZH{Y~ z`ntd6``2$X?k~K@Z#J+X2HZc=& zUWtDu9l*evb{+C;BK+HfImL*+SnP(gbd`BuNb3gHSK7Gxa$TYN#Ds)+*czFcq|B%W zq8X=P9(spD5npL7o(SJ1V*+@K_Y&$ygBL>h7jzrHBDm4Wu7JvyWFjYi-$Nb;P&EH~ zEh+W>RzzE+iLouD+#x|8-$c`Q=A0< z=y@gmEY0?pxh5REcw%9b<J01K$4y;;OL-a&%I>AQ(p!N$;=BD`rq=h*i0_uax= z;SJ)5=OKcTHJ@_#CrvbBjw46|`kN;p4b$NXH#I)IS#?bb8nc5KN?-7a(EV@>3D~Vg zAfy3E!<{^FpNkLlh^tLWwI|GYUeXL#lOD2MKMhC5)IcmlZa;&qqad!7quhBGfSjIR zma!_NE*)+v~q(Zh9qaxDciGG9dbPB(QLG>6kgu(o)V(irSB$R1fV%PCS{AL!vh8NFB*grqMm@A?ZT$|E-GuWG!|7w_qqylRJ zc}Bva^CkPoW(f*d0`{Gl_c;}yo^h72RP$Qnehr#_L`xy$T>EZUkDOB=JbdVDblt3L;r{8z&R}@S zwjjH&&+v?Fj=O>d-oP5*8p+=VGn+TpfsVVQ)cVZ?jCf+%-GVA_A8QP^FZ5S%IAj;- zdwiJX4pM-CG8PMN5~n|w?p|PuLr6xF00$tE!@l2qdke;DuPViRcM9?`ECt>%Jtyrl zzR?6-JUis^N;wj>5pCv5Sqh*c`R#?MP)vr)5U~c91|^7o_;nVZ;rUqs z!S?GT|ChXTOJgUZT%;WI{<}pLf=CvS!&io>pq z>DhY$++Hc9xANA`y%Kr>MrhON79?5zHs7Py>t&hDe$|L`&yQuyVEUM_G08ojKfHKn zo#6=;&+wOT8_qy1D*~UVhiAR2;_Lbb#Pwby5!E8iJf5!+9t$aERCeK_tySd^d4hlt zBdM=i%8`f|2a8V=uVA2NsD9v!C^rg0^AC8RXiH}OpqWzHpJXE97EQ-82PZ?o(dC)Vl_B&bpJd|*B6S@$~eAqPHVQ|y|s*MJxkhSig6i~n0^tR*5Q4!RpcB2 zc||qm`#g2)o7$)BJQ6xy(YJ`h^7G8iiV6o$&BZW7N|I3DlXXWy%w$)j zPiMb*q7GzL*c$!yB`p>H`Aw%e$}204?Iv{?k(awAtsm8yBw3fQohAGX&CJY$Dg&i-5|)5d|7NGU4hS|_c&<0;4B<+7zs`r(c@F}_qvKRof-Z*rxI4Vn}b^A zxbv#3y|?63WiSGK#ek#D5#rR%yNB@44W$e}V2Bni;^Mq}Wt+&?5gKXww#xDLXLGDI zXkubpxJ0`*fy-R$(ix4M3=Y2W6={ZA*z&6!j={rX(t8UR*woO`<0GZiJ>GtLAHqZ( zj*U6@e2s{6bb;6Jd2byP&pqHkq*3K`*>U;Tr5m~&i(bxuT{sS|4i^f#)cj)-$1ifS zX09$}C$0ZAs3j~2V&yrlTC7_;t^V5HSZ~vl-LyyB+FO%W*_Qvj^5J?3wK$=h(U89- z`($X`NGvX9;+ZDc#LN1%$*rgxAG&?8TF*YD@pC5&1vpi|Ct945c9{A16hyH0r$+WDE zww8*kYY**2l}U9`=1FZ-;Y6iLm330g0mzmPPPl?~%oz0NE$|6La^eKBCoZb{u&&PK zw%fDgX}9A5@>coTt$W3@>tec4utd*fa@B{%0>=)PzGHI}O&hu62;BJSOwL=ri<`c} zWI7{L?&3ON?*!_wggw)qN5o;Vw1m^=ORgVzceby#57AQHzf4wz1Dn(N+$!~?^BBH7 z?*U~qm?zn49DBycVK0ozAAE@bRuINzvL#K-3zkn)$7J`TR9c)idyd zn(yrbUFgkduX~pI5a;$42$stRQU>k-MFX?z?AnuW2PwO(jhZMnb!_F?t*Kn=+g6*e z&0X8os&bK;b!t?#Pbn`?08pUpty@FZ3fFN*fh{s%ibVWl#J48J&Ci{#En?ZC4>Z2E zQe)3{=ub><2C7HLSG+NAR%M*M6wt*ytL^F4nys*eBZB{hEF953(!t!Z*BGo4mgHZB zjhD(%cM#alGCLRBR@wnVWf~Bz9H&JMz7YGs3h3pu3P@j{)0AN76qz_HVw~#H#_F

(KJQlo~lP9^i3qz0@z};W@tYeaSX9 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 literal 0 HcmV?d00001 diff --git a/smack/image/sample.gif b/smack/image/sample.gif new file mode 100644 index 0000000000000000000000000000000000000000..759e1cc17fe0780e9b5801d059cac712551bf685 GIT binary patch literal 2347881 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

_Gj*plb?X*Y)g0xUd!I1W(CW|8 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�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�mV$H4p1PWew4vlSv zx`k4^^$L%blJDr1UipqS3m8l`aU7IBGRQ%X<-Y@z`T zmu3JAY;+9sc}QsFq|Gc^0R0nJz9P*ih(d|WeT-Q$b%O5Urv#&Z3(RjCQONmK+wq-#Z6+)O+hRKW9Dd1MZ`-O+uh+2 zXhK+p6={(s+mJe&NPwmdmS%))Rg=b`XqqNvRt^td)#vyGr##XKq{8G~5}1amY+6!K zu$2>@sa71MLb_YKodvt~=39``=$+oYsS@ichH@&_Vi`s(4 z(gEP1nR(}Vn%Tu|8jNV#AI{|R<ATsJ}uNnt<+8})mE+5 zUM<#Ut=4WW*LJPfel6IBt=Nt&*_N%@o-Nv@t=g_F+qSLSzAfCwt=!K3E#20w-QF$U z=B?iDE#LO7-~KJ&2Cm=^F5wog;T|sHCa&TxF5@7Fj?rmpI)F6*|g>%K1R#;)wnF74K??cOf#=C1DUF7NiP z@BS|E2CwiAFYy+y@g6VoCa>}?FY`99^FA;1Mz8cvFZEWh^Fa=kz1z#`*XRrouFbDp3um^uI2#2r;k1z?B zunC_q3a79NuP_U@unWI149Bnx&oB+wunpfZ4(G5A?=TPdun+$*5C^dk4>1uJu@N6J z5+|_|FEJB0u@gTr6i2ZXPcao&u@zr27H6>*Z!s5lu@`?a7>BVKk1-jSu^FE+8mF-u zuQ409u^YcJ9LKR7&oLd>u^rzr9_O(h?=c_uu^<02AP2G_4>BPavLPQbA}6vUFES%H zvLin-BuBC&PckJ}vL#KKFbA_R4>K_rv;Hw3GcqT$GA}bTH?uQ8Gc-rD zG*2@%SF<%=Gd5?lHg7XGce6KtGdPE{IFB_p?9$Ge8HlKo2xQ7qmeiG(sn|LN7E!H?%`PG(<ngHB?8nR8KWkSG84NHCAV}R&O;| zcePi4HCTtWSdTSXm$g}+HCm^&TCX)*x3ycp{xw|3wOr3NUDvf;-!)$6wO;QvU-z|N z|21F-wqOr7VHdVxA2wnqwqh?fV>h;AKQ?4Xwq#E>WmmRkUp8iEwq|cOXLq(|e>P}` zwrGzwX_vNXpEhczwra07Yqz#*zcy^gwrtNfZP&JK-!^XNwr=k>Z}+xu|2A+3w{Q

ZrCw|I{?d6&0& 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

fVOXlJPb2I3sTUCWsV^+ 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

Nl%*6XlArT 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

UFPt?W9I$o@)p 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%0Dd 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 z z1e}}GlfW{wGA%PVdyQ$VK-{1p*qDKAER@Mgvu(^xX>m>Q2|VvCybcr#QF|7*zz9;J z6p4r|4OodpBdw*t6iHVG)8c{_gcwix`Oe1U3;Y?3Ei{+*v>(XhAO5)jjjVwBd>6{&F2oQZne>bW z;;wq)7XX#X2nwhR!XypymWAQEt~0bfY)V1g&);M<6~q8*FbA8&d7F>s z(>D`6QR^_#@eo2GIuD(Jj}0jror+O>U62$Ts_rAIP^6F_2tV;F*sH0yt*IIruray1 zF^rQD9H`6tQ!*xvKa2e;J8~nqX}^^_OuEq$#hH@7(LX>^Br_2lWkf(Up`0$GB*Owa zOsd8UTr5ut6wo9X+bERLyp6jMrLdruXu(bmfWi*Urm|Q7iPTNn0SN>prB>?6(PGr4 zILfiRDB&Tkfqbn=6ADa?m7i!Ht*DRR5RQ!@0b$ye<|&J?*rx2<&LwPB@a!hI#mI1x zpU4Xg_FR|t+*|gft}vt@5V(O4D8pgvwO=Di{$q7kdUA|;LN5m*4VsjoxgeCxnO4(5 z3sp)~J!H_JoIP@NC>r7pb;}Ow;jeM^wgrPXbiI!aLyt%_(c_~;=W78ZN>>ki52?7< zCOQy(-B;bsM4)<_fZY%u*dl@@ShO^eBsIkzTPmuuxFLP29>W2SWjQ4ctFXd9klT^G zl*J_tq_g^?6IqkQELkx@6GK{@7I~z)TAY<#z-1IH2$WxGyvd+5m`?JXoTXEpy^GH& z6oyfVZu~QW5DQcjyuo8zQ%&HpSe>_U+NZUx=CQ2>wV3V*4hwa()f&j2I8IBwRDbl- zuK<;eX{Z5{2@^z?+A`H|Of@EaTcYLurVfDHaj`=4lpl1eRrcJ%T-`!+F^mbI&%)gw zcKSkhGDFA!y_ZzO(eS4Lok=*fz=5g_hHyQ#kQ6}c$-9$1Vv#*@1znU8*X=MwqC8#v ziXC%hzK-f4d@Ip*ja}J=DS2&~boH4TyH_w;kl!^Bozg_I^w%2=UZWB}dn@R|~t zI8;0lMV4MirmBe5*d(%nUmJN^;4HyBR zP_`- zNh)?PDORpTX$XiwAA}&Z(b@_I1xi(UpJgV65#S$%f-kNLQG5I6+Jrgl095JaYQbv<6d*xVe z5&8YO(6L`W@g#;J0sfCjft+nq*jSiXi?eK$Gq>O~XmOpm&?aTZ02a0;R>|yRStUuK z&8Hm+r07Xb%^lNqC=(E#Zq~b>I91rPRDTSLufUb#kO|=^p{OtcQw6SPDK)bgJio)v zxAo4|Jc}nB7uD=%f94D9sxFZ1;ae?YT^)>*e5dFV!}&~Tlzd5e;x2l5+;~BtC{`Fi zpsew_r^iik*_{^?iwQj`aPi4Klcv=kcIyN{gy41rUftbQ~6m3Pt<}IGR z2K82ANtrJWDT-;R&b1{_9T}UBH+1bVITpfax;Lvt@Ep=NpuuA&61YCLsb~L6d_52s zE99j9f-!5y>Z77+tRX-ly)nob3akDuaj(u^lCd@498%ByNRfePm zWSqs>@q1?+5I++cfaMv;fq!?v&^a?T4eTSgSrtGcMA(o|b|3Xmp_ z4afjWYeL<2LP5_?RDD7y!~kj$ZsI0dMkkl1uVEd2^mF0c>P9CJ2!(1GhjFNetl#=j z2mytrJpZvg%-9!(-Y)Krj8fM~d@{Ycs34q8bwlwSR(D#cB`wqH&En|Xpwu1EMauq+ zc{FI42Es3V!#{k(kA@iV70W1qv`=@F)_)#*GRr)~G=dBukbRL1rL{p+W@<6aFgPoRCxJ zO$rkz00mmpf`tmBu3ZaNlE5EqgZY*eqDIXc42uZ5A?q%eWmJc5T|4 zS**Bi+jsBY!Ey7>-2w)67u8)@$37i<3>etG#|ZD8yNeg(%TtH(;)VM4?$g7MuLFjT z`tsA)*O5bij{Z5q`xjt+IQYk3e>(KQLk~XmkRT5V?x3KA4l1}{{(}qhz@UadG??Lq z7ecth4hd3-!wxv$a03oD%#Z_$E}|IY4L8_e!-_N1h+~a5?pR|EJp8}|i#g6PLk%>f zWW$k2(lCNuPu3+DLnDYVf?p)ig``{^c+jN?UGg=TTp@H2LSP+qK#>O=v1w678DT_G znhOxLK?fxWhGz#Ha8N>@eEtb2pPz7ZjVI%Hg4kjytPt5^l{xAs2Lf&I5JZ<^DiH$= zNTk80f*QoZLWDiEK&cp&>V8l~uJ^eRURC*J7LgmR>1|5CW1Zp<9Dq>w54P zLumFHYGLsziWy^$ITl$8DL{4^W|(!R*$SUc1}S5TJ%;Zzp6r{Mz_mS09Bs`}3>fdcX; zLx2Px*xwHN=|{8<3_d7f(;bpXA=D09$e@J{`j9n<2}T$phCD>5q77oBcp{83jyfTP_-GMR2lP&&C}lU4Ff!g8>R}pJ*CH5TBz|!_6loeC7#4D(wENLPCo*wisb`3bbhh3}6b8rME}4 zDM17MSwca3mTD^Il9xo0MizOL!AUM{)Di|?r7Dy3(tm_OPrnxRYXv?9MeI$4-Z0g% zTNQPK=~N9h)L2_t>sGc{ZObiLX{F`XT6&FX?%wH!pj=`qmzm)5t}fAQUJ6-^3G9^+ z!o*G?l{wf18`hbDje|0mfgQpS5<7$}3^JAxm}Vj-8xzh(IU%!{a5y#_6S@Y4Eex4( zK=vCLbO(pt!QslpGaennpam&o&vmfl9wNrTW;@84&X|aw{M08vMmrFHVvvI!_=jly zA&?HR=%W1~h(r|v8`v5YAqX|CLLb7~g8np=HLE2EL1ff{(|8c0JFe)CGeVKuYy=~r zPq0)7=p?0rWKAOmeM%i-A_Ex{i0Xp~30qMUgKu{HM<PS4pJD$5C(Rub5!d#{*!{wXfOpF6sBSnvam;0CSVea7)@RC8jdyRV$AW4 z$BZKz7TENKHN@bHihyifIlf#z@QHbyfPt4e3v-bcoXFY>Kf9SKbC>Dr{ z^@&h`Vn8$-;Q){@>LM1gsGqAr?Li%q>lvfQ#<-4AjZ~u$59r8)8QJkfDw+}5Qlz3m z?lDIG*%6Iu)YuvnDYB7;5|q&Oq$SOO1}SJ#Wi>lV!gUf&azY%KHrav01!k0^q(}xV zRT0dYDpsvE)dprMJkj~dPte@JC<-+SNpT=`k5YjHK^iJi)s|1kyp*MunY-R?icY}G zoSin{DN`{wwyj;&@{Xte-H$jAyfFzcNIqiTm~itW6~I6Q)*F%xR6qedxd~2q;;VL2 z00c?#RriQ8&#Mrn0#Km|e)U-`X#v!rOc@IN;@6h8AT$JMNoWA$qNRm`mVgR1ljA&@ zK*Pvun1;z02l>@6f9;E4`Wo=FEpqoX=LJ7{xAn^*{cxVt$VHvn}2cMq=hq7q9psHKx&P zJvd_;uT~+ZO>M4drlW{-kfO4g$gpZ#5!rZj*d7J4kBH0>A|;DA%8r1ccd=4tsr1<= zserR%I@6mx*|`2LaoDtE;u4ok0ugJ@HccD3rUn4T5Ie~-R2SL64yFMb70@fVh!T~e z8Ybf4Ns0lJs@-#)TTM(I(|5bJ?xak`DdTCEBCQe$oXR^AUWqfj;2ntq;tP@pL?9&3 zn=gIot55tw#aQ{wCx8Lm6q+Ojzv9;CfBoy=fKp3Z+)~Ryzan7@FElPNGVg9*OZW^K1HEXdFuZeLW~9R-*PyI3ZdL| z{`>|{xm`!Bi|8DG)RA0GNP}?58TkN& z*i~Ke)zipX8kNmp?LgP@nPdH#+SCXj5s1+Ehz#@yj`*OF+zkz!UAklm2|(5id{!kv zlx95%6QY0IE;STQX4l_Ad=pEZYT!ilcUZ$YlcCkt|$=+_#$X6f94^pf)FB5U1PK^SVxSbiT*hVG z%fY?a!i?AnkN{+yKxSYZY;;D+c?@xlTuvq6Z+uMuVT?&NTxQr<|Aj|SAqR4#V-2O_ zbNmKVHI-AvTn;%I%`92Z*_>B3pnfikyfa$p9bih}h*wMrM(q9a0dc1dSNUkr>IjP)V)u z&1E4W4PeHiP10tiKu?AeDRC0w6b_mQ9HzMm7seJvxZd(`#6|2HpJ@I-VDL!{M8h~h zLkdI_L1fOPXaFz$NkT-Bq}*1#h|Y3B1n&6SGGUvkIDqYN%0$%8L`a0^VT!ASS0qLv zBc4|UKq6tn-c0aB1YBZ$*;ns1pHNJ|XME!MFc|y*SOwfufwiK69a#L_&-_FS@)Z;= zvPD9n1^z(YpulDX z45Mg<$Jkgr-c*r&3=QF5!=Tt~0FrOmhEesOPAT9%##}!x)jl#+4=vd|>JUI`RR-cv z4D8H6(#Ot0k%4Ft2%Zhxv?PikjnSP*oQYA>XwB8N*@TcJO8!dCNk)iY^;MaL*%lqr z+we$>_($9f30e(WjwDHu{LhkH$&tuK+%ch(IEfP01>QvAh(^ibaLH&5hW!dMO)2e{H%&KfMOKt~-09=2hf3`Ff< zmoj}GL_|O`VOOX4&OjW~?og=%xC&x=gd(OFVStZCu0y7a&`uzv<_yR(8jb-{sQh4#Y`u43gBzFstV-P#}HY? zDA{+eTtAlQJpSr>3aib16+)JkSUKbc=GlC{NZB;x6}bo&Sx8>}oP%_kgw$CX(HTkx z=!hiU9NC#2#mI@ojohTj*wo01?1<3ZC)@;D9~}~gI#S+1lA~D(zg3Bqq(BYCog?Wa z5#r5cIms3FU57Oe;V=$dlnLKOj4308i&&Ws(-eYxL4> z(ay*!*QR(%uQ|X&ROzKe7nkZ`GC4p5fT;phlj<=dnZjNMFs7IyCbqfhn?`^odXG*7 z%O|$!oBqUPRzsb7X1QqvP3Wn*iCZU3o#K9Pd;Y(vo20S_pavo<;#iI!^$IAH_ zP_<6O^vlL9sjV7S4n*fou_HS2<3C>RKeF7fS`j~TF3zwg4D^6k#ixFBu6}r#&S?>h zm`z41*6QZxevFYA%~cO{5!i_2gmCLf0;tnH9nrLv7r6*yHCB(rjSu?ByNaEm>CN6y z(v-yA*fz;$UD6X0;c=c_kwn^&n2Fu3s6}*`z?sPi?8PuP?2SGw%|>PAc*-E=Xq;?- zSB^t8bkydxAqOA|r7m7%B%?rR?6CeBQ%1<;T>9n8YRWNr%0$=>%tAoSUa6SkZ1eCe z&jxLM1#JYhDe!Sy(&~gKy3;s(BC+^{_tXTl_{wG$3oAaKP?VxPL0I)k%eEZUgw>nA z`AF51nUIv>p!>j{5zyriA&4%eVO>j07CQe8|H)F7y>IBkq zuw%B9Do$+*d#10L^VF*Fw{5Kq(_&G;qPb;7f|;iFbziwe6fnLf;#}d{vhDdD#sU$> z2;>+-n3xe~5Z!hv-R`X&I`I(iOXCKvZ6u&i(W*Y4oZx;V7jN;t%s^3vad3<=4b4EW zil+`7?|1rRcyjK43}ks?AbogQ?1I%CL!^r&%^jP_+2E1Rorv!GRb4%Z91$q)B4~Z^ zu7R>y7x4!dNs+qJ{$yma2=Z373{bV%Danx}8WGxs2w(}?W(h=vK=f9L9D-Il_>0tMoud81(%q~CHX~CMx`l%S~p!2vfZ+gVuW69K(bVW4zw==lmJj|0HT~> z2@J$yuwffU>0V||mvYLbP^srJbIRi79(JkmDANNpFa*f#r&$v=iv+fX_fb2o=GID29Td+_k78`0i`@zKQctrLNkqk67dn4MW&kpe_Hf ziw?sk4+HdU3ba8qM!cYaZ%{_vE;K{0)L$6HG<<@HeN^B2Ej$Jc>u9GGUrxP+P*^yqgSxMH}AOmvlveihARZ))>TlI9&NV3>WvSd}Y@%{!?7n)@)8sAJICvzyj zC0b9Czy|c|W);b1L5Y5UNvDCYjMnuib%2wg07Hb97oNmLh*x*PmgU&pstrU3Xf7Jau1`Jx< ziw-Wup;!lIaEcBt#ogUXk-^=qw73;_XrZ{fLkq>77A@4~cX^)tlY4J+U)-H_PI8iO za$cO|yx4o~_2G5;a-Q2PX5H+U%TMR@`6tA}q!`ClJV983)z$3=f`$I_+`v^@uP=0- z%AQtS>O$8mN1+Jsv|E%~cY7DDaBom_f$`Z>c!9&3OYGwJr1TTSQ(0!t0@jMhiLI() zIxze`Fb5DshfN%us%#lO2At}3_!?}`^k$x63I6t0r>5C7)S^sEbSAZ)RoR9X{ZT^sZUX6NcSC(-AyV#<6bmRAk$ z&ayt~c_AnM98-Uf!=;}P!PLStStjt_0xsupivUB|;UF59xxQ^Ca1=g;n8$-hIQY?1 zD(f?55k7#0PwSBh-H}s?y8q3-XN?3 zvM|ytCJ~1@?L9Xw591xjIXqn+!%jgray>k)LchD;nNG{ql>C{ZCX|p^e4E*NS7-f; zs8+}M&|K$x1hgke;db*3D6mZ&CQLp<+=;LnPLT3A)`~#jj%RQo4vE*1hhzmgZa@Fh z+{R7iRlZKA|K)Q)TKb|=IeefEZ@uMJr4~uBg4-sK;qA(_mA}hsgJ#hK0iD>7&2GJi z@BcpCC(;O28B}5zSflUGHX5u`(!ihYe{7E*U79m|BD#|tYthtXz#+Ol*!(ct1pf4w z{_59#%4{hP1B6}x{?w0}SPruMCA=To-=d-ajv>=S7UR-Mj3BUYl#?VX|8qG=Aqmlz zq;)FV8F)kict(>sOK3xAk(Y2Z$?xu_XS6ur+L2xdYRh4A!?)qsq{_rzXcCdRzQ%!U zkwle2N$PM2xBV?#@X6aLcsQ2M1UwQ;XpK{qGe???nNU)~TjgmD%@G-?NSJOUA-~Cj z2GJwZDH2Wndyyr9q3D?Tu}K;J{sbRh_sCUqBC~i^{vQy2SHP|I3smd(UKf>K18Sa>6gfiWzXHQ z_p{IU$o5&;OTW|~HuNryji2evU3Xa?_3O_5JCAVT9b$wmz0VSZkgsld1v*r}~uOAZ&4*?TW}-Wq8e$iQKK;=rlw6VrjdXkUTxaD-!eRQz@Ls zc1a5%szmOiK=)9k4TVoshvzWF0v6sHv&6&H^%knj)116yIKI4K7%WlBqZw<9Q<84pYQ{(%z;PlhTp?vvl-HC89UBG#M^`{^y z(~Z99${5A8>FnIg)eLu@!KuyN?O|7}yP#>8%QpIL&hs#Cct4(w7X9izJC>qOI3aZ> z9IO)~&OMhyfE*I}?h+$OmI1`C$q>9jy2vgu&-zQZ7p3Syab&GE$L$`9{$joYa3pSL zqfGsT0sZH4II3DRkfkPEnkyUnkF(>KgTnu|`y8liZi$W+lQUkgP&5Gi3g0<>QQ7xO95$;)po7h+?FpjdzwE4Q%004`rE7P75Ny9!~~ zAtrm;F*y;72#3T-4d0p!IFt8tHH?Z^5f8ZnyBBAI3z{_{2%toAS*}Lz5hdAmjX&;d{ zZ|=BfTy3oB*DlFkVSSwj`mz?TlJlC=ewv1EOMt_S<{tBIkA3ogHlCt!q!@XNhnra= zf7tj)^AMZ_z{MEBTum}eJT#HVgG~R<`)s9SQzji~bwR@}aCtP%jF%(=SZ?od8kaY& zH6r*omjj1NK0jKgm6=7494YdkMOkSmMrKs^%;?j6i$|*-eepb4uf{kP76hWGRZa;u zUCi!-mA98PCO-WN*M8{gYz-_f%JDngW626{29U_?_9Rz&-j^ zXOSS`k5H;lJ6P@_R@-%6+1{f0>xrF1SOV*PYQ+RTFXcsZpONTk)d)k2`VP-Vuvm_I zc_xxVRrUoyFQ!Vqj%yH!Y-m%=aFp%LuMsTj3SpO`td$7!(J(Za;gfpB^IERhV69z< zjIx|Si^mh%%y-mVF*4WlPohUNN=gIA5U*^sL+zPhWLXXgMrE|rp94xs2r9rLrwK^` zt^4#ZaRpRV`w1@h@?mYW9xkp6dG!jVur!N$j8j57wz`h8kno8+9y9%`yIYCKTSram zUv&GFIw}*)c&yowLPebu5)FMnpPcEpoG&@jQ&D9=zG{>MYoo(zwSIP`?PisF@W-`_ zA(Z%fp{~X77us6y!d`TI9sBmDt)QsD0Sf-c2sRn}?qS|38GP>o{LQ29%Elcdl$#fEkrM!p7z; zIvhP-J$XLW2d;34U_RXTQ#vmp*~%T$ak3nT!V?zuPe-5NNA82)n<+%&#r{cKCuzyl^ z68!xw@N6_aO?3_^kQAt5M!UH6yJEHH`tC5BXDppGD^=1G#+p8L!$#*!k|biIop5SX z#BtUY!x`pN{`I`fYal(RvEHvXvHWC=Ve);In4i419^dO2wXK1PCCjvUgMi5s!z;X? zNs$E4CjXw}yPlv{%scPVoUs77*^SJ;RsWtE5-V<-48nVpYIY?H4f8B*r^| z8twI6JVkoTIK>rMe`0Nx%`>_Yc0V^vgQX-&>Vg4lcA*l1s(%spT> zT>fK3IywohA-n8aQJkDipj3IBq=*1>d@k;=fYj<-^^2VI?>t5JK|@x&56R0jEP0_( zo!$2Nxlvu%rI(E-mjKqQN59ulqAQ+~U?-d4hVAv-+|AJNwKU>JV^4?|{9am9#B}h@ zE!S;qsl?Y0y)$@soESF=t)e@_*-`njUO40hXT77BW~ohBzjS=5^y$C^V(TzzOCZrk zBKpCr2*)bXq5BDr#py3l^6#=A6<#CoXwE<9b=KRFFVY=e$g?BpuMjRpyDm+;0vZbS z4p@E!cPOPiNV>Y9`h$A4ib)N0^@WUwH9b3W0TBnO1+1B)aROLM)Csy&Q8 zX&xekvP;EQV!`&jJdX$I#Sfrd;uaj{LD!xHL%Cq3nYV$X>32+icd&!@1& zlJ_9WOhpqZ%7>FK*jLUI4UsmQ$coyZZ{rcI;L<)sltj%vH;IgNnk;+mfFHK(^~<<) zPT5OVJBQOj#VcE~V<%XFqy_jq<(U&QX~;=<ON_^!zHbJ6WJ=b>I1~bK*U|`;~K7;P7&9FF&}kev=PQ zjWXgdf>o;E7pe*9cnj1IfqS(8)9=oDJkgG_Cq1p!m_Fvz=$8zlINrUitPRnXyD z{yBX8P(b8dfFq?eT-w@#S~+s!newNX=0!p(xk8_(epEZSBVEEI{oql5)1?Hst->@1 zbR0&$*U5YbEAu7(*$2zpaocWP!?&-okJGokREMu$J`nTUj14}c;g$7x@^|LPBN91b z4zDH_jffW93x)i*LtKzIx_Y;F9jG$2pL~C&bJaV6?!vuX@HDJ z*@>>1UTH}^8@`w!T7>C9Kb9=5E$V3#;);?6B{mwCDaj7+b{0AEUka~e+ZO!Hz!&yr zBTHE|6gF`o0_X0_PZIb1#<^h-;Rw7&Oh&CuH5xIdtiwtPzc}B@?kSTii$@HNVu%%D z29f_=BI>zoEHo8u!xXy~topzR1{c!FNC$SoSJv7u;Ox<=@!wQccgzX4GkwVOe13Z! z!XI2?!%nMsJx78vrK!LFsX0~PFWVjYp;n4lr;no6tXHyu)n~hOW9(q#>4Ji?8iHFW z8gb#e=5ZBB)!QxdC_?0N1i9!ul zp);LlzHHP{EfRV#SP~Nrp}%t5xrTEq>t+!kPbx3rZZqjZ7$x?IL= zy3_O`Z-19BEDQD#x4ZFVwYO2FR?r05m%IdfOIvC}i!znkT%u^_S8ZfsBq>{GhZ8xd2)wyO=ui$_!)SBu#|<{o1uD$AIQ-3-&MC+#!$saTL zo``8V$~ZQc%z)XPA$)B*L@(zRRZxoKP8}MkiDV`=LT0IQRNW$We|uZ4xI&Lot2 zbE@-8j!3Fzj-eaQ01i&c+zaL0j#MpIwSWS_be1peQAVzT$@q{&EQr8%6q$S13eD;S zr!yu3AFK8Clg7Hg!#~CmTW6MJ6o-Lc?>VCOuYLA=e~K~EVdg{xnqsR=Gw35V}DOo z`-f@LE77!XcLT{(jwR4hrzUJS_-KH7HPcK@iC2xaf;ntR4MIWx!)anuN?}A z$nxcBPL*kYTU4xl;SCb(AKQ)CzyvmUk%%K-EE!V1$hRsFw%y$;y;*+YS3$wL(rvc! zF;KihSKHpg<{VXDP>tziO07$RuotGMwHnW_ zj3s%>=NQi^&#O|LOC+4XU34ZR&GrKMiM-T%G0ZYbsc-D8m(GH#Cc$Fe zHnu9(;+qiVNwE@i&>}|%mSvh)?FzAbcs3IV4|Ii>4q>)uJ!Tu%=NipaE#hA6g@y8Ow)&YXuH40Vx-Ju#C%@Eb{A&ZseZL;ghgk5ql>{;a7;=T_;TkEj?EXi!zqLXY}+j&(bvfAAl( zfz^)P?j;il&W&|9@`RWds0z#~>eQ=@1+n|-w`J%Nq|L0h(E?49J#1QlN&M=7sM%e~ zusWjWBz4*1Dw0XhvGOv!4gWf6j^;iF+}gfHS-<_-Murn?)y7~VUEUS>!jKb5jpq9@ zra7%2uOb_6>vpvng+&hT#d-Eq-*C_9s`Izuf3tQyA%Zh%LYWs+ROA~g_-0zAZ>ho8 z+a6O?tJm9ai_gv;$u1k6y8jYTHoZAiHA7DjzgZC|_9WcGIbGWBgq%d0*M7cC^E6Kv zeDAB?iVSO!49AZt-HXOx%ajHFman*W$h33RN6&J(jXr{5$|q_ZnNmt5)8}K=?;V_Z z*Nxx7MC!O8P}3B=)x%^nU9A(5kH&!aHs`>~DRub)UpITDo76d4X41P8cw7#m8X}{z z@d9UlV19!mBKNuPNL_ZOs-EOHKgwAeM4jtfpFKjuxWFIfvOLpP7Pwfy4z(1O5f*Y4 z{Damde0$Ynu-ncj{l%?`KDsilt6s(UYoJm{UGzW7Lu_(&*}T_Yi?78{JuvZ}g~=)V zKPHr{nqldfqF}o98pxyD7OVATLc~UiHEbUtOI2(axDy=D|8rl)xNJS3Tq@`nO7X8V z!^b@LUpk6IvKvVTk`+#;^TE+_4u>jxpJSQ!2a2HGj}VK`&w@%jDy_+x^rwiGt%vYv zMV#hxi?yN%>3MWwIh7-aprkO#0O&k3I+mCLnF!CFw^n{aD{5m%!-B?s!eCyH949%9 zO`x&#J1!CeV`IT7M2Km99JJo^2=gkRGDk*Z!3*sGP9jyHEW9HAwQl&JZao3D1N6)n z9Mee9C*;uQCl}f1vNz(()B!ZZ@jt+GJzMFIgpyqTj)Fgg@8A$I(VK^KHd+o4gZ7dD zm^>jHC>aCiN=V*~Z66w#kjzxv3RxiK)XMEM2A$!4F!&sLv2o|JR>O0wpHv{~{;gLJ zpRw1Z^E+Nwiiu%pc-Ia7Tq&Xh@Du_iSZgxr*diT@N#Zk!e^?`BS3f^$v40gOgIKKi z?)&|#N(m%}^x>*t&7I}Ve;BrN|A8>@b8duSNTWQs<5P8Cr^5Y?+d%F7Oj+k!oVdH%;@eFf zB*ZW0IwElFrnWBhX^-V7gcACY5i->0rpgQF5y=E3;A{Q}ER(aOvIMY;QM-&4!`%fXd? z@^=9YQ61Vt^bO(}sz1WHop5k|b6AA^DXx8wOa4x)`8BS2_hO_70%IsYDPa;&98GWc zP#nXRt~`ijCQ2fX=OUUYN#Ge-YfX~ae<&lAlz(lVrj1|in+kWTgAqw?d+cXw>%9D# zE@4w0nX7L%j>t0k*>~{ed8&~=k)ugUB>zv$1m+w%~CM5^C!V_=!)V!%E_pcuFYtQy0BBF^{T1B%Zf*g-pC zBALzUzD#mV)^m}xHo|Y)rdU`ziSfk9)5@@>W0j<6=TWyT)PiM>LJ=e>&C!u;n^jKY zsaDC&evu5z4$gXs>1!j=VoilfE-F?!nTboV_HbM`gZzT8Be&w>dE@E}(Q!fX0O6gq$aeT-+hv|>tV^n$R!akLo#s^wyPv|bN@D{t+291hP zw(Y0a+F?ZpxvVD$Jtd}wrv4CI<7KoSDCeI?vzxx#ArQkS=r*m^!q@g&yziU5dFbh84(m^MLzrj@^@NOQdB&eP(DieC02p^=UjhEE-u{4prErQJGh4 zWr?1viZiZFOD|ItZ7~v5lFqkU3h)^b`dQ`j@~IQb9bO?;&xd1ZOqbgU6Yt)vbMuFs zJ^kZQ+V_|)8lmRAoZZd=F9+br1lV8{I0MHbz9M0awWz?yk29HM?+`1g@tX0L zvnf5U3RW{|sDqU)=csx4budHU7mK??O%D>F!c%lR6ksAZSr_}9x5MX&;TI`=;imgq zd#7joqo_U`P6Umsf?~nJ*@{Ci*39Tz&9?_=005{O7>fM;)vQ*|n3n{XOlC zKQ@c?o##DfhyzmDvKdaAX-zD}2_?moPY5q7Iwi5Kb&Kmx=$*3Rr6X1%d?aTt*_YAe zJ;4#%&cgIM#SmT3zW$}lgbQp+rzxp^`3F5ztfB#n+^t@)+i$I0cc`+PY}9I6Q+Vd) zS|giZ6I+SWtBY50bt|BIf(e?7WPdH1Vy(bqd|$>vb6kWYB%!=Zx?U31>VSn)9eY4T z^PDVdh9x5?QyJbxlHdnpML45yM#v`Kg(T{JejE3JllFZfwLZ8?D9bw1Kz{K~ya}bE zCz60eVeWOn(-9P3@IFU~FXjopp8$?^KxM*I4Z?0t7v-wQUw{^KyXBxS5&KnFNt z(RF{NQ_&r1qBoG&$BlxG9Zv$v-UA8&SiA|AuLVfCi5^yYxXSYsap+%B>vMX```8>) zT9q)+kvP6dYL*|t5TfutS1Ic3H)#RCK^pbRS%M6l+#33GtY?+i|SzZ zC$xQNVb*%-q(aJbe--Uzy_vt{wGTtw^O=GAL3tlqzn=1$3RXDovGjB;mCt&msar7g zseOd7z(SOkz$5=wXFd@Urh3%_ElU4FLqiy5 zC18B=WIAzxtDgFU@BFp{hQ)XS{O-R{`sLiWEvlRaNopu{tc`cC#PX)CjmOA%6;{=Q zej2+J`$RCCjDvhvY)o_ve81|@Tnw0OFF5qxIixZJZ(8^>{pcv*bh#rh{#&HIC)LE- zcYIIjznDdjm7$4;1Xg7`LBY;jqFPPZ<}^N9^h-YTm=ed=`Q3D%Z}(iyLM$82x`CyraE+^dhC(32Vagv z--x+ufW-8L*ayTzOxeVxF0C96+yVaj!JHBf2O;6NA&zXy5oNk8{vs?wAj&%xDoYg> zK`vcCl4pXU%vYYYo}qCHQfx^13<~XDaz>eXK##XneKFvE&yZ#g@Inw>0`m^@49yPHwK{` z%P3aL$T5e`vS-L!eWkNT&MnAzAN7hgEb1jRh^@pz9T^?r#j-7CN$JO0=da+*$>v6_ zXa5jwL#C*+5Nuth=iCA|%W^mJ)q9o2{stNwd}Hmu6a(%D(Kmyb)AbjQm?O}{ti*vW z8Jy%-v7E$lC4-!=*+9C7w%=AsG9yS&?nw*Bq`Du+uzIS3{mw7sXvyZhB&aAjE6u6H zq_pIy+T;^*?kIfp?R^w^Dt+yJfqY9DRGCf25zMqBUNUGB-}NCrQe}+f;bYFlut)bBee!3JK z&kwMJkJ>HID1#Ze^pq(I9hOi7t1wfLxI4Mhh7nu99=i(*F)gWw2*ATmJ_COg#G7ip zpGPbXv`IjLUX3y1hl5z7K<`nEORLO^T$0&00YnQ1bbYbP(PVMWOa@({r?$4aqDC^s zz`t2)w=r)nW4t@k$;r6Y2TRq)ZOHAq5`eLk#cY&bz?_hN^`PvM389yvBfP&l>{0h7 z6VULJ8@?r2Zmd2()mr$JGIha7Zk%Jp4_MOuHQhgJAiE(P<9rk`R;>9u!s#Kx3A(50 zGnzLUZcc}0IN6D8Um+)6c82W>#+3)?AImoz6?{_yRaZ-99dNU++G3vsV2%T^T<(DoT=4o?I6l@(Ccz$WkoPx0@&RR zr0xe6ETQvq0!Jcki8o&TwM`H);4w?9eZOpn*fB&rCdrFawnJs+RC$L3)aMXk4sv1E zKq?rXNl$D^ZMm`kd`T!}j?$66u(5Blpvf}2gnAi9ok|%Vc_O>g+Av>b)Bz^1=5)OE z)}Y`ty|bcV4oGssX>5@5rw9YKc+!)l0w8DOubf=yvRx;D3Xy4*`Ch~p?duy10#=a0D$-L0?dH`Se4M@ z-@yF`!1^t4^#*(83cU0Kuyg^K{{fh}08X9(CQbmO$AFOoz|bC`cN^HX320sce3%DR zP6J9N0Pn_t?+1ZJpMdW=fCWu}qAEZ|E}$qE`&}M=WjcFJ`qK~TgteKFs#IWkBA_$@ zSP}y)LIdBu0lWpRmPydhX#{l+20J{NzeILNFAK*Lya2Wu&4FKE+0q(;9w^4xe zIKX8R=sE@Pm;!ju0DNZw{)@n%d0_YwFlGf1xd?bO4+x$C1WW;Z$3gyM0RJI?{~*A( zAK>>H;PVNfp8zDH0s?{9*x1CxB$QNCjEsytJiKD!5-(oBRn^q>4GdpdSlQbtC`8}d*Md5TR1h}QRN-4({&Rc0R>?V3lNt2aC= z4*e?5f+|l#D>vhcKd0uGrDqqUXXIpN<>clTynA0#Qd(YKUR6=~p`xn3qPnHBrmd=` zz3RjNQyo-zuH&Gq&Fw{HHo9#38U zPhDSL-RvCSe%`*%`EpmYdfmBpIk-X>f)t_H~{{H^+=ik47nExO3-+%u-o_f4PF#t`dw53&1e>giSw`p!8a*&jmLf*%L zWp{`a#%~Vm_q0|_W>Sd-#5Gwfk+7;IL&r(?Rg<474P|zvvrp!*$R`pDf*_jttYR)u z$=0g5Ql;k}@OW}GcA07(|I2R6>V9zdF}?@S zSQedsz1c@{c2rScN5i+zVgEF8Q~f=nprq_@YH4P9G%hKN8eDzd69UZ@cHa7HA#4vV zl#BVPo_`y;Sf%^IW4kE)Y?Z)j(ykHSAMvGw;#i+480fmuO9M--vv}~>8TMz@YJB_4 z3o=)#rsT05<^x`9asD>b1GvA~YQmgpq*~mcuMyf*zL=Gjy9MF&IzM@4(HC~PQJV4W zMR3QP|NbZ#m;u2SN^l?~=*Z0bU^5%w)`kT&^Ti>T2m^q~!*-(S{f?PqfN0L$SXj0L zOB?{5YX#t{hxWy@3>c=uIq5}M&hHHD*&8Z51mR8@Hkl9?{@ z4|1S^;*LvKfBp}$lnp--A=g%q8eh`2Qnk&}GIu>#&Ns?CI4rO*Yos)xwAiLJq3SEI zd`EE^xcZ)an_{gfOfcKP=81Z?gH@W`$gxefnV*qkMPP-oeNKd8wOx*1ys`7~F!oLr zern|x*Q0WSFK&Ob4B%dvJ+>Hl;KWOgr%_A822XvUyY|IEY7jneG!?1yx293r?ZW!$ zf1`BZ$_>h|k7*!BZ~Y+zseCc(%+Bwd@mQ1#gXiYszeJYFSA9W)QTKe!(C-@-)%(wL zzo5Gq{#eEU&p+B`7v`>*T(3iGDPRJT2>y_s=vE3e3R31y>vi`?U?gt#7z zAH564oZOnB70r%|6D1{cZ4%AJ)@_I-`e>XAj8C~LatkTjo$`~XH#X{nBH@UiZA>;;doXtZ+`z*G~0xuo>g)Jc}{71`7U=VH5{s0xWs;gFF-1c(q&#Dm% zJ7?2^%yJ|vZKEx_=u>*SwW*(S#L;uQF5Y48`qa!&8D-|^f@P5_8*VL;LpC~HD(!8fZoE$aSOOwX9)N@hs%g<*hNaWUN zazI1^-T&sC^?)_RhncY-t|Z11_r@ur#O|MwT&Vd6e0_R(O|{%SowxCx-?F( zj2WLK{gJy&!s=TKV*-Y!ORuD-^&!~>^3q=l#IfBp{jgi&KenuoRhT)n0wU ztf%__#A-0335#pF*8Hl~CV#8!CX?x{MZbw)8l2Yfyjx1y)6lDNT2@U~MLi{Z92Kwj z*PHnanO&TYji%>w2Cxyn8&D7Xv`6B_#0HnUA>I9SlotlU8m~^NA6--w^I}toC>sr{ zkx6xROc%4xo7~3vd>!S^A-b5Zp~WJcccl)tNq_aP+3T}WeH^cAx2++@UZh-*k6(?f z0`xRM{qvM;`5ulw73cpQN8vj@3ab5kY83cs`9a`E(+?jnGYt`iZ-_^ z+!|Rp&g>NG{aD~qa;?cEEs>1Dq#ChfyVm&6Wq*vsX_%=4* zl|*E`XQN^J+W7-h@6G#5Bp~#W6gX#>8JmY6)~I?`2WF}=ga19+8pC~#Djya7WXUY2 zqW3n1R>OOY)T@hr(u7)HKe_LsDKsCkOWANWK1nDXk3u$X|KdlAfMA%U#8sWhR#e4g zq&ds8bh9%et_)u7aep(GrNknLb*_sFZh+A8Lp-_$B_opY^@|EJLkIkZ5~$xK2~thi z=FC#W%R4V{G{lQi*S1u}mYDn2fLVP*!TG@?_otdAi(!9opmQxFH4PMjT|W*>MDqo# z*2(FDh&w$*-v{i!14b@SZ|FV1kX~(ziXvxR7I;aG9avo8dop@~$y(u`D5lnvj z;dJMOVD*_`LYD%ke03aYyMX97<%-BM>X*!Z$_X!rg6Q@Pl`!n`>7?g@Rg8OMLH5!1 zm44|x$;k~<e%~|?{lDqq9b~<$h}Ty(b82`SRO`LKX1dYbYVa(z&P%VN zuJj$1>6zp}y5k|5nZjiV4%ZoE7i-D;_p-^GdWeV#4(_G7(7jM-@O6 zd2-&VM7Ke-p6fAsy1cthhCKPS`J!LtuQkr^cIYsUtfu0o6y55>1R;H?%k5VWiu#d( z*Ht@2ulRp>-Lu5M@Sk3bYDpH+NQ=Edr9A<5`L!G^su+{9v+cdhe!J9MQ(p|4?tq zHeaRUQKiyKmH}aw@)&8XVmmiQWjZP|`W!P_PhEtS45OUamtj(2Z!a|=((OGNZiH;? z2wSqgYDs3u1eLepv22Ezs#V0R8?cYVfZlz^iwZxr{}2|Af*ie>BI^d~gew+0;-P!u zaw+r90Tf)M7GlBWmMcCkvmnVE)T7)Y+#?W|frAL~uVu@c-0Aj~d;f z0P7`gZ^Yfq_XACk;nl1GC7haoas;ZvCV_*yM2N4C`8hJ${U>?gz2#Foh)2@BJRi0W z#c@O~Rpfi|$Us!2ghV2+QKw?n4m@v%TO72!%qn`v8ZUx=Tw~Y-lV}O4h^KiSi=qT0 z*>*%#bsbbu6nYnWA=JXEQY5NZqK<~?ukP=XrEy-%mQo;;QtYTj{*hT&w?(^$!`F{| zJRV-7<$b+l)qN>k{GvoNcbs40_|e_Q{2le%Ub3t%eiL^5CY(AgM%nMbds-p@A7^`D z%>g3kP9x=rU(UvOC*o=FXq@VP;4wBvyJU^WiCj})1gQx@s9~GbuF)yAbC>VZHyuBt zZ4)=OOVIl%X#|NJi%1{vwe3i^CBR9v*3X(K7Z9=yA}>vp(<36H;?Kr1;E(k zgcz@2s}7HQ18gRwuY@c^!YI9sB$9pNLM|0l-yD*OQGq0=UR)}_y2;SfZ6as7^e$0+ zy^`Z&8^wX$t{-j{idC&Xg)&I>GQiK1ON*ePK8zX8enUSl#$eBu z$g3m9!xX@uv7A8hfath3iN$!Ef)QCB6n$?UPO1mG-a2631O7{xBG z;&4LhVnikw8Kp@YC8`Zdhj{zMIp{m&1jOa+N$8afMH#X=zACIyr;pDnPt~>AE04CW$wfq zTP0+~C9^hXK;Y86t3pizoV{a@FnieYDlFR8n;~3~GLJ&Y);!_o=xz^1}37V%zd-t7GeJ%jZ@;i2VLg z+2wa8`26aS_wA9DbJ^3_n{8ZJ_S-1JSPt=f{mV@(B)w~heF6Lzfx(e@ydbV5uT+c z1ry`U!{1^Dt^AsknG!3R)SZvHFUCU3L6+=^cg6yo5e<$NSv4JYe^2r1Qaynm1i^Hu z2)p1me-(ypJcc=R3^wU=<}PMpqU1iZ`fa>0JGL~+5T-t8VxOwsL*sBx6TMW3;awHp z@0`q^O$9ZtqT=tL;7Gl6e`CuI{ zoFI$Ma2%Y`l~t!Erl8x(u+$vyRVr>ou0!^a`O}MzSzEj1#Esa&gSx67v7aE)SuvoT z$Tpy3*ad3ngW|S;k_84}>Yme!!2LPAXHjNz5;C-MjY`M5gnPOs&Cr8BXlZ6woTBiH ze(1gyQSv4908W$;Rz++gTUpSZT2o~x5dxlQqTSA6aQC-(?WLZOkk%ecEet{} zR)wxt7ui=OB<^KkYWd|U^lR;(-ClP(+oHPyIOSXI551j^=@1A0k?}gk_E`0g@~UxR zralsJi{)$B%&;O*Z7qKzX%@+pLJ+=1Y*7Of1$8*XkwTu>!L%l7ST_2qQoLu{v!v*OW;UMcZg#Y=yg;|d`Nm(6INYLR(Fx< zaWb97@N7)3pLmr24`GF9I@S9XR0s((zH?qC_SI|k!n{$NH6}*UcfL|R5XkZnJaQiC;NOJWs zgRSv;twq(bxLgpXzP4l5*;Aj{SLNSx;algEUmvZ4;@(IX*Bx-q;WcdnW6$t*8$o7q zti<6nPm74_iHV3U2a~lxVx~mj8cB8phBgLC9=RhJg<2GU3tDt<@TW9ULf;T)@z<#y zb1F4eSvgf)LJ)?2Gu?b{HK~Y5vROl}nY=ESdi&!qWeY3Q5u8I2(nhK&NGNI9!njF^ zZp#)=QXcPgXu&U+W0U;OWX8wdZFARzC&_#k`#kw;e2BOmMj>7+ zlRACZI3X32`=+N!x*EF13WV@A=OjR1|Ap;qI_GKntvNz)u)|1wKE~{982|(?mx%-1Mg^E4i9D=%db#L_&Q7EPc9BC$N!x z2^1DrWh5r5XCia0?*`C<5>jWkW}%ElUr`{(!?h+2>5$Qmuk(d$rw+G(VmSmf9E;Ft zEmdo0fRI*506i9t7$Be!M-AnYutq1*3x+@ffstcSDr7#=aVG*Ro0q3Ggl175D_?}; zYpp=|z)L(S-z^BONR{S0WE6H*D(XZBm*lOiFCI`HRjtP?T@`=V55^&)4KX9ums`Wa zn@U%h3SaSbN^MDMNsY!>EF6uCkUEkVRF+cOwpP81-B5`r%`G9XfmW29 z>U?P4IIXGc{9O~iPAr8l)@~KdzpQ)Ieb(4vUdPkXekjkYXG}#bYM{NGzO08u480H> zNpCq9v91HB2#u>+iy7J}N%3_pqD2AWU{eHOxpjA!ufDOH?d-8-%xNL*`~ji=aUW@+ z5ru`(5e+{sLs$TO7Naybmt*;eq=7@MDYAg=f)v>=pX8_|{?45pzKxikeAe^xZz(m_ zlL3-Sk|a7B4tgjZ*Jzgh#Qc?_5=?~IHcQtIt$>G+Zjx6}hV2Yv@q~CPlG>2V9g!$w zh{Myos7buW-bekNA1hOUUyt&9M0u%J7b2V0`0KFyBl&_w7S))lk^dI}Za|U0(`q!? zBzsMU5Q>u_i5_CxqCDUBsLzj1GHE1}1Z^qMLTNg*rU`OlRMMS{YLutKk-CXerJQQY z(oG+iN~=%38muhX5R>;T+O|bYTUAXJD>}!}3es)Kia60mJkfj90ZpbsaXv z4k&IInP#mHhAGhE8sHB{&mc;)LipRTe`qS%Qkq~^2Qv$Tr0j`?KWe#xoqK` z9<9uOy}di%1<02(eziXiVEW8U*kSbCQx9U>(#!Auh4IsmzKZ#C#mQpEp9L{OLLF!Y z3jSIl4n;Ij5sQEzg;0hvl}V@s9|#9IK2U<0$&5rL5CMn65u%*M2xvVcfssxWvPGOw zX+c`rm6Fz@8A2^fQ^Wq$iMI_nG_DQCDDo9P{Rw=%DCE!}r@m>1T{>3kU z{mVY@t53l0GoSR>M`8z?Uw-Ddu>Xz75&UTdIT*1ZS0D%l5n5meNU#DDbYKM?kl@M^ zOlrXWJ}h!-Uy54)7avUN0VZj#7E@>HiR>WNQ$`cq2prZ< zEd_AP0Tkd`*?QM5EqA^0na?um`<=Rq>AwAyXRqZ!SY-#MOlVHiv!4AQi#pJs7ljOE z--OV}aJ1Uho@`|&_y9S+u>zI3q8uJD!91-QBNOI~pTCvSiHNqLkU33;K|*Mfo)$HS zHaCY)+EUjh%A^iJv`az6=n=6yCK0H~yB#e^Lq3|elIjT~STyNL{WOxfsg$LJB2-NN zw#GCzMN%`RDNvMh(@N#kQcsymfFCE+$sIHkPq)H!c3ic=7<`6U+4S3a$ox z>l_4FKrDY{u5;n;JGN|>WyJNG=d2D}si}?u1_0S&R{59#@J2WCbIgXFC(HQLAC|9- zOldB&V(4te3HZ|pfp%ySDTB~A7w7>x*VzNsYuG&^(+FZjj)J#| zQ55e-%WDC+#SNu)!*v%|3SV9yY9=?;?|$o>-}~MdDZ*}JQX=5SWdqo8516A>2n;IB zN%g_<62M_b*Sf#Fs+X!uq%S#~m_#B*F<4a{>c-;K4gPEOatO#Ai66PE!gy8PW=YNP zfK{y*oAr_}ZWd^$Lu1Sw_5cE?_Pcg-n{A;o0kI6rUJqcK0z~I_z9VdLti?R>!3%Tn zo=$S$lddX*=gI>c&w9|aRv%kc^iC_Hs*!5up<- z!bv2O&`njHFgqWxn zY9o^A17gY&525q{55)bV0>S8a4Z_4W9b~)^XAtKO5Y)NZ{-ynH7$0SMqXal_W{ zvG<#}$R}IbjgzCZqvC*QZ>m#WpY|cT^9{`dXJrh3IG+;c*VrC*IQlun2LYGSf zIv+tABTUz8C8nqiFwJ{lpCYi3W(Gn$cwI+I# zI0-z#%LptYyp!;gKlviW>ovbgikyi40LrVW{F;C(w68XzDg0szVoNrtxID&*iZdLr ztMC-AZ~z977sb%9b91oqNq})tzdHoEbCW}GYd@`$j$UG(+$+A<+pwpajlqZ{!l*ad zu$*e~Bm}6I-7_jUj6+X?47L)U&~Oan7#1l5o@t@JY5AqYaw=6Z#kOD_=_sD^Gr!fq zodbv}2P-P+fHEjMANXq@WYR@lEEtJ_82rP(`xw9hq?i?0f&W2)pzDuw;*Sg=x@QbQ z3jx8UTeJ;S856=r8PP@)oDmaDnx8=-AnB*ELns!Uk`K@!bY!O)tf=a;!5X|l4|qFx z%)uT!6N|b#yz{{#B%6kaqQ3rm88+}W^1QVYL8 z#1E@CUZIV_fDOjLooeAK%<&b~QKVm)JxKf{%qW1(@I>ir3`?ZGQDPoaNvc!C$^~$Z z0Z@`7yNp_7J$UOSK-@T66f9iij9paA{Ru`gYs>QJ4+2ESiir^ZP&1;#ki3*Y3$n&* z+(6zcv}n{u4&0{{GRzb*8WjvjaSS^MvXZh30mlS^vYX6Bs3^GOL3hN#dgQ@HfX6KP z!6Ql{FDZz9vFDHHc^vIUy;IP{P7vuh~?oFS?rtKs*S53BUnEW2=-)vAks) zL&fRHpZYIMp^8m$fHmBTt|+lMEJX529XJ%k>TJpC3`^{Mvf^8w<>9zi`Mq3;ot@N; zR>=)uxv`N%ut`D;UqLWyQ2?}}3>BNcxN<<&LOS_D-y~Gf_#K6B4(F*}g5!5FT3IW6H z8G}O1usfkhvl``E60gZ9C=n+cg~xZ~LC(y<9^KK+ggbU5LcQa=gJ6Lob+sd0O(;?b zfmFf_fX($n{wb8uwOx}!nMjn!n+h*foG)xP;baO+(MV;(lrk;OWVfjG2)|2 z-NU!7($03fp6k@TIn6yNQy%Yhx46iSP(egp5l;qa!`~aLqntzDyGc`W9quatUU|2C zGmT|Ao?-d76kClND^Rg~s?7lmLpsHeOO5PVpJFjA!;-_H6v@T{rn7{<2X)W@1i-Zv zKmtsGW5iIp>`-W|AYPR~cLGcg1WZL^G;GwmL`$Ki0f8BL8l3^VEg2#sk|-P1%*>p} zdhF48tS%35#~hVM8w7zGj6o|=6LQ5ny%PvAIS3>*8`N~7CZ(b$)d*W_uUxAeK#{`u zLKNTr%*Zh9Qp?-OFXc$&e2UETDFDj~H5@A1p`=PW7d(a7J8d`bOv;F5)mp^Q+3Tv= zQN-C9&#?k4NTo0bb5B!Y6>@PEUg17pDZa?4&*u}R?GToVJupB5)vOe~@+nnmDXd(g zm(`n&QGCAzl?+&gRs5M%TBXojW!eozt)zo9IOA1mEHr66ffE%`!ZabE@tH(Zt}98_ zAaPcNx|*k9lCS9irm5B+y;hu~N4m4Kcce#oyw)BylhGVfbUjxkVps5DQi7D%l3Fj3 zu$z~#QbU1>sHlm)A-2B(SY!iOFtsn?JlKvT*fZ3W&YL#pEWMzWR7ZqFi!Do`tyuoj z1qvY_3tTGZ2wMX~hTmYk$F@!S<(%E?8|Bi?hJvErP&*j;%O*|5U6Z^m&C~QphiH?) z%@f$H2$cwlgG?zwSx7;_(%lTU3INzGeOx&**yB9Y5v~eNnKm}u6_G?SYbm%<8pY~7 zEWqkc*7aQ0g|Z^E;a{rZSBx>pfD8%aKC&o`M0_NUE#i`uMG`Ylrec*t?fx;@5i43m zF=26x$pD^9eT-t!o%@VL*kc`}YF@0gI2;ZoODzs#kwfZTT>$l$_DIX^O4PWv7A2qYf1eqWY#Y<|eT4^jyt!*@|W3(jsEgD)H{4V%g7q-SWYV(8ZQ&v6qX@VT^U%T9hlWT;>}d)gE>$D7&z(5-WLQDp6r7 z*f|W~Sm;w64!;j5fE%(vB`)Z@9-^+AnOJ*-~|H^u5t=#b~~{>dIsBqqrKESQW* z^LbS`K3cbo(1{twJLZo(&QJ`!%l^2)sD03!;HYI|M#Wfye-ZFy)MZV1#7lgv6V~LzF}L z8=AnWoGP~d+GR703TSg2sla9AvtqmaE4wxa0XH)EHG8#?S0ApVp1$ zu$Hk=HPzGD;^OhnJvyXT0n~6V&${qaaMle+>b<-kPq8x35<{_QY04_|#N!1@FP^Y& z3u9Asj#|Otdnr`{ol~=%EP)p2{`o~ZMy7+dP+Qew4*e$n4Mi>5Dqr%QXb~V$5*XyH zHBo(H5-#D|-%`x$LX&c8+qd0Tl=e)P7GOo-?KSe;k)K8 z(l=R?oi?wHa6-DNO_spT3(nw};7wYVTrf4xrAEWzgzBjNNapmEZ>A(p3QFV4Vn{R= z-6;+uYu#emS>%neX&yMkQZiC4)$XJ{K(gyk^=57B$-4&UR_VzE57c_&X3H@!6{cck zISwh)=QDn5<}u2%pl9bjy`a5sX?bDnOwjm~zXr8zIQGQ{9ma$H?1g?1ih+<7kmzTe zplh_~Xk6{~)tN%pCyo|J7c#DL^b!)FRvbif931}O-)3@5hTD`DU@>{SGVuV*)DjP1 z1e+F!zHL{X-f2{RLVN`ylYr$bMU*pt34gWa?{2n@4B>%=wl^PGsHP(|WKN+9Uae+I zP)wc~+w6{I5O?Povu{E_<7a-23%h2i>J{JZ)V;=QzD{sOOvE1ZmQi^ZrL1BK z_YBG~o=lZ&>Sgo}XKe7fo>9E;|EA%8zQs4z-W1>7GW*^Z=j??3Yzd)DsfFkYQm2U4 z+Vw3=VkN=f0y|ApH6*!A;l6E6Zt_cRpl8oyx^woFhLS4pU(f8Q54dTZmhO4I*D6g& zpbly*Mf1Kn6pfTzH=5jnU1|^(Va%oTI{x?NPg%n@G|G+JbK{}n~wW9(nJ=mCH$hcye<@YN_%VCl%@OX8BNA!?yy?Ig3c@fF= zG>b|1REme$rCnCHc1 zg4H`#Xq)GcV>AJr_a=(TOJ1+&pP$CUM4@62yBSq3Bezy&KWS)}`rdAS-+uDo)_Tu` zyPMAGf~W{D#}iaOFFfIs^s3S?LR^~C_^`Q`=!=pTt?WbruU#a;jIuA ztWu=W*p5)5rTuUD>;(t`0tXT-XmH?wgbEiXEMVZk0R#vVOiZ940Y-}y5h%FW(Evw` z3OIJe$lxS{jwl%{SirI+%#|n`G+;opW&;8W8Z2nwVC7AoE>Cvsh~R*Mqy`QST)MD8 z0f-W(iqx0@Cf2N4v1XM12=M?^s0I`YV3_bLTB%3B4j4Ot>A(PT=hCff_wHN(c=rZK z;rDL}6n;?=pHATheM2oWJx zhbSEagoqU)I((>In|22eA3QAb;QKf5;KGL!_pPXSa7Mg690y)o_j3@^Uu&pt9mEIg z)iY?7%{AR~`Ajun+!60gz~-cLDb3UyMmQ>0yqc0NG@cVMf_yoPO3>37>@)s;H!)rdnvIfv~~~ zAat<82eaYU0d2eGh8(WLG18lG%?Y=NBFF8TYjCzncPt3iC945-+JR@?v(b829<}I= zcL99xsfQkW>9r@Hec}GM-?;qg7ofQjJbZ|XGC9asF z0}hl_Xa0;b`e@KXY3i6J!vX=&a6t?eFu{lS^^Ne3ViJ2w-!XZVf;cMHyiNK?*6QSr=wPrH^5{sb!UE7PbkWhE3|Iu8oE^38jhF+HA3vMk}qm{YERXc>@RR zZ_NekYu|kX>o=~v>W1A1$V#VdcOX2w-FMSMKHj$FRSuqdm$P@l=JT~DZn)-(PVVRg z63Fg?4Z@3Ih4W^J;k_g}@S%$S);?ms{{rk{QC`K!5J3q?3^DP=GbOP@M|supLrMLq z{`^T45yPwaP4zQ=OX3W-`MzQmqCAqDoEM+%_86u&Qpk z`5>_j#~Z_m5OBmXp>dewt6-^cgv<%faYTqX5G;Zbid&X;K){IZK#M!unU>|qb2)2a zEA5|Qox6)@gu%y%-HSfJjb zM*ZceEXI2y#Mao57(uTsNpZ*>^N2@~Os^_Xl37at8K$8yKuRdnlFG8@vYHV7pe8QC zNt{yRm4zuxMpCg#Nv^^^p=9MrLt7qL&^SN(?a6+8N*W~#(!c&yEiZd91T14I%URO0 zmbSblE_12NUGlP*zWgOHgDK2m60?}bJSH-esmx_Evzg9(CN!fd&1q7zn%2A~HnXYC zZE~}l-uxyw!zs>jlCzxVJSRHSsm^t>vz_jICp_aR&w0|bp7y*aKJ%&1ee$!P{`@CE z11ivg611QOJt#sGs?dcpw4n}tC`2PF(TP&Dq87ajdHZ39{ngtLn_jdlC-2I zJt<04s?wFRw52Y6DNJK3)0xt=rZ&APPIIc$o$|D&KK&_BgDTXa61D!QMm;K0ld9CE zGPS8reJWI=D%Gh{wW?OVDps?q)va>1t6u#oSi>sTv68i{W<4uf)2i0BvbC*leJfn! zD%ZKvwXSx(D_--e*S+$!uYUb2U;``If+7MDgFP%_^Vy1Wgd?$zeQY>g(F$EQ;vM~X zM=h_h;ZEFwC}*~Enjik zarpAM&qXeCoqOJXL^r!Yy)AS}>t1oT0v*V0tSu3d4t9Xoxc;XVM*$m5)Gjn{kQSmrpEJ8o`|W%*+x z*VMr+rgAr1Vd7XK0>KFG?JK-2VEN+szd9x`k4r4&6k{2tL$+>_+iXolnB%*>?5%El z+2k~n*vD*^GfS;}S_lJLo4xJFIGCGDJeSwZPDV47)f~$y7kZ^{u5hKZ=?HQl7aeh? zC8PE1Xg;Ue&p^(!N#9IpRAY0y$bCniZy9R;qV~+o{w?*IPt9tP3i`C^*z&HaIb{6W za@MzOg*cKuj?46W{o}S~?y{#2ORIPNq9#ZFblBT&%o&qc*68+S*>C)0jgy(}a;Iq4 z{~Pze2NMy{4!R-6p351h`^hMN$1MF$_=&zf(UULcy8B^{Mc@6-20lA1?W=3aUml`? zhkNOTsqrO)y7Ro$xVU$0UWiZn~-=`DZzUY0!_gD<-4b%_Xe^dlX!+;Q1Myms5~ z9-?nAhq#-6%d~5|*ul?b+3Wu3ThDmOq?bNJPfw2MgI|`8=q_e;srXx}*WPJ2tj4#j zU|pBrp_Tu=^m`lPa8$ehDDDS2^k22Pm?JD)`pMF?Awt>dT4iZo{Yg~d(cS~XQUgkw zAt2nzHD1&i!lsEsIHX;4sTX!3+c^Fx-DyeS1UA&o>0SyZ-gwCp23B0Gm0kKF!onq2 zIGo>QWmefG7wfg)LcKybklzC$+p19@za`&LJJvp&i~K9_FDQ?jaxc zp&$MsAO@l!4k95Iq9Gn4A||3DE+Qi~q9Z;cBu1hnP9h~%q9tA;CT5~0ZXzdkq9=YL zD2Adajv^_RqA8vtDyE_;t|BY8qAR{4EXJZN&Z0Vx?jkStqA&g;Fb1PA z4kIxZqcI*MGA5%kE+aEGqy95KBQ!>%G)^NmR--juBQ|EEHf|#~cB40bBRGbmIF2JZ zmZLeIBRZy|I<6x-wxc_~BRs~VJkBFM)}uY%BR=M%KJFtw_M<=kBR~eEKn^597NkKQ zBtj;nLM|jjHl#y7Bt%A}L{20{R-{EwE{v}@KrC#nOU-qS6{v}`rreF>xVHT!g9wuTYreZE8V>YH^J|<*F zresbgWmcwTUM6N{re9w%}pr*bYQb2g`QJ|}cWr*uvybylZ! zUMF^Dr*>{9cXp?DekXW_r+AJhd6uVno+o;yr+Tg@d$y;0z9)Rfr+m&Qeb%Ra-Y0(M zr+)4yfA*(;{wIJ2sDKVAfflHN9w>q)sDdsigEpvxJ}87nsDw@^g;uDAUMPlUsD^GR zhgK#$s6#sbSc8a;D2bM+iJmBmrl^XpD2ukJi@qp~#;A*rjov7Z=BSSDD3A82 zkNzl-25F9_gF4(GM}DY~CaIDxDU&v-lRhbwMyZreDV0{~juvS~-h(<=DVKJsmwqXj zhN+m2DVdh(i>gBmN+dg&DVw&bo4zTW#;KgnX_6A(L~bda=Bb|UDWCSKpZ@8Os)Iy^ zD4-Uqp&lxtCaR)-X>~ayp)M+DyMd;r+zA!3hF|xDX5mJ zsh%pTrYeovDMH?Zs=g|$#;UA(YMK(Hrp_v^=Blpls+@|dLBa#C2CJ|RE3s0kk=kmp zCaeCkE-SOvsIL-avqr15POG&3Dz#oKwq`4?9&13}sEzDk{pZtjoSE zpSCQ_&MeK!E40=u&gLwf$}EfWf-amWF?2#UkmxR?LM}wOv|IgU&wfyYlRa zW`ic|LW#nHCY-1(1Oka>Lm&hKAUJJ_;({NPEhbnkiq--xtS#HNE!v*wCIG_Fs{SZ3 z0Kz6fE#9W9)Q%`8U_v&;LfQI3AM`=sVuCgFf+t`CAb5f&>;l#L?IvJ?*p4VM#6m2< z0wAP9ivEEg{DJ2ZuIK(iAH)KQ62mQ=?k&IqAFKlE-oo5cZXobM;07)r)whe zG5molWJ53ft}0~0@AiVz5`!xI0Vk+}D&RsU1cK92Eg<|X+-Ab&lCFpXf-HSl;`~e?q!t3S&|GsYf{&q02?kzFY zLM_;WHDrScXTvIF!U<=?0oMX1C@(XtLN*Ws4bw0)&;kdGXf6!y_?oEa0s;{C!5;uI zAdD`FK5zt2ur@`5Jl!Y1%RD&#O0A2P1y zt^@yp?$)p)A8;3E0uZOdDx^X$q(UsLg7U_3i4ub!*n%wlfgxK%9$#ydCYxv~U;;B_!ynwQ z4=eB~cX0#Lf*;6&HD5C}PcAdyf+zUF1*7i(+p;*PDlRj!HE4nipYSg5ffbXnHKcF~ z8#5b|=q(7ahypGzm?-%2GW|AiEY$9b@`5S=0w3@}=pJdW>uxS= zLLhX)Dty8&%&{iV^B@0#=87mYoG}M8Lm#YyEu1v(p0q7&FNp>(ixR^o!~!nx!P|~# zEtvB{=X9r*GcV)@jc^o7e_No zi>NN}K{&IhRy*zrXG2$iwP8!DBCA3l+^;4$^9;{42dlLz5W^f3FC1G#F8G1uqNpwa zaTI5QCy*%i62nRRf%P(jCIkW`x2RSZv}?OIULUq>AF3kn0xdT-UkmQ~j;Lg7!XM;9 zEdPPhW<&4N?J8KqI`^}!nb_ax4_c3edqVS;Lb!xicows_h5l#wfn&Iacld&HxQB=MgM+w;m-vJe zq`8{7iVrKh0;IRDIE?EmxdJ4x#<-2^Dz~=ljqkXu9^{MjIFNtpj0a?m2f2}dYK{x! zj~_XcL+X$Vq^mZ$luK%@5+tckIhG$Pt0v@605|ihnto!)c2vyr)ZTc`MIzAiFP|b7CF1eyNK?(KW4kU zYrDJaiS zImT!Fmv21BXSv6J{FH~h$TvC3m;8~RJjw^T%C9_+x4g^WILya@%XwB9ihrIaga=8AHV@Ho4L537Ll4MDfCsC$Uxsqi|moH()lsS`TO`A7w_S3nO zXHTC$fd&;ilxWeQDl0l9wv_48hSmUO0t6`4s#LvF#abm%l}BQJY{~kQ%_FTp#0IMJ zvq|HhT!2C)DDiitB6FJ`MV>`GXUL1*G>XQi; zAU=Nn_~Da@qyDT^e|{s#qg6D4&cFi^Oi;lE89cDM2O*45r|T@k?~e=r;7qApHVLGY zRX*9plk>XTh?hUabBGyCFd=IrTZkbm8(wTlWtU#8;pMxf0Q3%*AAjUUl};Kg(#Ru` zOj5}PC2Z2k$0*|^m+ZLfPD5Mxz$}neRw?ce5;y84Di<&MV-qri3uL2ODzogbje6wc z7R@qSrIQqw%u~-j`RvnAlAa7y(4Ua<0}xm=u@FNIiOD6K@W$&(l~{=B1-)GW3FJGD za`_{ZO=D5hAvQPCUa zmvJrQRTn?{*rcOjRnf#Pwf?Xz8&%NsidAcN(aYe21JM?jTNvKxEqXNxINgaUuGnHD z+07V2mza6#;*UWNS>%yV(%9tbNKRShm051NqmyBV%;lMBuG!{SW6rs#n|bcp=bxd| zS?HsHF52j$k*;azrF%-+>8GKN`eml6mfGs8v9_7&s#r@|nrX1fF5B!@#a{aC zwb^c)!L)~VTkg5(J`Qf7>&{#6y`#H3XTAXsTyT^8{(JDl5g)wpm=kZ@@wyj>`SHpA zDK|UvlhdhO^UbAB=W>(P;av35i&p1zjo~3(_0?&H=X8x(k6reWU)MPF*>TVPT+?f3 zH+9{C5585`duR7{;gL`NNZyNI_a5b;k3PYBn$MUW>9Nl~Id-bIUHk9BCye>-+08us z^U;sVbMj3#KmGUNFKK=DL66`5`#Bn)evPlk-~aTvx4)R(<9PowVD!{MJpt+r9tAw$ z19PVi;w^A#4Rjv_G03@eNRWaZ^xy|U7(x+_kc1^P;R#WgLKUu%g)Ma93t<>T8P1S~ zHMHRkahO9L?vRH)^x+SI7(^isk%&b!;t`RUL?tefiA{9k6QLMIDNd1!RkZ%%6|tB_ zEpCyEUG(A?!5Bs{j**OIG~*f3m_{|Ok&SJ1;~U`^M>)=sj&-!-9r2h)J?@c@ee~lW z0U1a^4w8_CG~^)>nMg%0l97#cUBto%G}j*^t6 zH03E#nMzfzl9jD=Xz4YZTff-C;4wIP0H0CjpnM`Fa zlbOwQ<};xgO=(V(n$@)CHL;mZGoAw+lZb>1TmXX@$bg*XH0L?dnND@Clb!8!=R4sU zPkGLhp7pfnJ@J`OeeRQ={q*NQ0UA(&!ZQXi0B0m70giLH@g3jz=Keq-8c~T(l%f^2 z=tVJ_QH^etqvv!%B);(uG=d`%Q%9tRjqE7s}+60H?YW! zNOYB~Wi{(r(c0BWaHEReFlk!h8dtf_m986&fj6c&*1GPMuYL9FU*Q=ED4qkSfHmx4 z5t~@Ex?rJ92;Ay!m%H7)sBwGv4eySZyyXQbSbJz%^RAb@?QQ1^dN>L9&X>ORovIGs zfzIa+j-^S)*dF*yqjXT>^rhUZXp zWIrs4A{#}>?i4hk)hyCO%OKH@Mr>nc2w_hrR;rwaOr-dcOS2l*>#gd$@I-Y?M|I^hP62M$*l(D1|=H!BP*))>$*<#L@wI&2M2nS&GBGne^$$K3u7>Y=$EMRmuR<(+e%j~V4H?<&iU4p+!x zcPOHMCtDreZ|ZHj(@8fg$E_|`rVGXC?qsVujJ!P!Bp-WCTe8-;eSgW0>8=s-O`R-KA@;Kr3^qk%GE&~TUz3PF-s>xjlc*iT%xaR0M zISW5ezf=9o4z6_LC;wE)w{Y*F|0#wAoX*V4)APnQZt6jAdZupMg>#pEQeEJVex$?M z=3IR|?;Gqy-&YdYzI{_C4a2SoSF%V#e~R{A==ns@rI@WB zEDr)DV*=I5x$G|7=*+mzAqHY#&UWJbPOzt{Y=%s12VqL8fUTVD%+HMQ2rsXkH1HmB z%yk^j1th@&ZLJ&N;U3a~%Yaa)ek{YXaIap#1<5J8CM@l`aHmL6`N}X2r)>LbNb=P1 z4eLt*V<`3Dunq_8z-}nN>~IhF>%Vr$_V_Rm$1C}8sP_c%5UUICc*q11u@RZ82X}}8 z9dQz4>kMxQx+pOdh0Du;{)i4W@e^eW4}VA!L9rAQ%My3U4NY+s4@(Yt2)0-;7A4EJ zjHt9^@fHuOwUS7)aIqKpO3Re!v3zkD02&#@i(X{eygi%2R7-LW3;Nv7Da zrW}eL?Xe#{3Z&u@jkw91z)76^(H{%ypb`rHw5cH-@*yEIA|-MnDY7Ch@**)ZBQ#0NwOqO@+46*B~@}IS+XTv@+Dz1CS`IaX|g75@+NUICv|csd9o*c z@+W~ZD1~w;iLxmEjq)gwGAWgEDVee zGdY!WIhnILo%1=NGdiVnI;pcdt@ApuGds0&JGrwvz4JT4Gd#s}Jjt^>&GS6bGdUG#je)FB-R8MPRMHkhS zQvRnt@Bj}YVi$}8Px0VT`twpzi6Z;}4|tSHh2l%?01v>z8b~#jQs))`0af`R71T5+ zfYc7|01$3rRAUvD;2|A^V^eR{Q-1j z=ztFL01$QoT|G8sRd!`rwq;%RWnngEWp-w1wq|YiW^p!Wb#`ZYwr73zXMr|o{)KjE ziMD8s_GpndX_a9%g|_HOYuZ}oO>`L=KU_HO|VX}5N5_jYkNcXfAndAE0c_jiFec!hU(iMM!-_jr*vd6jp0nYVeJ z_j#c=dZl-IskeHq_j<86d$o6axwm`0_j|!Ne8qQs$+vvX_k7VeebsmVec88t-S>Ur zH-6=Je(ASR! zS)8AloTJ&Crx~5scAFQco7?%D-#MJ)d7S6Doa_0V?>U|Gxti5kZP~eS+!>(ZS)k>a zpy}D5?HQr*S)uirq4{~A{kfl&;h+5`peuTyFS?*J`k*&Dp*wn^Kf0kqdYvVjqVL9{ zPa30BTBBE*qg&deUmB!iTBK*1q#=5uOFE}-+N9wIrT%+brGJ{GgW9Es+HH9{ZG0N3 zfm*4BnyHD}sbRXPWm>9fnyMe#p(A>ybsDR2TC2U9tB+c2l3J{nnyleAthZ*Y)4HtJ zx~a|jsoy%Pp?a$4x~l8?sz*Aj!FsFnx~up4tNR+QsYa~_o2?7`togd8uQ{=;da(gp zvHd!*8T+mso2$`Qu$hLiGuyB?+pXIgu0LC@T*u?K$W7+Rjl9Q^{KwCm#-rTEf!xAx9K%6eqBR`Axm>_E zyv4sf#$Ei%VVuCX+{?S1!^1qw$Gpn1oXBN-%2RyJ;k?b|+{)d&%C9o4ZJ(kC6weLd2Dz1M+#*oA$! zd0jfJ0Tbu|5SrxGdEy;XK@WHp5NI?)oP8&lArtbT4zP7Ytv%L*A{$y&f2iZybwU;7 zAl=oS*&)Q-c|zRp;FKf7-0?u&?OhIRq20l~C*YwI^q@`cRNrU)D72jpLe<*^{?mg( z75=?fgDohSf74pt%NGu|hp;^qOt4(1@_%U$N>%@0gIL*&2? zkX7WBz8|vT<1w`4?I2!tKG%tY6P~^gK3)&BHR*GkI__Z)I^N|ke(Og)C^|t7{=jqY zq3740>=oW8Tz(UFPVF)N?t!8g=s*u3mhEf3DE>eWkX}Mqz8`F14*I}J7JnypK@R+& z?|1$uWI+!0fOpXS4=kVSh2ro7fq2ke4?e%`|K8xMJrLv|6HdRsrvo17029*T7UZDr zSAOcJm3geeI2f&LEcU|{(`4zxb^tAFO@AQf_uR|kJOB7QpV0atd*f68AiyZsi(bF+xL5&VYM)V}d zlSz&w8Lqsj?hYP!FB7(0So0uCP6gA^shHE?&5c3(5t9SbARsxhiV_^^wBH^%y$tq| zqbusrtv90@yd?*a*QZ^_7UU&|k5{N>v%$JU=hoV?QLozSw+q);wnf>^$+O4K9YDnP z(k+_JjvYXMJXtf`(kww$ax_6E88zD-JF(L7@*_vp+{k_D*imP2>MX5?bKa?Q5R;r$ zthw5DX%?*5{>vIA6I?2~Hs-N<4Qhk9bTh{JN;uk zJf5t=drRIkr)qcePIF}szezgoqM!l2Blt-UoySi3=Da5d9tUkAM=Isrwv}YMndP5X zl+38gvvoUDnODOq~4neWdp+|&H zVi^?vF@U^wp&fHNoAB4rH)|t+3FM?bMW_@9La4up;=e)bZS(u#r7w(oHFX^ zn#e}g%bc)C#_LLjDkaCb+8X&%bK$*fT%ARgOP?Hits81k*_}&JDsp5pY*3V8LT;cY z!86Al2XRthz(J{*$FUBZG*y`WTt(iz+a{Qsx7B90q^5vA`JW%p>8Wc?^meohATGar zq07wfYOqO;@+;?l6N{wkv&{ylG09F%wM)T5*JQ^W{Pweyx81(o%o0Ly(ttENwX0f(m4`{PcyVWPpZcW)}66+m*6#emewbox$I-2BB2OgM& zFFxG`Nftm zTV+syB4l5_N@zm6p)i5YTcJr_=R%9XFoqaWAPplj!y6(bhdLC>_*&RQ9NI953K=31 zM`FYy_JfB+WMUAV*h47lP>MICA`O2CL?sq6i&{h?7rVH`Bp%U$uNF#k%TOxAuE~5NmekEmvp2hMTtLBl4X;U?Bp3;nMPQy@ssTfr7YWc z%Qxndj=Qv@DIbZ-^C>Zy!Bb@^;b=@BvT~TcY$Pa8*-T2-5}L~#V>CypO8#P|Foem} zWF(nc%{_**kK_DfIRkmlL8h~i>-1zhUr9?9+VY*Tq~|Q{iA#LyQlGr!r!Sug%xk7H zoAHz!uT0ad6pPe@RQVw05GjGIJ7x3O-n5~1ScC^Qmc98YFUek*1oD$ux$NnR3Uha zW)`oH)$1>(8c)ZHm8l(_EGIkb*UgXyQg*OcBva&^A1*OQ1_spw}Xp&pZ;ylJVkrrm{l9fDXWxiR? zd!}=kL;U9v2fD;GHuIood{#T>`Iu#1^Pz7{W)nyC(K?>Anp4c?ZEj3rs(i;#I891V z-vrc|6m?5TZAnv;1l5mJwMJNtNLObB)_9b4Lud^~TQdaLUDWkLc&$ZWj}L&4w8l_~ zjYwnP1lf30c1xHIMrV@*+Fg{kMyRbtYi9)8O4N2kxP3%#GX&g36!${N9Yk~g5ZFW% z_OFfUZe_4Li1D6x59a; z8sbBdc&aIW6N|SR<1Nv6tT|2+kJlRH8WDM}NuCjt_ZsC5QF*XgZb)k+{8sN!_qAv4 zo0?xq=CQWL|--hV9Hu|`cJ{G0hhUvX_`njR*6{#D1>s;@; z*S`+-u#0`{WG}nf&yM!At9|WkZ@b&y4)?greeQIxyWQ`O_q^+U?|kpO-~SHyzzcrx zgfG0|50Ci7D}M2eZ@l9l5BbPTe)5#ByyY*C`OIs6^PKOz=RXhn(2IWbq%XbcPmlW4 ztA6#YZ@ueZ5Bu25e)hDlz3p$0``qh(_x`-^z3+by{NM|J_{1;1@sE%E~FvO-w*%z%YXj# zufP58Uw*0w+v>{DzY?{+75;Zb0C;Rz7Zn7!YzF8Q2>5IYSQHF6Z4MYU{3n3zMu8HT z6A*ZFJ?C{U_kS?A5FR*yAgBx?*lr|fg7k)h7`T8d_;3x!f)D6|69OM5u;o_=Id2HE{TYM)-zq7>C^yZ`%T8mlk7` z7GyitXqX0wXeMQTNMwj;WP|vJJa%Dyre~S8<5jlMXIz*vpKc#Xt}MXXqhgjkG#_KkuTj)caI z*kg6(X3Lmer#Ok(XpHa(j`Apu^hl29h>z(wX8JgeGlq_-=#HzHj{w<^kj9Vph-g-I zkgaHo2x*W6>5!GSi3KVCk)}wIfoN&lIFQK5j^)*n=M|95$dKL`kr+9VC25GxIExF} zjg5$sohW1%nUc^rk}g@3mw1zz*pfIoKL5y(A=!>H36p}DlcczlI_Z<^2$UYVj}Tdu zvUrq6nUtRRk@HoR^>vl^m6iFmlpuMGN-316_>*Dzj!&tQQ3;h(8Ivz5mSCxoEUA`6 ziI!&>mlxQ`d6?Lkn2foY+Sr$4$(CjL znDN+{kXf1Yc$t=&nf17tn%SB6$dZZXmY?aFq3MqsS(>Q%kdkSdqUo31NSajHl~!4s zSb3XTnVVcmmID3>m#Rsdy(yAC37l*BnyLAl$r+o)DVKX`k#D)2%ITV{S&^bgJXxU4S)P3PpxC*c6`GzG8lM`< zpA(v(9%`Qvij*Q6pd1>M@R_0lT2*{#q6_4vr0d$ z8WOS*AN{Zj&H<<}%A^kg4|#A0kW;T0kqvdA7L3XvckrgORVjQxBIDW*_pk{RQK>8X z{+KwT68%6KwrZ(G(Fb#&7rk>2;PI#KY7v@XFZ~b`0jnki^QBioKiJBt+B%|Rfvm*p zvK=7{+1jrcu@voks|JAm#+7i3b5|4Re69n+p-Lu?M^mxpkWm@NgB@K@7xT2M{8;2_YM>+6SULx-aV$ zrpvlDQ3pwZx=2I5u-gyKVYFsdyCJ~`vzrZ|D=!2h2amC~#~Zwhc@$?;vod?MP%;&? z$_EdNya;g*v9JlMP$+*e2Y5TS)S)W$N)Vnf2f+HjQo6N)5C}`L2O1m*4vd?_m=1~) zzB!?<<+~DqkRDH^w+2zA{vtB>uq6Cp2e0du*9Z%8APWQ`vfO*YIROu;5UF_Z2@3ne zK`|nW>bwtO3ySdxOA;I^%(#u~AevysS8TzDyApGtxS_GLM`6S0+YkO6gu)`h4#bm? zF8UI6up6?$D&WB%dBCdq>lK)=EVyzh=z9mR;T!~f#FY{lg;5KekP6aD$3bBYuOS!A zO9!i=2eaF~7cmv^0x+-(zGd7IBOI`pED|Sty$><3n#;awyb`HH5N>P`a7++*pu{&E znAYGjc)-RkBN%|NzFO=W+pDfSOBp=jC&pn1Abem7HZTQY3w2-z^NPQ?9HQULwk5n0 z;|rT!QKy{D5q?kyQ%tJr7!r99u>PXC#Zf2hKnKfgo4a@vT^y@ls=x$+q+rp?e{3#y z5HX442h7mKE&ISVA+nmg3Uk24I?K#?>ddG6$qAvlMvS(Zk^UprY!UGr&n?O+Iq?VC zY!rxcE|eh$cag&u>&k}-7QsOo!W_cWs3sGOq(>3ahwK!x(G>oYA%8#zk^B%SLAR%@ z9b)^@x!Mnxe9#Di$_{-Ib1T#kff7xT#uHr=Ijkwck_Uh=EuHfy=gZPTffD2a2z8)< zWE2y1uo_58AU8eGEVHTvF|Rv(F$%NLE5QqY!7RG)9)94*RgJ-QT@-3^%LQx^Ia|~Z zu?KfB*P2Gk2cxf(^0(tl8?eAXd~l~b{T+6oD4W{X2jL}i&$U@URL3Ezivy70gh*n+@Je3fo00-p^|x%plxn zVam|Fp)HIMw~!sW3kZSW2N#mp`)t=m(Y#_j&Fy*N06rF68pdPY5n-wa{%zr_$>0d_ z4yxb>ct8jJ^9M++*G=jb89w7Y8sMZm;90ukikad#p0@hk;ZGXm1YP6;4yA+5;Y%Lg zIqtnjuH#M~s6*Pm9zNtk&g52}<@Va< zG}`018t0hFok~vTXCCEg?&f+9=WqVne!1rVIp>_o)1X=Cr+Mfb?x2Cr<9_a=eE#Qn zZsua{kyOj_MZ5=!%)>3ZCbkzUQ*u z=a6octuE)E4&<~R>6;$wzCP)Te(9Bd>Z)$+sgCT#zUrKA>7st@%Kq%kUhK&(?aTh_ z!tU(Ue(lyC?A-3@whrpRuI9sD?a{vN=HBh-{_VW}=%L=*;J)kPKI`&c>+Bxx)6VMT ze(u_y?)<*)^xo_EUhd|J>vTTohJOC=h@S9@?(OrA?eA{y@h_k9oed9Q?i z|4G`sLS&e1$99E^pM{LSg^u5akpG2}ABL1ahL&H3X845fCis6}YCd@PcHe5C|M@`J z`GX(&c%N#dzxrF3g7-Fq7yeg+G(Bn}@BZ%(|M4&X^H2ZvZ~ym?|M{=~`_KRV@BjY~5XuA&Bv{bkL4*kvE@ary;X{ZK zB~GMR(c(pn88vR?*wN!hkRe5mBw5nrNt7v7u4LKL6)$Go*zse?ktI*2Tv;eBRj5vF z=G@uyXV9TVk0w1Dl`2{nt-b5l+VyMLv1QMu4f~xnh^uSw=H2`C?cA(=4=4T`_e0&q zmHP&cT=;V6w3|Cj9^Ja_^l~>a2NH8k+R7B@Of+Rv6QLxRl(WMo zHyUzIJVA_z$2Rj*h|e~4LlnX}?|XP+IVC1}$%>6lC|g=rX8Bf^Sq_=InXjwax{*&V(qx^9Oc~jj-3?mc zp)D?2WrSXaIq8>k?zu#spC<8VWse4$X_>9A8f&4sCfaMGACg+hsK@S*YG$=g8*HQx zQu^lT;D%1_<(xJfzOwIj4{c}F?wjqa-EP`%XbI=maBm^f8){z{|B&y(0pD8itR-KY z@~$!eTJx|Sa{TeeKgS!Qw-E=|ba7E9S9Nn)hu3v^6&HPUj%KIbq0%k?oAb5}%ANPX zeIH!+$UV1x@6eAg5Awr_Zyxx`g|8g?%calU`pp|szP-G+4~_Z6oe!V--Ldc7{Qlkx z`W^k?8S;MlbXyT;_2Q1IYYnH*)M_q8y^76$G_=0 zFn2N`%j3I30Q*&E^cN|?TdTyTEzQ(>@3*S`=p@PzFn$ogiu zzZ$~uh5<}r3%|!gA8uxYt?M8WKe)gcf^dfq%wYtVIKdtU(S@~>;uLYG!zNZRizM8l z3A>2Gf!OeiG*n0xt*8+*c4mmLDWmrcZ-qDFsOk)NO=tp|NE|P$pq#)f$$Uz!XiHKxk9`)$R0YcJV{*oLeB}-|^ zKw|Qenv^3aq3Fp*^3jK)#1|=RY06uovXZJyB`XW*N;<+4Pn_69F^zdlWF`|7CIY4W zXsIt-LKBzL)a5C8xl3PW5}1b+rjkGbh&#|hoZ}>CIn7CjI^@9;Q`XiSaEUJeAXrpfk13zvANGydi6T#kV79Ti`m*_LJoH5gC68ShgyJ4q(lOQ9iZA* zzgG3C2W=;wEHQ^oq>HB4!Nn^2p$AW-V-xpKEnMYbja$e;7mx)lZ}fnP&uSKo0_iGs z{i6;!_#wL1y$&(tum>!qLJoW=uJKItP1n|84^r(6An>4v+;%1ume2zpFyWcM&h~7z zos%E(@GFI4LJoh>gL~_ci}EJcHL;LGI&dL}T`*U=)_MN!c9l`x3*(Wy_qoS_EqtGB z@Szv3fyW%~kYJ{M=$j?o18h6fhdR(950?l9XD*=!bpFAho5^orGa{`!{NXc~*u#BG zw%hB_!nAV;L^dS6VJ=SCj!^cZloLti>&)Q~A5IW2zKdc;ddR6Pc5!Dek%y}00TVSo zGdgFCU)lN?BXbIb9PE5&BVU3J?A;6|^e~4##1~~qj!rf*;aWQAVHLy`nOdKm;hJJO zIYc1<*ta|C|?qLq8ZM4`(v|_08`7@ZvgPSqIYFF2|Gd-rQOqKKr zOXOPD1}*JoLg8LI@IlZ==IVU{QRzK&;tz8`aQ>+~T~xPzl&zYO16m*b9|rFM)c3K2 zwZUxV<*0)XbMWoA6H+3*)`732X>%R$fCq8TSk|+SbFH)bt2@kAz<3z;oD`Z3V)P>q zoajeS%?)WSg8P+{hK@Q^!6ut&^d7L_#kRSlX^UTH*_M9vK}u9oK9pHBn`reo@nDI0 z(;Kk%7VMHRVb1$vq7DWHg&*!<2S2EK(8c!8A2@z(4I@0t48O9_t4#Fe*f-BYt&4Ky`wOV?eR82g3s!B#y=MEFFYDBJqRtiYm_lr-Azn`qDHw zTe+^gx0#B(q1!>tvqFBdK;EFVpF6n!xCJ{nF&+GmY`_EU8bklUg*&LbA#6S+F+w^Z zt$zCi-P;UM0KpXG9{zeH0SrF5`@`WQkXX=zAG|^gBf=t?Ke|%A^2kH;puO#BL1}xz zNsK}A1HGkcuG%1mJxGN@%t9>8taDqEF^j|Ko2q(?Lc}v8Nkl(NbVW;qK}<}lS$vI5 z@B~<_Me}<_3q!=Odn%LC17RFSVk|~ubSbS^Zq=tgcdXb zLTyS%P@KlMTSsbi$C0{(S35|AOh|>q1e9YOe4HhHq&$G^y@?z^fowa1%*Tgxr-;P7 zbL>Zc)F*#5$BOjB_j5yLTtyb_NOg2ZmxRWPq{wze$ynM*6(UD8d`WiHNop*~eXPd8 z+QU#{$$yMVi{#0GM9SXFNQksa4I)aCG)j|%Nu@l>0%S^#bV@#?!k(1MpY%zI^h(OZ z%9|8QXM##}49Q;7#I+pBwEResRLje9OOOQ0lw8J|Y(}cw%bn!QuB^(UBg?1M%Aw@S zr1Z`TS`%l@mRNmew=ghI=@1WS*k%$7vVrF6`dB+RokOqm4CuN2G56wNCX%&nBd zyle=|EK1M}%hnvtlia|d@<`hopBu?by>CFz|_ofgiPj6FuUThoF=vu@r$|QXp|sWq{Hi zky0wf5i4bxEX|fJ9Tq7)2uukgCEbWPF{3(Z2n9TqH%U`cSyPsA(`C5TfklvK5lRZWmqRftRVp%4iP@Gv0s zP>oqF5Ip6QU+s=y4U=KL4)0)y>Ijr#HIrktj$~bkWi6CuU6W^}kZOgK%-~hjunceh z{Z?=dS8*LzaxGVLJyS9M)ic5PR8eOGvmS9zURdaYM`y;pqASAE@Ae(hI({a1hu zSb-f_f-P8sJy?WIScP3!hHY4feOQQ%Sc#ojimh0Sy;zLRSdHCSj_p{F{aBCCrgqYmNy&Jx@h$8i&BX!XjMbXV&-SzCf z(hc3E<kSchP2l!LUJDc8&%xgT7TzE|U*Mo|`OI;w@I=xn<)ZcH=iT zVgg>@GNva6eqTIpVm&SuKJH_PiDRjmWAa^M^X=h6UgJ8(V!Kr2iD6_84&>vVUs*ik zNiN<)MwLXyHo^j+1u4Fofw%`NGcY3RrO1VG>eKoGf9=4dPS=;YOBK?Z4=cIN;_-!{{OWNc)g zCgYce;g~M!!=-6$IccTE1U#67$8%~HT~X9EYM7R4_@!zSR?(}@>aCXJrtXYA_^-~W zGdoMCrDnA{u!9!cIf?#JY8GpYUg#mV>YhpIm4*-gtk!DAW9pU`k58ZjIpDv|2n0H~ zgi8PfG>flg(`olAD6#=+01j)ures&vVzWM(`Rao__`4D*?6gMguI`Y`?t{0c1I_@2 zIuJ6c6SB?tgh1Qur}p8f{_L$K>v^7-P2dANm;*gE|AeO_+mAph3o??o;@LKA?kjI;oBBZ4gFix?P1m&?(Q#1}0Mn zV!(r*`U6j}hD`7*U9ba+`-9ZN1v`)hV&MJ*HXLjFZeyF)8BTz)(dq-L^AG_4=>ZoF zo7;>$D7(i#Eyn(?WjgH$&+FmcYu1GY4|fd>$C6E;EOuxOVz7gLcs1C-1j_0MTF3+c z6>j|I7fzt68_#haXKo&E?f1X~*gl0n*t5rWa7&nMyFLX7&u$4v;}8z#J|Egt(1SdH zg?`9}I&ckD(5_n8gF9%oe#kl4IK4ZVbRVqm(6-~z=9f*d@w7wpG&k%uhffc&ggd)4 z+*a_-0E9VszB=3)?e1Uh-rR|z1v;>XY{;qB$OJ%O2RleDUZ8_4-!#|21kbbP7~kU= zhnP*@??eNHg?x5se|CTZb*>im4*uzb!ISJWb8A#T1yu)y+vW`2_Vn#r2nzS?>h%Ob zK(0DS2MzawU9g2aumx+V11C!bV9y0Rh=pDN1iMm0TF3@Y=tA)o^JM3jv$L}~m`8?h z_-&j6YFFzX2aP-MgZ66dQ-Ex3KRrE2^*P{!Kya@+@bB4sbtX>T!?gw@9P~oBgH)Jw zPwWR(IH{|HZ#44*jOvF~Kr;~w^J7QkgI|}kn}bp>dZRyjq(}NhTWaTKbMuh8G7E(} zfNi*z0~15SK0`CRCiikT_&bhbk>=WL!18hS`bX%Ky#(3r@bLXx_L7)1rmI2X59)m=51E z(?5M994*y{U3>Q9J@<10fd@M{{7B|!+h=mhbDXq4Zk%I8*JsWfWr+Johh4~i?cW8@ z2YaD*jdvLF&R+g=hu+UwcH~y>vJL)B4rE$5`W*CrpE#fla$N`$C!Bgc*kF@o$TawN%;CP}8#rE;Y% zUMF9|6bVvU%$hd-Z{nPZb0^Q9K7RrYDs<>hokWkuoau2X(}bWtfodvsD%DdnuY#YeJ*n6%|(BQE`B`8 z@Se4APj5Usdi7MhCpW)YKKc6brRQ$%em`dRS@~}TA9MKGMxT8L&Sqd@`T^J=U;d@$ z;Cq@qry%}f79yD8d;})=pM)Q_2BAeDN+sZQ9G-@uhASSXVqgrC7-Lf+jwqvF6nclE zZ#uHr<9R%S=b?>5mPjK-L~>+een5uiqK{9OyET832m{{=5*|($tug~p2|8q8m3WN zOa85?-|~iSwlOm6X}3X28!M&a!dq>-z(#m3uiNgrZj<4%MQ*%L`U{q(_VSnRruxSD zZlntT+ptLiBQ-F=?iuVT!h$k9YsL<94DnGCPn=%Gie5bGyw7gTal;)f!@7(uPu)E5yAG>Jy< zNsFtrRA!BH*32Y!a%6*KcGUl(jgi{AwSAG-T7w8Sqggx3_0hXsO*P+GRlWAKeP0y# zX@pyZH{Ag0z2`29v#H81#1Uh-Xzvh%Rpq&1uDRucm)iMNo7*P(Oph0A{DD>#VcYli(1?w7rW@iFM=_QVjLqG%V@?kqA`tXTq7I)+vvtO!ZD6= zoFg6UXvaI^F^_uOBOm+d$3Frxkb)c}Aq#29Ln1Pfid-Zk8|lbLLNbz)oFpYHX~|1s zGLxFzBquxR$xnhZl%gDE2ZLwIQ=&4Js$3;2Tj|PI!ZMb!oFy%5Y0F#UGMBpCB`CzbGniYWgr7P+v(1C!ZV)nTxUD!$xeILQ=Mjjry0yphJTKspJOP)8OmUWF$DCW z3N^zS1lmtAm;s_ONjLs_QH*}U3tZ>|OIzwv zmVSYyT<`)Iw4jAAth5VWNU0XK;Dw)VK?^eNf=#(#Q!QlS3RkegQJY$YEL5QiTChS? zv!I2jMj@+7y+Ts6U)YP~H@LHf!V^5J zS>qyi3oT{rWU(5Br~)>sRE?@qtE*HiTmcK$1*~?ni~fc0f;YV1b%Pt)@LlUpw+hyk zt`(-+Uaodmyz-szeA{4O`?3MQ_q}g<={w%?wgJHV9Wa5};087zIKc`gFM`R-;07O9 z!3{R>fh+8WH#nHW7k&eWJB(ouJJ`b?2C;=5oM8!{n8Ff9@ETgoh8Dv(#%GxE8CpDJ zHPD!z_>?D)d+g2~tJ9$PH0T)SS%!fg8KDXd=olb+P%$J_q71Dlm8lF;jfx?oVle4P zH@ef3ZZxD}_~}qPE7P2MAq-rALKn6mhBRy;vMv2-Pw8yaGvE2Bd}V4=Z5my`wpXfE z$ZA%%uvMr+cM4R1D_M7t)<-*+EMkd$%ktu5n+AT+g<-vOOjAbE{z2Pg}RT*wrp}-y3eF`WL+C4zv}pVD9Zg7rW>d zuX)ogUjpA3!2||yx(5tk^5T2I7>;m)P0U~u8#v(wUpRv~eBly5+~E-?FNsAw@DLlk z;1OQKf+0NNg|j%uGNv)fX^i6;`*@xyPq{r0s^oSa^q&2cdCZBN(1teI$rFueL?LY&=Ry;e;s zQf+G0t3sCwekSx1qEJ{*LpQ2mokCl6umiM~bqA4-^jQ1u_pwf)s#s|8c{|NjKUcxh zhlK(Y7%ys5Goi9j;P$Fn4eQB9)~9Fg?B$_8W+;T#*S@we@XomHpdg zN87fmS3R^hOKq24TeDDSE@LTg*QZkT-Pc9;QqLW3dmDeL+`aC&(<|M1gEtFnuy^#a z5b%5lT;1LcufGKx@ci1>!EFG!hE@D=6hrvo6~-`yFTUXoOT5Drueki*|6ql$n8o8S z|BKZSa*>Z*$>G?^ox#fS7?A$`*pB_vktNwaF&P>76Bz`QkU=0jxts+y8IuW=lJ#8A zL0Lp?)RuvPMO9QriImZ4S(b5`Mire%F&ztzSr|aw)a9O;v6&Qr!4*`NarM~_YQajS z8seFq6?D~BF;!Gu71|M+6sTGhh#gXW6=2a-Tq%JLNP!hDf!^s|-Z>g!t<~QR)>BE} zcO}(#VV8PMm8DVPsWCwtn%Yd`(O_q#+GM#Mp;eW1sTX>o z;_wxpcCjLTd6&GUBL4F!Rop#ae92d*`BxTv*Y)vYc)=I<@t5~~-+lpH{+(Ec0a*S~ z*nWXuh`As9b=Zs5-!vNB#W|eEB^bv|n2S|dHgeoIzL<-h908Kt8q^q#1(^Y=<2%{Y z0!E-ZA(R9n)I9FfKe^mI9$7!>BSKLW&plL?ji4By0T}$;L~+>(!eB-Pl+ZODMx9ie zffPxJ6z)kKC??k&#@P&3off3QsX>-<^7u%Mnx_RGRY^fv9oASWK@uvIpS*379?8Y>>-=#$>pj+~o`D+lQvvRi0V1G}{gXPSV+0o2aw-`;B2)uP=RPu2&W)fxdLTswq(M#; zLz-04v0zCF9U6F4NV(udju}QtWJvuKnPJ;;0pV409b;|Q7NEfxOyypxT7N=U5}I9K z4O;L1QC>?*S62a+@+qE8+Fec7BoClfqm>n-0bW=+rg!P$U=C##{N$pET3d}(8@l1- zQJyHyA!S|OM@H6XY2_Y{)>jT<4hR9TiC!U^rE3uzTe@X%rKMW#7F^0@kO~)ZUE8dc z8LU;^CT1RAb{n82pDGsLlWwMV9cFhuDJ^2D*hMDwf#w?QA2YT=W)|L*g4gtUCNW;0 zfIZl3M%bDT9R8i=8*n3PTG)p{qlmF7!V#Ru;pT6;7>ng5f@vBX^kz5)Cjbg($*m(h zA}2c@Cp#e-lO29!K5lm=?&c2?O$737wUlnNT8cxF^djjGY1XL`QpPB9(RrE308 zC0AwHAswb#s$GE?L_y<8-c(LrVG&vqDwS7B)fPZk6DAhrMOUX4p|^omTcy=aI_R@1 zrBX@(T!9s}5}`?wVS5EAqS2M8Nvo)dC=*CQ8{R6Z#p;P#<*bI{l7f~Kh+YxQC|C-C z5Cq$41sjbfVj|+`Yt7}4_GrKQYqA9?z}gmG7Adx=RI^zn=1CT}$(>!fm)M-`q}AcuBrXO zU!Iz#G9H-!DOjJ5Y?$t*ZTcyU9jei4ni`-18qgR+om@UC=Q<@P%he+T&i>=o9#oQ1 zYC>selj);GL0Q;>?WT%Zm~kh1o)nm^V0w-eX2F!Ij_O3Z6l8(o!h)8ovD#+&p&VMJ zsI}x3q`^~3Re=&NVlmcxb=6=78Wj{)Sv_k_YGH)p-GnN^U{&rEXn`7>YctjYw&lL| zDDYk)S`Ms`x+QVZU?$$)aY3CX+U;ICtj7{z@KqP5{c81E*H+D&lxElPO;=r=;VdE= zWK!wohHROBS7+{5$!ecw%2&(s;{2i}F}7*?;T!m=rux;N`n_g`{;ff6+NJ;(od3mG zIOdl&24`L+t;h}M0;7RBmK@5d2{@|@UiDtMkJNr~VI zGF?c4S=@@$PNk{}v#{LGAl-7F-QwjAP8RfvB2`W$w<#7Cq(K@WTC0sB5CbuL2l&YU8J#<4#X8<3Dy#C?%}E3V9K2re&|?@YZ5r+5-?>OhF0pfA?r4Q zR#KMKNgimuC}}ytAOc%hie>JWRuQ;sS^Dl-4y^AM?^_-(^6n^+=9a{G zt&{!SKT=sidf?A3?UrejNR<>qj&pm?Fx$G|Po)&9E|(lvrB%MM9p3Q5#vvOTmJ$?J z6{LX}5aFsZAr$axf!fuy9#-HD@m@XEQmGvkxSd;F@f6o&TJ2<5RpDG^F&B>^`CjWM zgH={JbcmX95}1_^i0B(PK^v+Nv5ejTws7hM6GygB}+6hie<1)pLXA(Uq9CO>KLJ?vj* z7x$9#;LX=5*V`>_AG(b)E7$Tc&N6{{DJ+X0W?rVtvgyUetjy{rpb9XI0qUS4urMR- z0{>=S-I&s%!8p$(UU@1usp5PK($jm?$bgw)IDA**LEPMKGcjI9n)^A7!>3R zi!<6T-Kn~uYO}4|s&hKKZ5OQCimK$o%Cl9@VLWdEuL5*p2`fiNRTGjZVg+;*bgN-y#CrWPMa3Ks#Xz{Wn2z#@9wl}3AOPKGJ(ey zZyj}UWtMT(H>!oAu}-q{EiOj`UqVNz_iAQ`XEn#3A{lPgSku>jrLvWJ8W!*sc=2Lg z2cyb{pNog4iUC+Kv+T~c=FS$}pYpOU-=;VIsf!6VVH+)s9rn^jFpZfbY0sF{>R6Ax z;{pDd%rWO=$D9Ka8I*A?LN!!FjqNo*l+YcWKnfku0bL8C@I{H)L!zfdDxF3>9cH;U z45uocuh~ax-sL3$<1Or~#p)Yp6{!L75~!LLEY@z%p}4vouQuUaNkLUt0hMAGuu1_D zR_j{n-Lr1`4p4y^ut85|@edQo=m4+jT4*7GdgCfh zMKbH!ZRj0hX^Ca9*KU8)Xt33*5sc-5pWcBBFCg#NXS+%l4Z1S1-DhHT-rJJXzbrGU3Fv|NberCM0AD9kU zU7I!imKXbJ9BF=Bisj#4yVx)fbJ7Cm8l*vD`{|6Wfs!*VIidkWHTIQPdB<09l`o({ zMKfpfIzyT47B=w`H2e2H)KI9ppwdb=w^kNSe2j`V@-cuMXwnM*UGz zZb(mPQ-(AWB*CqRtBJ-TJj;C@&+b^#?!5jQjTZYM7NUSF``;&`vH@}-KLPV9I8gJn zz8+g})!?hK8Rr3E!~SqzVkwr^6}u~I6Duagrh6~N!&3iTmZX4pDN=4BkC_V@DL+^#49-jFMq`| z_8Bntka2u7L#<;Q83S&%l4Z8b?PEWl`O2R`$`_>2dGmJ$q&SQ<&J>#J?>Xxe%B*94o1QdZxm@JWUP)ZbqTNECIqA-fXgi)qYnP^c8 z6)I}7T=DoZOO}dLmMBrOWXBFAI+UbbsY8cLmM5pwoFZk4m5^DiT-h1Yij^u*?LFY0suRd^hjm*SCKk{+c!LtLN9R zCO;nYq6kYMB$g;i z35XJ6s3AWQf`}-K6e@}}EqrrMQ7ect2~wD1k_o1hbl?-GB}kgWxu06osHTVx(m{%( z{;*;qi5-y0fz_o5a+3+CzT(0vg1!n1Pbi+i^$E1(T8juF=o$hpw$3VoE@Y84V%ff& z&Fd~_4|@W#!KQs|F~G2ujN2y)qfAW71QW+GxUJN_^>ue|K$18+Vy zw6kwN`q&_YWc>WouRHx*-p@gnT~2Tf1kp&N!8Ib>c|ry){22`sPyBFbqCY&k=oC=| z@x&H$97DqwX%z6r8FO?|NFs|AQphuSym0FynFNFE13sVF^pl(A=q;QmN4p2tYaI)n0LG*!3b6i zJ6JeRd*;(Y|Hy}f_<7HMTJ|!R5vYVFtQmqFgtMFJ$AuC4nS^90p%MOVsA(b6;fKu7 zA`dN1X&~}Y8D{h%sTGlGUegiQwB|Lh73qmxLsEpcrZy{9iAqp9o7=L~wkVm2ZePk0 zn7qIyF@}pxo^ju+lyViRyebMwP{J6z5EYbUVNXN8cIlt3(8Or zn?|%A5-mg|`k~U6#-Snl&_!0W(HPE9HK|3BNnG37OnDRr9xX`>OR^%{u1KXSxeabz zBx9JuI7Tp;Aq`sCLKnV3x4dnERuEAWs-kkrCam%#N^pu2)If%tyb21Gi-Hyu@({_r ziV5)3RBEbl6M0zy3moYQ7J5aik2}ckfTDvm5u(;N=bmxr0#qgm6D3Bw>BlyR!7Y%s>rgXhRDWQ3O5cLOheu6B&dC zqt&QGCnXUNTXZy%4p?YIJ0gvWNW>b&G;CQ5l1z_;hA@O-K{0*O+N{W>w1vToKy@3K z(DtRK5>;+c{n8f15QfTdrkMiaOhcrg%Hz562u;X=RJ?+?sbED@X0Sqy31X14Mqvq6 zfCy!?LOI$I#UL5UNlzXI*WTEKPceC9B()5a+llUR{%_UEzl2g)Q5}SJdy>LZ9LqZ% z>=@3%n+lvP`^q|l#R<%-OKFL9OSKGP2yeMd_RfNYBm9zC)JqJswC5MeWQ%;|Gheqd zlRnFgE4QDK+~g9{F3_=+t;SWCYeu7}*ev%qqUPpkQq5f46la~%N#Hww5}oEqx7P2( z!ot)roQ3`Rp77aq1y3km@sh{8?&%fgZnfXbmYCYR$AEEIO}v>pyUX|u3hSH2CyCbr8o zxOwl8N1xrP&d2)W9%rXFWg?t*3a{Pz2Q{?639=c_DwJO)?My=^y&8-{l+vg{ZHEU2 zDG`AWZy4pMM@$?8j*3L2CE0Xq7|#B8lbqDzow5z!1HV$->ZZQCiOGy}SGc92pl~#v z>*Kb16;z;dgdAwxjRax;-w5LIv~K$3BL5>!Y~sg?l%^x7>3ZkQNC|i*%T_K+&XC8Ic4c|cg0$emmWlw- zUeE>IB70`=3BuqBfQc>4u6oign0S!2szou7iM8Gi?zp8~EY0q63pDmmA?n3l25<04 zO*b^@HlVOHc%!+($+_0)x!7s(aP21`FYdT@e3PJJwy&wg$f&?2#n32?AntCU>fzMKGd$zt zz#=QyL@8M1cTmMCbcZPr2d%P##)$09j10~CFChepHHN|?`sWH11ylmdBus|~O2_7A zf+ZY~C;&(_TrTL6KpEEzE1be9nvQomkar9%1fTABE^BzEj_NQg&-9Egu8s(_jvsSL zdx9nGyw2=;NtdeU>%7MYe=ss2Et!U?2qmNZG^6e+Be&dyw+5vNo$$Ei=NY+4BaF+O z=E*j!a5Vm;@C--`{=rE&Kw>&}0u06QonUedC9m?11K3<|zOJo2SO$gUu)Wrc4i74! zT#xniqov3o5CxGzaK=Jnh>8x;iSkQ_uEs^2CPtvf5;>}*kVX=%hALkq`NjssxaLP7 zq>6G%4ALN{)&?z0@%pZ)6w^S9-iF|!gbTuCjL>9mJR{C6$0>d%7p>@QG|?BkX(P!h|?ET?{CBh(a$c7jf?SOSt35U^0>QF>q{SiE?tIc@BIhPe2J>9X3SG`DkVazfj!V^g3sm66kY0mdt}uUC z1Gz+lP<8_(0&qBrW3Ixk4UH}3@l`8o(RNj%BFq~5miJdt1NI(4&qfN;>`H3CeUms{?8*tf|E#s zv0DD3=CtwVRKfyDLNpX*o3tqlsNf|ua4JlxHb*IvK#)~hNmA=^9xv-GfHRipf-XKw zwD{4Mip4p%ZtQvx2ThCYy63c#DF}s7TdXDS%5N)9My?qPrC#VKKGD-% zK$11~r6UP%SVtpW=<_zp|bkLd!K5lghMOi(ObA};)(N(;__475OU7LGE^Xid^ca{k`r z>F}f=P$gD|ad*!2RLF5~sLB}kuf_!BaS$T0f=*s+qBVg+DBh}0q0EtHA|8&`)C#YZvd`B2L?v#45F_QoRdq=X~(Kp}G=?qP>stzsgQByk$mqrV;`b?KL z)gOt#3t9kfTfhsLrI$!`IvFih-;Pz=E-`2e)8_8B0M|RGYGy@6R7N73>cw(AGSt|G z)l{uDR>QdB6DLCLoCI(-R5G04>D4Ze)(~VS4V2b=0-SU$Iw}s2aLMYlr zPaR3Gj@D?6wo)Xekt&x8v_MxYFjaPdDI!xTfN^&kbCh!615rtaF^)Ii5iMLPF>Y7| zOY3Z<=LMHjF6`n7AORfA!5qM$h>sW&Zt%3Evx%c+RrjLo7!rK^wzh0bR`a)34bziS zjy$sojO~Y<>?b~xi#0#TQ7GXX)|idk*p1y-4VcThI2Sh@FRq~e_0|B?B^5|?ccMOL zvN(E;TOYIyT8Kanxm$;FzOKVu%e6ui8C|n&Lk*-t1jJoS5u<+BYibV-cu$CGBw#t} zUztWLIm+B1k-=69rfRCio}|Kd>PfQ5VYNtn%SLUq0B3%R;7E-7(1?td$`!q{tfUlU zPmT-RM1S|@P1p#n;E}3;=Ty*2aSS4?65@cZ8Luo*&4Nw}uHYMt7!t^H0{I8j+(l1i z0+O;3X_aB2x=Z>V{`ii$Jve3~l!@ zZGZS5Tc8`d0TNmOdy1e1AmO1~UP|n zW|F9}tDPV)sj9W|8u{0(!&^mfL)UAo5y}qfkiKX)lH<#)(^ZCI&nbOozjnqGBgAQ} zGNtDF_*gXeOiDxY+Fof?YO?b93U*=3S4q@n!;bWAz(5rtHex-*3{a7%gz8MV;%=NN z#UiIO@NVHEu5U7}FyW*aomnY@v7Z@L-7|ZlAU$}Rq!v6h!b8Eq*>3n54w>AWk!0UJzp`mA? z7uvKaA+|}ii6H@}39^a%;_R}8AvrpvMcOb1qta-_nc4@p29vjBQ>^PoHZn5FAba;s`+@HtcxS6dhu*>tXa1~Plyd1grQ=W zKXx*q`0$a{aCOUiL;LGO@+*dL=B+VGicBIV zq0hqlt+2&cN>1@%9d>-vAVaXAOP17P>4vDFG_ylC{9a5-*%zw%hAZ4>OW&k;pum-$ z`7x!IYL@~k*mNT7yC@cTPg(#RxB(KP{@|t|K_hsgCuCaYWGkK9`1BfA zXOBijX_un7LmMj6G0vLcEcBTkQAyI>@lpfY{my~~p~t$3I=6+G1Y=e&wlcg0aJwAuz!Q*;@ic%oPf^28=chGX62SXAK6iD% zAz@t%&m)*sbn{qta5+JmT92Pvfv~+`WXHiDJV7zM+U}Ud6L}Biki7~dKyVViIQ+zY z=92YGLYUGm-8H5xIi~*5DyK$3^c~)M==d1Sz&ff#;_YgBWJhKSr-0l^_>GnUPHk?6 zr~J(e&>$qv*QoH)Nh1zpGrNrb__B=rG8VU7<2O4ObCG1bVzVW+g-dD9bYNwX04fT? zacCCJFmScAfV;mz4IZb?2Onl{>n@7Sr8tALqg?&;si|{RM9tqYd&PJ6i3R^Uq9uqs#jT-HuuK zR@T>UETBnN19u|P?;&NAoe1mmYhyW1fAJ=YzGTmJB)LGiRd)ddV@~hfZ#O9?c@T3~XWl)n zha~nGL`qCCUL&k5L1g|zYJB&Wh(tmMm#u4ic3rRkBpEQiX~|DpN9Mq@qxvk{uv-@DRzPq)C%HcIa5CM2Sb2 zOqM8FsRLz_BuJ9z(7E#FPM%1RN>zweAw-B=#hP`9 z*RM{xLCQ*`NLI5(ilj|z7E-saU%iqoYlLl)yLIzAagsOh-M?z<@-?!zuwf@p5-U#3 z35 z;l-y%uU@=+_vhcsZyz2#n)~?gt1+|YjDGxTpmD~41fl^(e)oZ);DPvwfrf);h#^LV zW0X1Nkwqq%+6C6Pl(Ip~m+4ou)Q=T1x{B-#>rCX|s(Ew%7XLsu*T8bS;~g4z@nxn_k$ zq%HBMOn`=T(xo|oG!jiMb)-<9ORS_4O*;j36IDd%l*AEBQ56)ctr|s?tf)!_M5{_| z#T8d`#pRV-L(EkcU3jTQmRP>ZHJ4h<;?>t)ec1(AV9y%%L}801R#{_BLN=M0j-e?o zng}8E*`cJFR@y_V-L@LLtU<)kYY@4Mo4Xh3W-o2RU4g}Lz-0k2amHcy+;&=|5gl~h z6(^j)++~-=b`3A*UKVL!T%LR1fj6Fc?DZ#J8}pT{UVY&ChaiG$kTKxO0;(Ldf%z@| zs9=HzI{2U&XS9fh85Wkoq0k_%*rA3enz$i}C$cyqhZCN0ql6Fk2u6=z^cdrTK?)h9 zkwS+3W7kTStwoVgHkoCZ-BKAvbWd`*_LWRJDdw0=G(jfb<1%4c6l5mBW)eFLr9%^V zw&~Mm2`zyTpN(UbP!^Dw^Gyq&b%ba`r?GpQMvep8QcEe3WRmGS^gyZ(qdT5NOfr?O zQVuuOuES7;C#9;JwYnPAQ%cd=J5xj)q1EwR1(DTNL?jCiB+AZJS76L$1qnEE#U*T6 z%~CJeV15Bc#9DfNe^|EKLeW@d-ZmLo7vo;mL}r@-UT$cIO0no^^`^EjytMw24R31W zzkE4_T>z}Yz>@PDh&7Ob%4yEQ5~i@{NUS=+aZLk}Q?U+mEMps+Pk4?4ANi!mV;nf@iKv{D4C5Jd<% zz=~Cl*Olfq&nm&{f;qYnEMfiS2*tV!5g5WuUu}-}@|+8FuawZ-BGk{mK=ENqxpP?25ueY!ih6%7!8Utxahdl^aE+s|x*uh;b$o zFbHZ)Up6FiI>^Tn_>cbwCrVKv>Dv%7*P$M+l5NAM=;eBXCBNcrpLr^Ud8Hff|o+*)O zN~~&!X4FIp1t|<@7}D6lc116MAq@t)Vb{V2h9Z3-j79od{*lfG8MH;|eN5s~x7Y|K zETs`j(!tV}prE%s?(H&A8dDT7qZuZcs!lyYq#@;$lh@s(aR|v9sMIhhN?2hEFKJ0a zl#r+?ct#_*IZa1QE0auy#8RdN0uWZRsZp_RbfYw-EqBY?Sq|lvPl-ycc6pUr1~Zsj zSsq-PCl?_wL4s1Lw24s%rrjb36L6O7Sxy3%t1Bv zYS+LpqX#YZK@w6?(2U3-GE6nA7!ukTlDNdB6>UaP#+lC0>Q=FSO|3!dBG|-$qbiRP zNkytFn6~s8C#@|@VEWRRs$?ZLYk>=JgA)Dprl!sGF*11b8{XzeCZzDhDRDxAA#u_K zKs_$Aj3Wp*4&srQJdU)SlhhP~vk_2wsv|pa$wx%RgC2C+BtSq(N_sLA+|DE=x*ZDd zhR1{6_D;CN)5=v)C4?Z<8kw@@)iIq54y=6TEJa{du)}ATMKf1>&g5=&t2G#9k9VBq zHK%31rOx%X6Ep7BbNv9r)vQJ$2X3$yG{{ip zZ1AEMw5Un(?Hr9d>fa6~4+odCosg;WAmh|z=M5r6E(43Cd^2Bg#btRX*WMNokZ zbTb1{Ek9OMP>*$1BMF@$XdVjD88k#7C--cKOU^12pV~7hk6elwCn}C=l(j9sHAp=E zx!8yV<};32N@?x{?c8r7yWiKj=B%G=_W)1B@C5PUF{ zR)eH>t)_}mBJbN;$+p(E76K4}nf?Rh2~#VhycV3RhT+X^OEd zfM>);rEu$^9xhe}7Y8#&wNv-8ac8w4HN;d2;&BexAU?J;KBQzvv>|0MAREGDQ6+OA z*m5tDGeCA!H3D=vaz$L!MO(yzUqp0Cl14~}bYunvYhz|<_GViU1##0QUQh+mF;`eZ zMufF>Yo~2`CN6yjS&o${{ zNsZPian}-=_7SEuc!`G+q-1!vWjZ}jhdvN$g~MvK0&A5=6`O}#n+F88wmiBL1hzH= zSAmGoH3ZKUEM7r+%0(<@krmj5h_Kg8lgM1aHZ6n!Ud~1=(c*jNkC5Cokq;ebaY+0tN}?@_gL)ZvQqM$YF2I5ilZEQqF;X5C$;{77}aQHECDq~|B7gYCwWjywAQC2e@M}hd^R8$pJ zRK;Xi#eqi?b0IkXBT~a4KxQLYGjw9)1zPliXLTh1ST<;6baa#@Hkem&b7pGxB}#WC zXH#`_V`hz|bvJQsNw8ReWP^?6H}iu8xs-=H5QVj4J1t>_R!Al;(E{N>NuJUvekX<) zp%9P)T9_m{qNIkbQ#yj@hHl6MtHYCOND_9~19$i)yR{R2*p$74c|jnEw>Fi?G>C~9 z7s|v;U9pJK^A}`6P0FHO!%|GCmrcD#Y}I8fp;#@Wm_F(w8C`H**G5>Xm~~oLCh+x& zpQA2R;EG#d1zKPc^ddn1l|cQY8|bnw@N!`jQ5+A{Koo;P%`ssNlYSD_jEp%E&fx{f zp#{lNaMJ!bjTcoUBSt}I@Kz{AQz*t#`BxqR=$aNcW8w%iHMT<>$72;}a}>yB4x*0& z;vg4jRl><~PvvAC2sJJuoHFMkQS)O6B35CeBwwUOSC$3^DV;_)byMd?N@p2i0!L!9 zHXZpGQ@5FKc1CD}C24|ueU>JFBPJY)gh;R%M8TA_6NNhwSvSErbplzPQaOt@g;O9f zOHg;AM2322ccN4&qq90j`DvykJEB5Lwxt7gXoo+rc#jt+_Bj-?C0iaEq9WRdvK5tq zD3yk26`N;>iik{#I0VlFd&7hknP@%WU`%kKJ+ns^j%ZBIvXi$vKQGR zF8-x>H;i>obxD_WhL?<^m!=h86%iUhm@NR@XR=Ed*3H7LMXbBMmYm z`nVu6bR!YsA|#?BPg9&PM~_8=Arb;2le!^XHK`w0fmjBE*h!sSR5k>uBxa^Ybpt1TR0CiDXZSn?Sk=~#7gOQ&KKQ5Y0G@e_4Y zJ8TjYI>0Ar&{!A2YM=ySm=OXY1*WkCJMbr(#-I&~cqI{(Liw(zQ+Sz1{u6J~ zX^ZCrK2Q=Qc{@bG10XsT|7u*uRj(p?q93}VDY_M+m!d72h``cJmY8grC>F#dmOCnY znmBtu`Ye9YJkqpm+Lx|KFA`A^vhhCy zbS|I4ZW-Z<`g0q3_YjWq8;$82AGJWhXnz=Wf6Kv``-D&l)lbGj9`<%Y^+z2_QbDds z9&SZq3aEb#*Kpj3QuvW^0P-Kd`7$lkA}w??RHI`+b|W%EMKU5GSYOfcy)LZs3Wh1_me(ghaie7t@f`uV4?s!6+D0|w(?6?VZDMFm7_;`ikPrN5Co4n z1Yt22=L=oSGNeQh32#xOIciP9BBVeXEkjB^)^)#wF^W(SF6xDC?^Ks8TR)&OrP{Zb z7XcdeWiNzji|=AU`9n_#aZs2Uj16UPkJ&*LCT|g8eZKLFSKzdP<+S*ACDuqm0ZC#i zoPcM`jV@e{AQK=67&B>bsQEFfaQmB#s$=IkAu>d%M3!^q1Jemmjl-uz5W`#pgf`~>b+Lsz2JL@Q3;ipSH9xQ5ZRSI!NR_& zC(Ar~Y?oMjWBF{M=*zwgq=SK^iGdjBr9M)Eim9lIZv4l)2#eyXC-%i(TnfPvTu>7n zU((ka0ClDWbF{v}!PVg!^Ol*tp_$zAFMQg$WLu5p@&09l`ocA}GO)Qa>{vk&IDNK?i#5l}=QpMz6nRKHgoB?aX)3itI%_vNEdUOi z1g?;PhG*4J3)Y$^ zh#9(hDyr36y|9MJuxovYS3wEf&;qpvduMUGkx)#I7?xt0daMVs_q&$Ce3ry)%*T9+ zXi~BS9Hq_t%%>5vos$|5Y|RUdnDKQe4SXB+{sM3T!_5vR&c^|m^A;}`mQd0WK^^8% z%|X#+BdFGyBrP>DF*eVFn$NUZApQ{{F~p7&0%W?qHI8~CR8%x8_qX);AxU)5JY#a7 zn#2*ZaUXX>aixM_v#JuUB%3+W=!u?blq7JOkm~c@3OPqfNV#eDgLE2LS%SK4tT%$w z((~Domm5z|5KGW15>8=~Ci%K6J*}~{lBVW%iDF5a1X`x{5tSmZqefeiY_D$^cqLI2 z&6{{XP}M&019x~5S*>_wEn6k=p<^wGrF?lGnxSWn)?59(ZEe1(d~1l<6_L;oi%5D_ z(H7^OWCYl>vApNk`&%vk+;kX(9Y5kSmx;~Hirun6E3;H8eS~S4ya6du zK-r=(Pe4ni{1VPL%NiJr9ej#!K-hkuZ3X(I1z+GC5wWKeLov!>QdKvR6g{0NRdnbV z+Z9)+7>BlKd)qyOs5l&DH}_-sxKvL>w^kD)Pt~^~__rLg#5GoPKs>lir85fRWka{B zj5}A@ebU*jB(FM09PLMmmB#J~NN=>`+}2o1A!0t*=5!TU2e~_`2;}4JSkK z1K@tJ9WLTw4c6A{y(aF}3ETd?sod6EAxUDvOpDkBZeb8Sy34z~EZ}5&KpNOZYNSN2 z7$rL{P2iTQD3Xc2H^_QFO+Oa)GgIZH&yXR-SfH=H>W>A4k6~z0T!#x%uck8JC z93xHk=rVWQA{a9^HwL>Mx4dmsWhFLLj3g9k-C7@J7X1b9<3>?pSBW)kAI&6|3nkt8 zbY~P;R3Jw?h`OY!BzI^d=(`HUDJbQZS(uE7qpH{SJ`Kcx7 z&!t_qaDmEY{>zpwUZzfkl9dURr(CjTy~=e9l&xU5AT@)==vXFFqC{cBBngrvb?4Hp z8@EXlBu%(xg&VhTT_kjKo)=P8&m z@7VG9acUi?UAu05SO*W}g9j+sx^UH0GqUPCMsRBhNa~5GW=; z3rcAqmIy)vjDh}?X(5FYatIQ$(y3X3hX#`;UctfT^LDlO7blgBNhU@NY>azKKy z$dcfzuMK;YA}(j~T5Ja-c3@10!c4*;rMElFD)?Pd9G}r7Y4K$I0n^l}} ziu0yB_nvbmMEUIVP(cMBRa8+OstF8;##mHQF${ftB1tupR8lj__^8s3K&mvNh&mUE z(@+0K=ueyO?kUwcldAP7p@v$sZZ4D(>h-B?pNb2o*d{Ajz`QEDtg+tOqW+35nU%^Z zZ3~O`2xtjI;t1vi(>4kXlaPzs9KeNkdnCv;SFXI$<*YK!QezEX9oYS>e9l_SH-3Ec z?QDmDZNtB|fCWbXwuBX4SaJ^29D+q>IR|8p#;9X4?Huqs)3Hv+%(JoX452*XSsBaH zLj;%ghd}2k!hSl~K@SorXD6#!3L%7`m@&wOD>Q-=Vkn^tIpIPV5*mntHmsnP$cNf$ zg0`6OG^j~!YDP*@*mC5wu0gFbUi;dS#um0H>1auAi=Eoo);280?s09Z+fVdnD!%Pa z4Sb48;L=DsQYkJW5FtoS7B>=x6vQHnnpEZVc&W>6PIH^{oJmCD{*XZ(q*0Fx6+&tv zkiMNxZ*o&rRk-klrclKTLzx}j=%zbYb;T>UdkU|*5(TLIr7Xl6qV;;GL#|kFSGVgz zS?0ooXhq8|eUaW^?lMFuz$J)vL04V2S1@qht6b_kW)j%7%qY++GfPkn``SmZ*63?~ zui*h}UXugebTc=|xgQUhpabL}EMdek4s)dAoaQX>I^tO%0~?q?j8&(C9s?Q4&_gnj zk?=k!D_MWgGcx|XEN3%|nF(u_paYqZKn(3!gl1SF8sdk-Ij6hH zNp5)i!WMGE$)Ml_c5ri(T$K_^UJ2zXR!JT##R8TNMPUi5%t}yt2^bLFu9et>0$;*) zn8HX8T6{rK5Vf)uXQAs|+oKI?Wb-b$B$IrX(N+@5Cj~DUR(+jWg1bP|F8RR^e)j8) zZ?tK@a(WY-!ST&(di%d~4(B@TjLyV<0MB@$lQ_wZAja5ZL3>&dJm&$AdO}8?4H9&p z9PD5STjt$?`ln_ADq({Tq(TER6hai85Jj6{Q7HZZEwUKO5U@JhQ6va4vvF}tDt$Dg zB2g_0NVJ+tSIW{A4H3X93Q~_yDz+#oSV~sYf>FANww=+ z=tN~G!wA{%h8}tXM)Mol{g!A%*rR0-o0iHK75HlsR;i6Fyd$Uyk%=yKixR7_?Hq-v zOdHmu7IVi_sIcl*tO{eCPFzMZDmljY?$aU@nYct6jwUuHYaIo(kh3Z(BR)pB9tEj6 z&;=66Iabu){vG2&>ANPUIu%i+d=p7tIo>~!3QwIvtfz2gcV=N_SyBlY0iXHHUQTml z71L)r(;P3=Dl;!b9DgzFFU9Pd#6h+&*YxE{?*yF?%7?fYLV@yh2qt&K5xyRS;wqCzBbT+j9@~X z1)D;_Hny>GnCzhmO+-pd+Tr`#g}(T=mvDh1)p!&n$&0%RO>Ej^CPSIXk2{H$H`bWY z?KYlX<&{Bw_m%DDR#WjQ#!7yqlI;|#P|?It{FY;j&l(fQElN}uiB!UcZ@G~0(W^lQ ziQv$Rd)(6`#jtm)UdKc3YqVbUnX;QS=x-ETajorX4*VrH2T8+@c zjY&J0ODm4&0D|Jkj!Yx|uK$@12Fk!r`?>^@Cw00Q=}jx3f$Qe-GPeNkuoTwGF4%#db7R6!8n~rGPSBWi(@{7 zK%_*9Dvj8;ni#%7q?|A?3F8a0KN_S!IVgaKqgR^#Gs3H!HhuDm-ES&-^i^8oI0q3G+)#v;F>_;;6~=i4Itnq zgfS=L8b{_BJ9YX%5i~*Uu$XhSCsDJfjJY5T>JIa$M_9Y3>Cz{afkFP*E)pske;R_B zS*X6-I{*nb2AL2AIf5gYFCZj5zfi-AVm2QdkrQDa{L48g__ip7uqZGoDv$z_BCsi_ zLTy9IDPXY7SNzdbvFEkz;!6GXAlA8jokc$ex%9UGL3cUF^D7%|`!#z~FIHNR5 z=DUc*u?V%=!#8r2f(V?1xQL{z9IVnKtPI5CL%yyG2|*#0+Ji(pbi|9h6EtWmRaq6E z;E6B*ivFlzlbw*Vv%np`A{L?eijW%~tXQR0LXq&xKUFLX#EQAVpv7qUv^XmaXlY1m z0VZiHEgkqi9k|8q;ht#`y2Nmw$heHoP&&_Wx@@|wYJ9qCl)!+grfR&jtUDNP%(Usy zw660&5yXz>D!~#opzVk*^7xMHVzmkauX=2mdt?uOx(|M28Ga-$faFIUd^;WNwTDU& zA|N)NX-K4@s37E!ouo+q@{5dQ9?1O5$5WASi!dn&$&sW&9jOr*S;+@$NhTsGa#Nz> zxe+YNB(&KToqUSjNgkhE3N{H!yU7WqJj$bNvZUmlYG?0k2GAo;K(4A1vtb0lTZ)X?au%X{AJ1Hk zE}gnYGtK=8C(%?*;kdNb6vs5}0Sh#zaU4etG_G_UHB(ck;&R6ZVy^4p&3IHh4oW-W zL_6-%u7MIE4RV=71;~Q(4_o`S7jhw912zRYkS4&+Conb;DW!|TuV$-168Wgi>Ya}C zktae=lPXn`N-2_5Ng-iLQe~o(gh|k&Nz(fgUD+Zu%pCyrNl#Rjpp-u5(}|@1q(cP7 zJwKGAJ><7Pfr*5;szJ;uXSL8lM2W9@xRYRsO$ke}XrL%Gx>m zGdk1KQbAKd+nNpCa=yFMiqxTIJHqhvRHk_| zxH!)tDKLT2#Ao%+M@}LXfnH1%Ts}yj9Wbs zQxjJ4q`9eFsjvz(Bc)+s0;(X3P+Ba|)e66`Gx5wU)5X_SG)%;dv+4LWf@z*5wLc(& zmmTOo`IFLeiL)!sOl5+X%Sc8=3$BP=Kx@>-irpX33Jy2@*#GGPbdt@FT}O)vf)g~y z3v{lMB|B5Ir+11+j#&@xO2M@2AX~#hL-npfjY07;C=a^3g%Vo6b1#Xi&SJCFAjDL! z(5Mhm+N2o~5}{Wugp0~RKlHmclTu)mYR|3_B3E4zS2Zb_jQ)aIO&g{-+npRa4gN5+ z4bbdcLnm`vIlPJJn_C0DxTbu{#PL0+q8#9R(2W?rFQ^=6l~xWFGOyaI(D64D-Bz8* zn{oYCwp2??B&whiLrWS8%oPJJ89A5>(j6@&>nXpjAdC#5mLMA7zFe#*I1#<5xheIz z=AgM;f)}QR7yc6_pQAZp0vGV{T^$&w^|=fwkgeMy(}^7z<*l?}?2X5mK;^KFAILg$ zI$4el*>oDUMLt>W5Q329UJxuh>FUjqX*KmI&U^fr-@L~dltCKYr?|^mT`QpyQmDQY zkiGN4o>@pExS5K&At%68#Y)BhRXoJ|VvnjGCh`%g{yEi>oUj^kV5W%+2-dt(rC{U9 zsW0g%DLdP@%;5e^TU*)B+EG0*@(EK>$^;eBZr;|Wv|AL;h&zNFRFNDAz0h=qBa+zR zX)Ro9jY?$M3Fk|li(pZrB4X6B#BZe}y2%}*Ac|W-3M#My-JxQZ6ALulQC=aX+<7zX z!7O_HrJQ3z&hiWEL6LsFMTQZ^Fou?l)QiQeMW6dW+(o7XG{(f3x`lP{H3qFtR4O>LW?{+0M2EP(kzdR8YGdz z`6S5+yAdBL&n)~@u7#0go(j=p=KNHOv-QdUe3dPu(GK3#E8}Nv?&bz1VG$Kpa7JOK zL{{K?;m64cF&G0t3`80h#A$U2h$!5zGDLzHD@XEzIsw;<$Y-C3T%J%0Y)+Fem?Ro~ z?J5g7t3Z?Q+o-(EOVH)Ak&8uA{E94&to-9eXiI`T!#^$d3(C+C*L~f@#6`ty9y&V_ zC6GC2X${x4AInr9XM7iPS)T*67j5cNGG#z1xM@DVjo+B>Z>s5%Js9Z)S)YDWgozFf zq!^Vo!A2&o@{nHd@ZOeH4pB1?>{|Xc^AObQI=dINL6fP$na$aN%0ZRUne{rTo%!m9 z8taK_$P;(SCNNqj$PoTbL;o!iq(MTa6_Fqs5rW+cr~%3ORL_$vuqMfZ8R6@v!EsWJ z&%pk|FB@#Ni3&6Eq{T+;UExW`W{NHtVttm|ZN3RiOi-gV;mGl3Kosq(67wO&UkI}@B3*VS1axl)reIf^tOgIrmbbp^$- z5Hn)QkQ^0@jp71SjI8kdD9Fr6zMvNIIgu|W3t;Mtf&tiDM9k>PrOR3#{`)L{-5!)q z>5~q$*XmNsw5@3D4c(yW-Tu&l=Mb1+Jk4*E&2)O+4m{)qCs|Sp>fuP)?p?0%sE+Ri zf(^2dtnQB!!om3MHG(uq5%)V3KXC*RJR$Uu65%L;4Np!TSiOK+ z6^W6p`SGi%U>fm}2rJ+vfHrU2ycIF9x6tdou3)gmsWephSDBl%{V*=u$(}^RG;9?> zUp=J6Jxtu@w+-`0^szCYoE~e?3#DPLL^wB}R(8f=&JhVvaXnqsaC+2*==`(dYGL(Tq*BXbjK-rS zyl@O*bdGG2KQ)eZ{`9_GMRRZTk*%ofW98lT=GFDsu#E!}$K&uuL{4O7=d=%$r)2L~ zW_NaIk4G8Yq)PqDq$n6$s?%&!Ru3D*Z8ZD%Pt|w?Yl#^=ptJLx>Ck zYc{M`A!pSJ5h8Z%+aYen&ZXP-Zd|cMitHu(RtS;6V*~f)Yh-VcB1ViTUhLS3VWws6_5#Y-11U9^1nqNU50@Z!6m7vH^m zd-(qByLhQ@-^-UT_w(}yW%vEYCUB1qtX4>C9*g%w&ThJ_i1 zAqIzLaCpWUW`Jl0i6xqd28d^%fkql>fN`IB6Ft=H34x`P&et| zC!m+|kW>#z5%oi-OZnjGs7w|0=0Hzjl@(Q@wrbT6YH{^c5I+P#D_Cunm1_`cq5k!2 zu4?6_Ygl8kbyrwz^(t3hL-3^+Uwy@eSYnFxby#DJMYh;v+)`$Q6GvF4nG;WZ1{xHi zVWzIPM=+Ecyc99S923V87aP9$!glW#!vSX;!1QvdoWKItCL6#B50@Ro*=YgBcM+Fo zAA9S~$6mwSReUjh_34)%e*7J1V15M(2q1zb3#g!j1x83RfEqIRh0G2zh+&2}qag-~ zAEsF17$ycSB8n=4(V~v^1^MH|K$aKej`eM!^o%iTk>1qlabaGQUTh~`zubAoWRp=$ z$%U3%R#|1d?|w-q+-jx?1)0kskwijJIfYO`4e@zIylXbpkWP9gRjojA^%bti0_JO4 zxPK+qT6gKH*RXN9H9TF-3N{#Fi4Ep#@{A=GS+?6cM%fXOSvIa_>UOr-y6K8W{ks%V z=4JS&t9fjNJz`PS}{Vq$G^3GiW;w6u7_y)QIW+393=eoWyrGl8EVT zc*|Q51R?}f@y%~h1k*+QHV~X_q$7u;qT&wKk~Ox(jD%WLW`6E_ErZ zgo-GA6bh*TDY~U_WmQ1QN>N+|D@4xDD_wEqU5JpDUY%u4~udf4M0XVir*b?vEo;j88NQo|bgz2;!V0oZf!1)JXJPku|f zlfcf0oP7b)Y{T(P#=a&a1ahonLK@(Fx}%)~!UsGaYhVjSRv?vK5JECT8G%N|!J6R= zXBzS#2z_>jp_#};BU;glajTj}#G~9GdRfa-6`ZAvo)-e%RCV@r$lQJklh4e{{IDqhn>eILk+r3_m z-l`#Pt+HH^E4x)HCFA>(zGlPL278OO>#%I%_K}nHWjf6E0>aO(nLdp%G6`%tDqkjz z75O*P8Lj0W8Yf}zn$j0f{>*j39to>k5_gGt56<#fcayUpU5nxE?b_6y%Ss26Oyh>e z8XioOZa@D}e;~_gPpO@OGRK=lxH>|z9VVbZju)c%h3W7%)4LepWTtVtBXmSxV#HAe zl2<=IMsk?T*qUe$O9SI5k6dNY`3_}MI(d+3ZS_kfhic?o{F+C}oIq+2Gbe~?X|PKuXacqk}AO_^X1Af)((5r(QF3@&^=#!ct1(4wo2mG)svNzXv4kzNhQkBeJL zpvdv@fvsqWcCe}%H0l-F7Dh{m*VRIk*jnXw^^5LBtD0|8jB_*VtjF2Ev$8jI^I4d< z{T8#>twa-uiZ_S!h_?>-XN2X}vz9C53{aG!X$Ushdv3yh01e-tEiG{-;&NYBD$=QS zUk$palkc7@3OZ0Fy@R+)hU>t-sL9K^C6PM5Uca+3TYw{^@f&IYhnyuhz2}LDkcyVs zZu9B*+KH)HXi-MhF`Hj;rkRjrFeO7ef2??TDFn&x!8sJ{gyrH*!Mkjj{1}Ug#$@WR zg&Y-Ry+*h-$?e*aMsBp|lCF(}jSKnw&f(}fw;G=vIDZ_ZM5}ZrX?oQ4!K}!{Y;?5| zvTxshPIrw&ep_IF{MotBz;f_abs#@ff{s9#Qs%3irRhm*qF?Q z_EUhXy0h&8#AuJ-_!pno5Qm{(UEGZXJSufBxW?s)}W=Dc^EUppPz7^qc& zMCjhHhM@i@cA%J5q&VtVGl)%+*Zlw*Eo!AWLa+_Clkw17z3XM!Ql`j5UdZ*oSqSnG zDRmkX6Ne$Xn()h_licY}f{Bp&xW>CWz5I~HCPAxH!S?7R$#QziHs_DU-b?C*Y-sr< z8;MUJ+W+iQrYVX29OO!tHFRD}y0T*;CndvtH2pH{UT|1(?T$A>i!iucNREjHp#6gc zKm`B*9B&6;0RezqP382P&gD0y<8K11-{>Z9`1J;m@h_0cFGP!Fpydd_au8tk4QSpE zFzf~Byx|+bU>IOH1~8rkm`(vKrU6#7K${tW?JUrK2Iw#eupb534+9*B0FHwImqCE* zFwk`j;5G&Dm;rcA1Ky1TJcj|ELjdnVfd3#MXb2EEh7d3b2$})-&jS1x00GOu;00jl zBJk59Fnk#yY6UH36)9sIW%?)j*&p1?7nF+^z}XAn=ozs61lV{4tUVyE-J`7CBCY-e ztlj{YuK^1;fVpeH%oSkj2VndXFn$i0JOhlM0!EJkLq~wG`@o)EV8rMZB@T(shRy4oDphD_%AbgJ4E zqMBsvh73?$8ggwausRi3nFy$e2UNrY%c6lLk-(yGK;cI~K`0p3o9oVH!p9$pwN$j(NXR> zNrs=Z{s)cOZ!q}Zvtd(?K})`QSD9sBjm4LG%dgG$ZDUR~JFb;ye)V_$-FLy=KSMju z!@q1rk4+{{4yBCs=k@hgeD12Q|6kN~*3@@a*ZmKwYC9@x+Dpsp^9stcvI{b^@^kZw z3X94sDy!@38=9J1+q?U^z6^8?jkk}_w=S-y@6685&dtp) zEH16AuCH%yZSU;v?S0?hKRi4-JvqHRJO6QZeszBF|Kj@m;tl`j_Tut?p4{I*JUl%9 zFWxTxzq$Ya=kEUT=l$c^S^e>cDXJ-__@^FMfb!~e|RzkmPzdwqR{|6hX!2V9^v@F~$0iuz*`70_4P z42xh=s%8*4*(yX6v$`e>x0H`36CQ-RBl=X3r+V*qv;OgRC=lY>?RKa4b(l?hci0fR z?3hTN=emLBA=i#YUgrK0ZciUon^SF5q*}zBX3Z;!gT zAr&znZs(GPcqKnbJ^cs2cG|^NY+$CwlY3(iK70>H-SyvRq%DOVFwzzUo#FwJ-pgR} z%11vE+Kj+d7_vw3Cs}Q1@j2?4ZE?x)7fW&Y*PM?Mh1WKQlf-|WA0><5F4(2W-!voQ zC{oqhrzzpbGNfWq%4^H`N$aP`8_M$Q$Qx=Nrzm4tWaub?Kj?9vo;6bNle8E&;zu}*Kd_q`gL`)>%?9KrxMs1yOugm_dz+mwTc-N%X1d%dTz zL6%TZYZvW%ss7)?IMO@y+_?Yl$w&I>;$n~@v8l475L2h8(Dskk*65J;qP5< zih5Yfw#GfRaQ5_N%_3=qvDC59MoDjU(c9;+rIK9CVZ{ zwuJV$ph@ImpQ=E$YriN%cif(VFxa9a1caCEaXWAOVr~d0#w7?Ft+^e}D@=Fd>86 zzGS(#&R%AjwRKSbxbhfkiz4s%Dj-GSjZw|=A#Q;a6Y^0dX8N!P6-S+l;IwY~CisN# zyfpfk%?|h1-}t3Xb1!4uQeQcypYMM`)N0Iqrk}VAeKc>s`>@zIKKzTfy3MD4eHn!$ zr6wz=pbZTu%MUW_??ajS=7A5R16ja9H2emd*bzNRET0rxVf4JjAcpo*poX#>K0an) zdpix~wTfW7O$v0zJar*PzUJFUQ?K`m=S+yi8@wNrnnS56&gYFM_=rWp$}*QS^63F` zRVEo_QU!=Ijf$vs7Ky4TA`|$;OC#JS6?FFW%Szh#%qd>HjIPr8TjB`JLbb32o z%K$wA^g67M7^=l-5OBrHU5)I?l-VEdA$qP`X9-xcD<%qb@}=dK9pYlX7@R^|A<^yj3hNss1CG zsD=(=CEKkSwA8JBwymqTG?+FX63t%7oZ>2(MqpHl&M~mLNAG~TnV-E(_PQ!I1%9b- zRwvD~{qxiu&v|8CjXXV!A0VVfvS(YqAU=+*l&uxhfcAO#+v%J5VlG#kPh@-Z0Y=n` z+?ou>x%oqdUDlcZGu_B-8?hXjls50I6}vlbxOo4$+Fn(e>3NNyyO4OjbT~x&sLb_weh8qPe(B@_8+PL5|uxGYxY6Fzq}YNI#f4 z@^urm+CRn_L5bA@mrNlKb^nfyG))e0n_BHC-3n$57jo7vip08%sGI}?EdsDfBH%YB zFp7!#eDeOBm&;8=(Vz7ZC~1w(y8=b%Ow}Sw!LkHClSsShw`arc3wT%Mrr;&#kHl&w z?#b+YoDYT;uWXOge;Bs|F10|@9?T$}HSXd_(-k7hr@--eSBfH27ZLZo4E@9uX!DEf zg~nmVK-LJ?;_o<;ma;vydn=KSw@M>udh0SubiqhCi`NJ%IR-a=$#G(WACjw1STBkg zf+{O)%8s&&Gh>R`KiPWU>wK6eWI@P)&4z?GcGBX;_nj+-O{LnIHO|jPgC)P;W5JrC1J z>DqxgJV^f%O**Lvs6)=vPZv7XL0&~aWzk8WN&O>` zP+j1X4deX_^AV<#RxgD zgQe7ps|T|#lD9l9VT59ZPUD!oc{*OFpdfh*6G|rm=PI5Jm^sup$VHxc%F#XKUI^@H zlN}gLNC`B&Nxm`ZB!7&PxbKI64@a^VHz zIX()ea=M*17equ!BpIcn4ofZbg{#nLPzirR%?M{$(!7wB-FPyi*|4x7 z)?q@k{O)h*5NIj+D0g+juTY^Q^9bdc(DBvAdtQ|{P17X>GF{~;cr7V#RN_Cf*!V96 z-qnEPs@+q62hE(iL+!u_q&A;)gI!AW1r7+-#%%TjA`jMt!~G0WA%sW2z(mEU zuJj0F&PC!6l7H+YyOFlD)rMenHl6BfT_#j=j+ai3^6MW@+nmwp=r7CT9s=W*gtg5# zxi5~W0#Gzt&mAP9HK)QgRam7}wI%S;Bv&3Kg?vm0CTPfVvci}oz{lPvI&lgE+^=V! zD9+T+2e}o`{JHcK#eHGXEM@ji z3;x^z;ZFav81IQT$InZk%ojHr<3#7RQAV2$sEz8gV>D&BuBFoUM+WO=DLE z=R~f$#2Q06jWkOiYt#Th67O?jBZ`}%y}VY10H%xpUbvebRKda4y4EE~sKc6j5RWGn zU!;XVwKOlRJURG2$h6n}(-L!xkOy8Ab2y!TOlwLAe@LlONIXJ;VPps)tB5IMl%o!7 zOogq(hNm4NTbq&!ZR~pw(mP*iFNIZJ`Y><~$vN;MXd&qdgaihfGw6DViMxws(G zg50l^eX1S;>1wZ91O-5OR&!*he~QZ3yjAksk1lEtRcZ~H>dM%V=4~jIX^;|8B$-|`>)3pnNO+qziq}Q! z9o2aCvi)|C-*izle}f(Q*FVk1#b4ORpCL(fY^V_-$X=G0J<4hEkJHVIO3a=otmOGn z%1efC#zyCteJ7JUT`hyG!PEk^FE=P&%a?d%doE2p0F{$$0500tMU(K?S9c-D5_b{xf z`bKK2@#MisR817yY6-VtC5!dUUqTLCwDnjN@dc)R*dpeuR}sRff##9?9aCBU!ye$E zioi^o7)RQs(_XE^`Sk!vlij=Awbn48RtsYQzMcM8tOMmAMb`-u&9VeLzT{5^NzA2> zi;UbveDyBdGHZTuSH2~iel)hAF8yF9B8Y@k_5e`61Lrbp>Ml%fJTCf=&ww&gKO1EJ z#qaVhVf=;r!rLj*q%*3vES9vVMzM#lm%n-pk!-c+LLv9wU!H(B;=ouJ7*)|Zru&ka zcXu8b7cGeNL&yVwD(xVoUX#p58!Y++%XSLxGVxe-1ZR$qIZUC*0ENcHB4g4c4bM|5 zqeE)eg-uAR;nvC`c0tN9uC|pCv;34H`QOqxiIdFeKfKj~Ib@d`ss9M)vwo`a+s!gwC|IwwtAC_5U95Om9 zec#iy2u^H>@!25DiDb2~+|)i$9a$HK+B54YE#(kaGN`u&$YhiYtLD-m>y~23UkbaK zKoo+N1W^nHRaEl;oqb}ff%r@|DBJGH@5dtU6{SYqVY(;|12Dq1;FyQ80gS4Eh8D8= z{sl#NNYIYQ{@N1sv5F-3OI*8cbF?Q#?nJ@xmm*){52=Qq@r{;2HA(JYMNo`R*$c(k zqy10Xh7L(TIDAVMRg<0kR#q@I)Y6{lzgi{UF>m)4wbPC`v)VH%bv8m_Ip+PGEBT{z zP12g?5$bn$lqt0%DZ1bzPlM$9nz<`a%|M*xKIZsBYI-gtGx8?+6Q5N!nZ3}LV5OrX z^5MIR=ydK|$B8iyc1a+DA`-HcJu_<`A!hB?mC;U=5hyT7gf&)KBvuBDxcp|w?n88A z#{D?NxWG7wCthPsh;zB=uht`p#tgb1BMqy!%@SoWOlEwW4mE3KYOMRI2 z1=W8hPHvQ@3|+D8ba)mrrqRVT{PoL^ zGBn^V=WSU@Tgz-Us8}oiqxor4?!0hs4^j(8W*DxQ7s$`@Y~PvD&kN-g7ae{%Az)%B zSlFZ6^DBbxK)`t@`JFWAL>eT$x?^Py7EKNE)CQeeV`t-{pLk(Uf511s?2}4G$@BuD zf~pQJz$;P0-saV5nPsC>chQ5&xGh+BU0Xr1c%Fx%7Y%yl{8T2ah@*lMM)siP2hemas zVM_#UI;|`^wI#2@)uvRjOUDkR&=DOE@935YxvBdh9)H(1;b5q8wdszz-y=WoOLo}( zTgWq4)~64SV+u0I_L?GrtJ6A2w>&t)G}5QZ@B?q80veoq0FFQz;>iH$_K2H24vBK= zj_O^4@_quqdn5*rMj;IFCsmtvC;~Nt#2pQ0Jq(lNFuh7`QA*Oh-@gM)%Atw}Q~AS= zTOyPcgC5N1(!1mwl!K^spar!)Ov+*sKQ?L!9`Qx_9Hvar$@#&wt{Zj-=aQ{ zVUqJ$53O`ko(7Qc_6H~95ts*h9gchhOTEd0eNLyp@c+iQ2zlhP?A7nOiJX4=VcsA3 zy)`oa`SxhoO{SPig6NlVm2;0z=lHE znszMW7s~)+L8a0Ze;JI<8+$w`VMV><12OJR(CgDHJ+-YcK7pO-U=s`vl`)nQ%IXP_ zCE6k%adZ{b;KSP5igeve8%C<2lL})^&qMnnt9Pm@)rCRltfpd90JbF23O4#$-zn*G z*6Q;O#zNs!nywv@ZaO3Ewg3@SERj7d11l^qQo|S4l1mcjWx7}_GRy~B8FZkyjiBX9C>~me3Bb0(ovTo;LVhD4rr?9*qyE zAJxfLpYfOGo!5xmmCjGvTwxt=GD0IdkW#$3w+ej}OWB-A&U#t-|=`pnY4g{L?zphsF#;vZJ%Qe#!9_8Nz=dJXTZV1qHA3tRa z+Qo?HLM?3tfgNSNSNSKjIAeo})fi|{=4w0y0y0WrdKK8Ta=Vma{2e)3YZz3dz*?PO z(eV~N-VzU4paq|zDQLql7n;Y^q1Yy=aUyfPGU!D|_@`;ZW5rdPH^tQ=7jH&Qa-w9)rH*YDeGm@)d+~qhBH#2Fj z6!xx^*mNi|N*IlYg2^CH`j;*y|N7SMvvwAa9Jn^QzlngQo09uk_D!}N*~xkDq2pY!BR)bmM403y z-AYm7oUghYwWRzp|2owkCiHXhmrtKTWwGUt%hff(?$Gx-UN*5prfW-@e?4M2C!H)f zzi4XizEZRwWz5j>JZpN;{p9VfdY@^HM9W}t?0jU0OxjT%xZrYuE%y?Lf~oCsH{OnU(`%nJ}XWk7|heXAD9X>Wt|WDA1n zFhNpF)pZitNCcGKZIrHj@VSW+yGln)s4kE2r;zf8dDFR1aO9_do|(1!cIauo z2Fby5Y8Z$4Sm)K?dJmb?6z-IaKN;lP zo<4sMIOSz#0OJ`cq%#yqN72As=O;Ic`#gVC`Bg9YXZJ1b-J~y^RjGP=_HQLQ*6Vzt z^BSJWUxB?7_gV;%h;1CqR7DfBX!;SjWTy3yFcE$xBWb+J=T8#etSDa=p*bQ)^=&Cu zSy<;ArJt;c*h1#(L3lJ`OG-?)(;rYQ0-I3LR6F zSXda*k|&zat0&VqLk5u`lIvwzi28L=^p@JM-%6 zis-9gC980u7bHs_6y<*iB6|)?{&QabUrGBQdB0-0+<0%p^iV_FBtL5qR6QS;)r(v! zB44{td}djEIYdCejDeoDW96Ypf0%;o4m@<%G}uxw=uM&WCTkXL1P+sL=pisXSGba; z;(Oy6msOaMq1nY#+7G3{nkx@|N3UchIcfzD^C^W73cj;)1L7$z^HJ#+@_!6dC?CM+ z!lKO%keIy-|Ef|39A@bL;bz>B+>k@CQZJ?s0^Q40Kh|@FEypC_W&tvqDJRe}(TD&A z(V8R!fAwnev}-b02Ap(2fEN&LAFNmyqUxN31b0Oz#fbEij(8JH^EcCAaS)53AvXjO zix}6ck_^TsAgZ00f{%&)?}%ZbobZf6=pv+;o-HCZCsqfMdpn_0O|;%Nkx5oIi5H6@ zW0Ikv_w(PJMzY*BYr6RjQC6hBViU8FqeP4RZgi~4v`gC5=o6M27w|>90gBamO~zM5tn(Of5r@d$OX!1qM+2yxki?$ z4P~DAlP@X4B?TH?elyoE3TO?E0r}J=-y%-qBUel23X-%}*o|8luMP%?`&4S6%qTvWjoLEz(H1nJsXhOp?MeWWxJ1b;bdUK?irEdtk( zuTz6#4{rGOM~WZnx!(Q5{|EgRwv6^Ej>pml6oy|DEKH;r9GfjngxDX8rzh*6QJV^kvSdj*sc`Hd5k7e$xR*qd$JiW_7(FjZTp zNyWrexvvn;m8Wnv2VZh|eDK zca)}J06Vk^IJ++CpIogWBsw?+2GAT4{CP+I6){ zZOdkH*#%Q3Q$;2i;jP-$a(aT6> zW9+m|@0=~wyP29fpkHwz*Z+AhVZ&y2FZzx8mViR~i=xJ?k^}|CZOm{ji2gi=PJ2d; zv-vhc=o}p(Jd9}?$n&#SsD?2Hf!*L(ygEK5^S7CS#X;sq|F^IgLduv7O=HEdLj#0@ z?!tX)WbtS?A5W_vO|%6|T#I&e6nMgKqNX7SDOI<}w=@F(o<+?%yGfYW?L&|IEDf;_ z#=F^`zhI;A;K3p1^%$9)m{N$~04?>s%v^KbOqliniEOUBXwC3Ke6R|Jf-Hn4Vzyfa z)S;4Jfwc};+?Fr)!_)YyT@-VZJEsR{k|^vBrFOxJ;Fd5|?vfk^D1%Dr5fC zy$&Lk$(Y%u2D>g>3Y0z*fhEkktzr|jhuaBW<}EaR+#>i+p+5AeRyn)LYhX&dF?;v^ z%hg3X5lS=B$1N=e^C1a+qNwSK0zB(@by5+$`Q>zX_LUoaG*OMOw`^6ci{YZ9Gvd4I z#`u}fm!8%9JO|7}aw$a$n9QmO+szPdZ4yQ#rOy_Y zW>vvnk1jy$YCeuOAN2Y%-?uP-;<0zkNP>`3Y-MiLdb>$ISzi0OgJh#tPg6WKX^PMXGU7j&RVlk{6=V;9q){_pov z;~$PpNXJW=lrmy?-p|CwV(>~u5#b}o-DK2=N+aH9MDU@-g%z|ktfBkdwfLqU2lB>a z>(e@~P89TFbWgCtN-+YkPP8Qx>e)|_UI&9-2Mr_FTb z%BEx5pi!gxt=`5Z6>QE8K|OYBM=P7o#GRn}lL0>aMyuij_8YI$!9#3#jeTA}Ml#z% zp9qw!X3?>=rGecT*8}@ZwXGp7^Llfv-FJ_JJ`hjeJp2_LsccGAPG z74A`7%*wca60Eo&a_>%d4l#baa1&Swz1T%KfSxuHH&lOkpgfIYKKV7OgQX;defgW- z6-2J|FT4gcKNl?vsvf&7T8Ml5#3XEaRc)ZZ8K6k}>>Hn5o8gy4OUHparEPo1!Zq_SsHR+E_(Pl;@cTm9Ao7WWb<_m2A0_0CIMWHr`9~^GAfMjp+F4EF<4ER> z!Wp=TOHgy&WU_(tHp*EaseqmYD#v+Vr||A^ZRs54>+b-9RHE6J&UX(v6Td#b)paxIR8z{P35?Q>VZ+u!$y|A1spSQ6yy2EAni1eCOrz$qO_+ z=g%SSUL7Fa8FBZh>G3n*{@*XZSYFa$-n-)xc7uYP%u zvTX$={S5khQXltuL&ol*-_BQ<+GHL3jAr&h)lD45bKlPpw=1}R?7cNZVhY2Dv!Y@= zTRXGT^+#yZ3xv?X3Q6;o`ldokss=TN9s!k3#C9ZRAVL`%B5r(alM)&@>C=eD1IQ+&XH~$i{+c>%8dF z7*w;_I)Zd!m*aJ-H6!cnS<|3`5lDFO%O`eRI`epvNmrsD(h+E+=&uKBs5{+0XJgkk z>s-lwA;HI^)4#dDQ$m3c8#2$$HdFybe4TpLyvL)-KeQXwqwgI=efj6#JYd-8b3Vr- zq#B}{7js^QO>JI#d5)>)UT=03(?%%v2SZ%e8f=E6Uf<%tcIKV9tt82Lt}nj-{Q2J} z5+D?BpBR}ehz1H`dyXW=3RxVDzzSH5Br;cbrX@CWZb6QwaFszO)b*<=B{DU)8I3h^ zwn2{P>@`*(?x0eX`sdm$@=<(^f7uQE)2;^WUR>P>WX*vU~O?A zJ^@I;epwEaFqKHw#YAL5#?@l-#MB5y)Xi^&Adq29BGK z{$XRAPChd>*BzC)Yn$ZlgTQ>Z)YYWv@78P-Usvh=;*YnZ>)+p7hu%?--$#0XA46nf z8G~Ykc$Y+COA6D%IIK31qezoBBBRVRx=W*(EZ+*=1x=NXUp376@emNhf zNDiHsC(Cesuus>N1tEjuvMLO-q*4`#*4^nU2<7AoTrP6k@_GcfjU-L=HRZ$^erGYW z`sb#hZ5 zUrU0}z(5Vg=87+z@`bR@y0%V4R+u3id~Ltv`oqj`mvO!ED?D%AY6PF%-Fh4$Yom2i z>@9O>PVz6j!ObtBGuO#STW!nPdnTOhS9Qy&hx_T8;kMWC=V>nQpPi`OBiHqJ1tZIw zeNA8gV+vIq!XP(C`44{hALW0~PLxm5>bCYYi0_~6T3#DyvHo3T7QpZ8&%DYUuXG3X3ixaexfWkiIZBNfaJ=8I6ui5RbyMDTT&vWPlx@0^u2 zwr$d?v<2$l2u+0w(0Xr_V6@+?hY}jX7RQr7=iscHp}XET#S(6}f~KzzxvV@`HnrY( zL_3Urr=*|+mcZfZ&1S60TZySz#Q%T+j(CAmzRfsU2cRkgPUH491A2Kp!4)bMEn*ULq;8%kr0TbJcoH$K2)j~=a9lF|4 zxvYGW`M=|TcQA>du%mhqx`eL#Ea39~>JR_81P;p~*q{gPGk;kU=AU=F*Cx$|C#xxKC8pjGXs}poFFUX4W!ip?Hx+ zNlH#vj`DJWm4#E~aMT%>n=O)2Av{Jm2w$V!hafvC!;|i{R>d11MvI0V2e%E*Fh&Wk z0~Vv}N(Z|Tj+Yr4L{@&YW>>r9@2DN_si-kkJBrM&Qxf$VNr-P-rnEyyW5}qeGoJxj zz=cJcNgUjp@6C63@!8Q%}=KKs0Jz7}H4&eK-qCt2amT5AVVEA&ug) zFXhrchiE^6z-YI;`0Q63QDL&Co8cnot?sFTrkTun zOh>SZ>i^{jOL!p1H>95#b(rq#rQ*gTnpKeEg9J_qU(VD|OlCDAB97s)n|#H=7UxhS z@|^T2p?>bUf318$#^l?Ds61is_loD=W1qvY8ag8-AB%BFsFZvYFjL_36=$0}Szi(y zsS|Qnfq8A(#VPU}Wzc!si6L_INpxl38qCQb?GJRd*Bza3|3?4ay(HaOI+cV1(<4XS z9=sC`W^5nBPdwLy5em0ZEy9C%pW2ckV^(!9@ezNk$$rk-2v)VY=Zuc~911@O^ClGtRB;6cj9&)JRFTdO%Eco{kQw@8(tqj7NL(PJbk^j_rsQG?GV`$iQsZ~LuW zf6mchoQXJ9EH6+t2kF=#CyErkM}_dTc218o?z=XqTtD-4ABMwY6KA5kXMlcI5PA8z zNV{XN%4@2gL|#1>`C!#D+e??(Kl1Z2dTK2GZH_M43l$p{bvn@S&V{0lC+gls(P3jS zLjq$`2d8sEvAe+B!NRIL#bhcsx33@g?TDayZ{&^>S^(h;ACR zk>!DxQbJkyI;r;wJi)@IT*;^`K^ik!^7Ho=cus$1P5%4F5PRFe5`x3|C5s5~(cQr}#IVU!gV&v)|iIggLM22GII@7|y{FYLYqF0w< z%Er!o?7pI+%|6Nz7B!)f+%a<8(H-RgBzQK@^61aa?Fgr(LiODk``du=&FhVj)N=RG zo8R4>>sb3^VyjzMJZKEn^HdV1B>PIT^$9?{?1Cxof(bWSAllH2;E6%8*jf!XjV`H_ zS}m*fDCE?YA#ew7^q69WTgc_YDU+24>t$wfE>gB5V^TTnESZkp`-3yu*KHIh3EJfi z3t-B4OZ~MQaUGGSyQ=%hxj0DSI5AX0A9c2X8fDQ3mEadv{P)*!M7hds-?$61MUqX;|)YQnpWW$mxIU9 z<;vy=vsTabN40~K6v%)&!rP{V;YJmSGBGNjDEG`oc2W-_tuoTmI%wIRGVj{cLLrJO zc@?Sw1$Hw_?V&qQ`twh*V_jitnw}=PSS*khj6WG!9^y(aI;erl(eyq9fAMA*s2C$n zp??j^^nMjEs>?2ToR`4yw1KZmh>XM&?wG7)Ebz)hV*Nb$7iXCGM3sz@Y1)E6@=8r* zinLC+eCe*`S_%%9N<-}WmP(>kqmlKTg`&egu1q+D?sQc;+#MZ8XkpNge2kG)b(2}@ z6u@eJEbW}cB%DS=vPC6}7LFs#gkO*$TL4n%wmTL88ibjZk(5f}PbmYKl>ldD2{83` znA8}Sv}skphk<-M`VpgW+HOP~kb_t}5p* zujVaeZlpmh@P!XGjBM;N=oSW4l)hmyuR8UgDuAq01aTpiopfmNmMLA331p24iBZhx zgoSF0bpU)h>0?X~W#VS!dOeVSB#!o8$jk2?s4JA=#^K$Ri_euS-cAynGaXdGXg`z> zPZOlyAIDq)ivx7oF5d%kf@&d~BpL5{1j8*>sWkl_?~ zSHE&WLuUp{W3vcr%u(f*yf1uv53E_3=I(iafg3auEig!+ZEU!p+V9Wm!d4{9UsN#T zuJ61j8=^TNGGZ@C&iKl)fbzNVD)Ohoj#B5@9VSlA{Q&())4w_H*R`hCJ#P4E6a0qz zzh6!N!MOpb%>W!8AaOI0ng@Zo8G)MzQK%VFiU&!l8A*!=*{B)WiU-B18RZ=hDm<|H ztx6g#x*08*2bA3mD&|42Zbon7!RTtn_{M`d-i$fVgSFm_^_>U%tQq?!56D6o z^gow#IxzG?j{`p!@+IW+KkUOUOtcA40x$FfI_pD5GyCsJrvoJnH9MoTL!+}O5H%%`LrdHAA76q@ zqw_xOvs06BQU8M|gu*<(^EjNtR=YD*({E7E?@Ax_KX|kJGPO%rwI1U$Lx=t~TaWNA z?DR;pv|XcfNQ*T(*Rx6+bzh(L{Hk?a=doM=Gd;ldV3TlN-!)6;_56;t{Fe1!qjmfW zc4F6YMZfiBd$1@V^!!pnC4{zUhqgce!!C^WXqU5Ir!!gm^&_k_Wj}&tZ+0BV^g>TH zZFBHagS7vawqsZGUbpr?n00K=c5b&ZRNppYAGZacGfAs<{`$5_2X|zw{D`xjuOGKQ#G1d^D8XH$rSd0y^(Bf3J61XLp!$v2%a1E@>(BSd(Aw|RTF`V|wp{)W#wuqSX`Yq@#nxBtpG zn1_0=p94Be0-zWB71wv66FapNuq0TxJ}-EW=Wks*wyujeJ)-XX|=S|N6PNyA-GTLZ1V+>wEt~d$ZfGyz8&Ple)7XGbNxivX}a=1AG+o z`#-Nc#Q*QD+XK7PZ^8fgJ^X_<(640QI$t|{#apqkn?uHzeEsq|s3-ft$2duYyk9%_ zZ|A$pJF&I@^Essa%|F5=c(gtsyvu+4{jT(H^ZGHjczN4=&o{BKpM$hFy~d}vI&iqv zXZSf-J%@YtB~&>*uzH3|!ma;$B{(^}OMS!>x{ag$z5JFvQp>ND%Q;-Hv@>5q)(1H{ zOElegdOD!PImmRwvwaiu`#A``)R%Ti!@ZoNb67JwJ!mr}RQW=ygD3#KHZwbq3%(TZ z0x$6V%{%x$cs6Q}KIx;jYV&$tpM&JvgHZ26m8&@=*h7`;!#ME5ziU43L$T)@uqdbl zu}{LRR{}2>e(o2)@gG0(C%^J9Kl3-g^FKfIN5Aw>KlN9?^Xnfd>~poOp5L$B`#jzMOe;=g*->mp+|(b?eu$XV<=+dw1{O!G{+=o_u-p=h3HE zzn*=2_wV7ymp`9=ef#(E=hwfVfBt{}{{ak8zyS#?(7*!`Oi;lE8EnwO2O*45!U-v? z(83Eb%uvG(IqcBG4?zr3#1Tm>(Zmx`Oi{%ZS!~h87h#N1#u;g>(Z(Bb%u&Z3dF;{0 zAAt-~$RUX=(#Ru`Oj5}unQYR@C!vf|$|rOx$M%*FTo5`%rVI<)66r` zOjFG@*=*CzH{py^&N=C<)6P5b%u~-j`RvorKLHI?&_M|;)X+l_O;piE8Ew?jM&z-)z({a%~jW3 zdF|ELUx5u)*kOq+*4Sf_{!LcdWtnZ(*=M1RR@!N)t=8IWvCUT7ZMp5%+i$@QSKM*Q zE!W(0(M?y~b=hs#-FM-QSKik2v4G0wPQeCe@AANuyOCtr<8F4^RhQBGOqm051t<(FZGSQ~rxd9NRO zV$NCToq6ur=bwQNTIhr6>4!ahMjl$}rI~Kp>8GKN`eJSHQ4eRSvCdlSt-0>n>x=0@ z@9M9~F5B$0(N25ku*(};?YH5MTkg5(-j{9h+^$>iz4`9j@3qCl=kLJ@FWm6M8?O4h zev(Gq@y8*LoNjIYjP@>X$uZAd^Ua;Ud%Jx&4_)-pNq@O!?(8XD_0?H#yE~Yl`ti@-`1|$m-+$Wq_dfv+P;>z# z-~kc%I0Gh-feq~20v#AZ3BC=21GB~~4l#&84B`;A7{>%b7($;_FkrwK1RzkDLO>WI z86tGy3tL9Qe-T3vC@cglWTA)}0-_M%fZ-2;s4*G(%Md7}#W(hq3__sL7D0646C*Z6 zejOtafPnsmzifd*ML>~@T|}4^r>KZ$_^TKwOoSKFn8tsBkzlt#;T6>w$2780VAd!i zAci4FJ$8|f{tAaOY*7d;?vapB>?6Mpp~68Nv5<}Y;UV{x$P@-55y)`lB}E8Hecgf< zvPi@Z2Vo3MjxvIp?3XnZfx<(Ol9dTGWxu|0M`E;+mI8cbzh;5LTGW!4`a2{N|CL2R z$fB3Uq#qqGcnDzPQkTYbru*oaOF--rmUk@1GqH(2Ix3@vfvANK^%ag(0%DcfG^hCb zC`>>Q0v5A?#S#G_2vMGsp4&U*El#LH6cQqj_4Ft8Ael@J5~73F_~${LcT0pWbb1P9 z=>9|ZryYn+6q*vH=taxtP>gQ0bsFX9M@i>VkdAb7A|>fbBWF^SuJmv!W$8=*wjJ%k zl%}EsA9iM1Q=Mk+rq@y4PJtRZ=vha2K{cx6ke40Z9hIq%177x;8r8z}6gx$g>Q(oa zRPBHct6iA3S#ua1>$L(LB3$eLEOQ4TzUQ|nv1ra1736|QwvnpwL;SG(@DXLz+7 zUjZ95zkWxrfi-N(2HV!09+t5hqZ)f|)>z4!tZ45E*w@6aS2AjG zjENazo>z7zGGoy~e%&G#Gu-07P^kz-7_?un>mS$FCAKe)aVB8rIhd2bKugDBqz(NtUphYsm5erz1Ll&^0^S+(|3}DW?1Tbnfxk-EY1y#XTSm$&sYX5mNAQK>Wdb$ z*w-=)u?&47qS5r`W3dZnjbRL9mgu&|EneYrBn|@>*8avV!eRc6K3n4(zwq+Dj$vtq z`zslTD25@pF^*agqt(Y?#=gFh2w?!-5I!7-A_VKi8Kq#C`W#AVL=SPQ)=3aSMIP!Vs`{1=2aMYFiir z7yV4U6BqC9SX?^nhM@DRDGvN*U*6ht-&ZYQ@r`4v9+t*Hd+X-hy3Xdw}@59$1c&A<=$#IIn;FBTBN>%0yTeDB|mA%|vxlahfJ;LrF5j+(gP8z}CB z_JtUp!Jxun8Hk}4lHuvjt?>v@`>cV?WN;aJEdhfl_m<%p%n$u0@aQfr^;oUoHgI2< zK@ni#=LSv|ehwJkj2ni*-OA7Q@~r@iLF{f}7Cg`fUuf|jkj)+t0wvI(tl=2Kf&H4O z7I5Jim?86$LC(}qU+m1(_Js-e8H(W;hT#xO&JQyQ5C=vX zHm(r4AsH%-nE1sEW8w4!@$|SM9BhFS`Q;gyj~kRh)r4^v6+sGRu*{A@-wq)bJP#Eo z$dtaJ;hd4CtZW(~sv514p|CL<5o#N`@t?f$8|x_?#qpfTu^hAM9MSQa)Nvh+sU6+1 zm*6oTYiS(lcS^*nL&F#{s5&fq zA~L85QaTp0B3a5Itz*G7lBOIiI}Gw8Cn_PEBfv-!rP%5__A4bx>c0%kB|*w03sNRO ziYBFFByAF#aB@0yawm(aC-o~JfwGqV9&0@!t0?QqyV`@gl+u~7Yd)BZD4!CFqD#53 zGAp%mE4i{Oz49x;GAzY%EXlGg&GIbKGA-3|E!nay-SRErGA`wEF6pu^?eZ@1GB5RV zFZr@B{qipXGcW~nFbT6T4f8M&Gcgr&F&VQl9rH0EGcqM}GAXk%E%P!lGcz@FGdZ&} zJ(DxY!5un569OOr1YiINAT?EUHCeMYUGp_zGd5*&HfggqZSyv9GdFc}H+i!+ee*Yg zGdP8FIEk}3jq^Bba{vUOG&P|U+<_b_Bp=*i69ND^t@ApuGds0&JGrwvz4JT4Gd#tU zH3MK1+#w$x#2qvNHOI3(-ShrE;WIwvb3W;_KHGBuG{GGdBp*7VI_>j60W?4bbU+ET zKn-*^1E3Sovp_mQ01os)Av8iIbV4b#LUU69I$=QC!9OjuLp}6EK{P}~G&=*J9sWZe zG+{(lbVXUTMO}16H9;QuqaE1uMQ!v(aWqGDG&~2uMDt@4b~H$ZbV!M`NNsZy?t>gS z)JU1MNuBgbRWtygb3Wo>Nul&gu{2Ay^gjb29^|7+w=_(}bWF)~JG&GOf`+e1m+bWZ8CPS;dQ+rvujbWi!TPl+@D*aJxYbWjPkP+t^D)1w^>bx|3$Q7zO* z%|jk))KMw5QZ1D}2mU}t%_BuGwNpLyQ@>La%tKK@wNy>@REZN(#Y0a~wN+j9RbLZO z$Dm_^1(rGwO4($R0Uu`zk^nPwOEa{Qgih?SoK($wOQ*_R=vX=oV8B} zfI6qOSoPC8IQ3e$v@~Ng0Ay5JxwThCwL9`*QpXia2Ou8iK~P;20OlbtwpBOVAs+1Y zUhS1r@pWJ4HC?ZC0EAUL#MNJ~G+8(FH4!x)deck&f>S3lFWi-2uQXe?BVr}CNdw>= z^a4d)GgBd!H@);`=z$)9$6^0LWJ&g8FZN0ibvu@IWr?&C*oGXIvovkCJm;Z5Z?-gf zbvC_p9#j)i{!Lb4Qxj1w7G{kUTC;;3koHQ!^&d8&WebB;efA%KwrJ%wH9v-E3BYKZ z_DQESI|lY^n^XXRRB8!>YGw0hgEngkU~AhJYRR@qDHc13b#8~WUkN}H-l1>(_8mS( zAO6;FkM=d$7Hj`uXydkU@m5EZ6+85{ac>k!-{ECdGiUmvJTcM$0uj zEH`wcG+wPXa#s^`7uIUyR&hVqbcIxDucLHjS41~~ZTf*mVUu-1)^!mVb~#sWZ&ycY z*E)K(cwh8s^CC@K(|2z(WBWE<>A`O`H6HrbXy(Ch85VorL3Nc^L~hQ-%qiFiaAR(07oH^YW&g_Zz< zSc8ukM31*RYMMmlOA4Hj%yQ9@i=R9)m`)0k0bPPuS0|x*+6quZJ+)Z zcy%*dxAlp$l|vUfk`J_QucLxJ`9K9AUi-mv33)aLfO>mYXjj>4YqXO`nLxvqbZ6N> z6E-!SQ-^Q(A99$N)l)VRb!>f96UvpCRrZz(RE?{Hhm|=#HC0~~BY_1Vn!B_e+5vSl z7Glx&9pa&6pSeKM7CRt0oaGZyB{ek}7BLbySBVyN^MV|-cmM{#bLQcN&DlOd89UB3 zpY0O>HX$DF76A6Qpl_CoRkIz6hEv_)W9XquHvu|{^_y=d9@yBQ-xFZ96{CZ+JXv#6 zs}-L)Izah&JIZ;aQQBGeSv#&crCqvKnYoW&dZv%nk-1}6X*#ESHCV+1j{bG}r%%tAT zut!v`>qD#&yRpStKX})%B^yF}ls`CjvN3x=WAr}`HnTl@K1*~!8uYVCdpt4JK=>1| zOMA6>GeHB^K-3eVS$np56F*lPL8Q}KX?wSGvpmnULPB#ic~-W0+q0FEIi0hXKXbX6 zySbhFxuH9{rF*)mySlCWy0JUEwR^j{ySu&nyTLoW#e2NTyS&Z&{=CsUz14fY*}J{n z`@P{izU6zq>ASw|`@Zozzx8{+`MbaU`@aD^zy*B33B14!{J;@B!4-VL8N9(A{J|kS z!X-vIlRL?{KG*!#6=uVexbxo{KQc_#Z`R8S-izv{Ka8B#$|lQ zX}rd5{Kj!S$8~(idA!Gc{KtVj$c22!iM+^-{K%1<#z%a~nY_uJ{K=s_%B6hDsl3Xq z{K~OB%e8#VxxCB0{L8^S%*A}n$-K1EXrT}SK@ezR z(HXrptN|Acp^6aU7QW$O86(eWp@;&3_N<}P>BSl*t%@Z58z$p|1St>@0p4EQ)lowq z#=#a4A=3}R7APGuEWHo}0oQF|988_pPealUp@xDj9GaalP`!vE9T>vF*>o#1C z|6LGB?jk{6H9)5rbZCVmc5w7XuSKc)!o(cZjT?PMQa8Kw0b%Kn!OzjYHf|;v1f7Q{PLKv6&zQ3AbE6;hA<(~m5DFg_hCv_B9`JQz zACy562Eh;ffb5mQ<{AI;F+cM)fAcxN^F9CbK|l0GfAmSe^iBWtQ9t!nfAv|v^N_>KSgkw5vBfBBie`JMmyp+EYi zfBLDv`mO)^u|NB@fBU(=`@R4B!9V=PfByW*zx>Vr{Lw%C)qnljzy00+{oz0U<$wO^ zzy9t2{_#Km^?(2QzyJOJ{{aG;z<~q{8a#+Fp~8g>8#;UlF`~qY6f0W1h%uwajT}3A z{0K6n$dM#VnmmazrOK5oTe^G+Gp5X$G;7+ti8H6pojiN`{0TIu(4j<&8a;|MsnVrP zn>u|8HLBF9RI6IOiZ!d&tz5f${R%d$*s)~Gnmvm)t=hG0+q!)VH?G{dbnDu^i#M;{ zy?p!n{R=p-;K76o8$OIUvEs#y8#{gsIkM!*lq*}lj5)LB&73=X{tP;_=+UH0n?8*? zwd&O*wdMN9?Uf zWKKPMZspgdYyWP&A@=Xu!!sODp1S#k=+ir2&(WH9_vNiIluti>KKl#t=LgT9LjL`i z-G2AYM__XX_J?4C$1NyegAP6yU_t{{D5H*=D5;{bRca}t6j>UZLY%_p>8GJ`I;y3mDthXn zsS>(spsnud(Wn2sS|_b=+PWsLX6hOyuUz_iC9qNo+heSvCL}AdI4WBsvoJclBD5w- zDPaJZ$mG6HuO~h`=DBLV zJm<}O-Z|*L=RUjf#It@p_Sd_U}H zKWrh0Xi}4(&J@le`XGoyd{Yp;BxgZm6AnW3VGs)KLm=4c&~D;J5q+>lEz233SoGl# zi706zJepB=;wBM&xWz{w3L97`Vx}|=gdZBJ9c%Ri5eP+uAuOs4f@*X&;aKP)BpL{0 z2vw!DnT17<+6O}52|3!zPCp8PP+0U~peY@tZJde-diqLCtPd8Qk=eYsI?)69}bZpYsw}WBYmqSaRZD#7=oGqfTml!df40kuv8KH zfDJSYVc1f}Rh|vyC@eB7zwhYd53taNF}Au_rphJ}f?(`FxG_=Cp7J-hcr0uPYY5rW zho!g(EJ$Hv2tXvrn)@IGAoL1Z%^F9mz|ie?M2b?_1Y!`*EzlnVfe+dIG#Saoq;Eu8 zi#X}Bt~u?ecKQ+2f1K8=<%KD1o-rF;R+m1w=!0$B%h%Z;!wj_jUn2#mHlzp-H{I0eC73;)LuehBfRyBwQi1XP-` zAoO>5s)*u1_zz4D4z>D$(AmhM58=J^5Z{biPt)hJiItWGE`r5RyMnDB& zh;PQ)+H$rHJz^^xr%IUJ5_1onhdrHP$kWo}ZZ~lD0pUS3nEu}6Nvv&!y>0D?8y|x3 zLpTyn9gZG2Ha{h^o&Osfje`C)v2+dd3NZL%}Le9T7&SzK4HUB zJ`deJ2c5Umn}cRGw-n}P{Laj`t{rAHytg?gH*Lb4@jkHq=-&Z!IKhcr=Oj2b2kkZ8 zzw=En)uIodMZ0zeUwBzlM<0G@dAwh4cfE!Nk$I zuO8FF`KB;Nk96C-q7M_d(|9)@k^G$f@7kdUR-2CC-}3YoqMoS8gMVi+_o4XH8GIsM zlkEF0-^{UrCLtOM@<7Ob_D()Vi~Y-J|Ik+1^$)~wUHj)7f(2Fp$b8Gtc)gTtiFb4{ zHyztIe>x`{2L%WwWl~0Wfo>-o&#+M6)(3wuPP#`OLdSgt@>2;FP=xSsC>R_&rDxyf z2Y;Y^A4qz(@q6LtUf&>52~`Mw;0GJGg4z)dN0xU-NFA#N2ktT!Ap@KRXeeMg)Wp$&i#2(HzJ z&Jj!LG>3cW9316!fY==OBu|PEgV+ZVnlvrxM<9FWg8`T=ju?r|H;EYMAdtv_^j9rZ z=slmXTsxJsX7i4&rU(5H*n;)$y0My$As&{&Jo7>(4(L$vsc)>w_$7>l-OjJUW+ zJJ?B}B#xv+j+^9*mB@+CxQ@XHf{pl&%y^9D=q~lBj*_U1z(|kh=t}Xpi~5*}{78s! zl!~p$joavr#0ZY#c!tQ>j+ZEqy=eZ9#psaDD3QrHkn>oO3W<;lX-eAojR`rDAbFAa zD325QiyWzPvv`ox_>nOQlQVgZGFg)}X^@=Pkm&f3_85`-$dY5okR&;jCdrc`S(G-} zjY{c}IN6jp36(jSeJB}_8cC5>xsoc$ju@DdSh5f_nkLlQzujY@e^phJYmi=gv zJc*G&xt1O2k~&G0;n!>6gAK znyhJ*h*?8)d7ZPlnYGEAw<(>PnV5|EozYpI(;1$gIY5;8n!DMZy_uf5*_zF1nu1B4 ztLc!;iJi{ro$m>r=P90_X`cQ$pyT7EYyp9G4Y5c-?> z8JxsJd_iBYI*fR;nmidMH{-C|nvS zUb-h>S|?(fCkjEO{xu>e74f49qA86cq%QKNPr4>;x~2p|r*Ud1Mhd5TDyL?0r+nHG zAu^{G0wQ%vA0KiMg6gM)ny7~A9*AlXiW(-6S`d=TC6r1KmU<L#}O9=tjyzN#R=s;fdm ztiqZh#|kI7${Nk;tj`Lq(JHOeO0Csut=EdJ*{ZGE%B|h%t=|f+;VQ18h^l%C7C|uI~!3@hY$LO0V^5ulI_t`Kqt`%CG(Eum1|L0V}WrORxoNum_8<39GOR z%didWun!CVu@Nh=6HBobYq1xLu^Fqe8_ThXQLILytaBQ&emb&~TC$gVvYVQ+t4bWp zy0W|4vLY)IrfMXpTB*o-t2UddIQt$t+o?ROAU+$aK${^#TdG9+AVy2GN}{w#n#L4 zik~}5x#Ve~0m`2by15Cup)P8p^SPh(S-GDZp(pyH%Ne>Y>bfclyQ@p0qbs33N}&a+ zpcDQopcjg|I$F9silderd8(_SCR&`b%c8MMyTpsRq`RQm8KcgtyPaF1x68ZM%ekhj zx!9|okQBYO8@#<+qso6h}2u4{)@itTfgNSzyy4~_#3|G>$}g(!227&4Qjv%!P4D#$pV_TRg@??8d0bzE)htIxNCVoX1!^$6AcLQ=G%E8^~0=$97!E zc)hx`)Jj%>m$=Zy}-dr1jaC+e^%i}D~ zKHSH*?970S&AogZ>io`noXGI}&FL`?f`AC@3>#NP2yiFR^IXTrVGOkp{tK`$3&T*S z%XrZLfDgj}2!+6Jl&sISkqn4%WQOp36J5-HybrpTh@gBN$?ymAhtAvU#kHVr;1me5 zFmRmg9*GbL0|#U+4I99)Y0+eR$vg~&Fih3=4=TORHmz`h&fEmtVL^@@fFNLW-W+y*;>H1J-7Q=An{IM#XO$79VSw4uIQ4e4{9AvfsuyK4~Gw=b@R=UVd&n}JZ%eMhR?-dU&LMUgOCrWbqL=;3>RJX zvjJVQvEt{B*lRz{az5bdo^*i#?F)aqL+WWVr%=Hh0{?~JtFZr<{Z(Y z*c~?T!T%2qIODOA4C;0W3LovKT=2(SaDDLe1gae^1 zWZ2N*Lx>9#PAs^OP#|jqZ4vrI$kxAGgZ>y|M$zQIh!RhpOcbc!KthIA&P17#CPiX@ z{2cl-=un?Q+HOuv32kUXp2-Gk6Ew)yD?hJ}8Z0{1psYTEV9iSOCy=n8imVo_I@avX zvS-zrOuKg9AVK-o5^SqB93Ywga~0ZLo2-vmy>yEXj%fDSpF$Y}Q{{VhP+o0*U+I^qw;Siyi`%NLJ|BDU zRvW9&u*JS_!s=s;H(}@w&)Pa|%U;D>%GN69eU$snZ-ER69bUM5d5GuHKUDvjczdhg zZ|*ZB=-YbfbC&^1lv_T0ilP(HsI!b2q>n%jQA80$0_j7R?cM`$sQ+e4FgXb)q^Uv; z88fd#?=l3DEfL4EMi4~sYiO>13L%6Z|4JM&p#h^?D<4}B5#*1a5CO)$4`-Z-!;>zg zOhzF+OfShHkz{hOAfNsu%E>2*9MMV;YlKe9ld$a2OAW!CP)q>HgwM?O&{R*&^VsZ8 zOTxG$F-kd=WUo#dsbtd4=k!dH&lu^%6UrqAwKG3M$$}G53m`-lPW46AUsd@v6<}BA{gYr>5vKKCOXHPSU{)1|R$^%( zrj}xB4Tcrta{e{8mE#Q=Za7|YL-sh=lXp$I*Oh;5IoOwnjk(yFj}@6fl0j~==45$Z z)@N*i*4AQfh4%K&oQ*!0VTT_^I$x#NecD-_S1NgDqUnwLU7VrL`rwUPQf~8r-u3jC;zk9Uj~4wfB8{+`042``^C<-aFmE3r_pvx|2Q}<;7KQoaM(| zjvVI6Wv-m&%WclQXOYG38=&3{fk=+%cFz2C&$Zky`UC$7EX*9X2m zurcjvnvixi-FYyFWiDbh)P&eR;yGXFF5H zpTF4q{_e%syZG$Ur(1o%;TIfy(&abY{G#nQU4PW^*Bbls(GPa~vmF6(CqUg9kazwA zn*xQ$K(#p#c}#1c1f7RK=vh#D8l)Zs5y!#rkxzCaq#X#;N5KG+5O^khp9dM|LdU@n zax#=04Jl_s%i$1nC>-I)dWf$Q>QHk+X1kqd0(2PgT!O1?0YG2G+~?wHXXuEIeD`o;N+4x8A47enR6lNe3CkE zMa(1_bC{(h3_OJ-PiWY4M)=g{i1Xc6P6wn7p614<0s?9;b^6VqE@r6FDQYl}YEz^BG^v4EDs-A!%%`4ns(SvZYE8ZR zRj`IttYal>Swq zMpwGirEYbtdtK~iSG(KgZg;)=UGRoiyyGQrdChxX^rlz6>t%0y-TPkn##g@crEh)h zdtdzKSHI{LhAmKG3IGRKzyl_5fen0M1Sc55sIY}Fn03{cW_6ugo&HN#2LoXyS$LTg zzLA8Xf#G<17{vD!F^AQn;Q{sczY1n?i(UNU0W;XaU{!`KV0>d7=h(ouPzIb_nqihU zsZTMeld@~YGW>kSGtC4K2G*T~FNMQA8HJ?DJJ%b1%!^C?CB=`;(-(wJs-g7d7<6}MW} z2S!DW%Gk*o;`)ZV&LOXN=<6W@yNHB|^{kC8;94v6*vlTU{;k<4>?1-uiPBzTB%652 z2~zutMPYWgO;J;CGuzoI%wrg}J;rjU@!V%jHyzi_HHd_J+2EG9vBw?7TU)z|?{*^) z8L4kU@>`DFuJ^3zUGP@l8;}0hqrmOxa6Y!%j}QkWz!6CpgvAZKNpeM^9Fhd*c*m99a+eDz-ypxX$|-4bOWGWhIM*c4IXM`Z$6RDVm$b(l?sHEf zJ=aR#HPd_T^j||g*gz+GpEq9hF&o|7QXe+gqwV!+gT2}`-?!Meof53``RZxsvewmY zc62j*>tqi&+}SPnx6}RNRA;-G*WPy>yWQP(Un9Bx@jiIHpPcahmg2|J4)`$t9r8C8 z{KOYO@WWd^@j1Wz!#f}G%!i!slMnpMNnd)IKl}3)-+a$o|MS-;J@!kVebZTfdK^n0 z_bjfw=xhJ<-$y<8Qy+fUi~sfGhyC`uf3fbFkKo?deDx!re#w(R_RvfJ`e$$a(U<>x z-kTo$EslQKw;%WJ&prF*Uw_@tfA{p~{qf@`zxe5&;PSh_{d<3Z;qk5d{$sqEo4@{{1Is`D+dst%K+KCj#A86tb3o6dK+uZ_1XM8R%fN3NkO721&67aa6G7M`LD@4w z+CxFxBR~!$uno*W1#CbS1il#*z8WOH8#MmD97MhyR6Z7LK>>R~1dPE6>_O}ULEke% z?)yL{1i&8zLI4xO0wlr_L_+OTLiB4w!?Qy6<3jzzKqz#<0}MkdEI}_^z%!J=G%Uh3 ztU@h}qIe6#W*b8&EW;CQLoBOhG<0L_hRCEQG&AR6jrr z#16a}NEAd5bizYi!AqpUOtisG#KBI~!B6DDM-0S4q`yMM#730AQ1ro7Ji=6rz)_U6 zR+vRvtVLVA#a3X2tfNC9JVi}>#Sm=8CA36fOu|^aGgeT99pMpXY({5%MjjyqSBN}b zY(Zb-#A3WcVa!5e?8YsO!$@O=mi~Z7axBN5(8Vn)#qqmFPt*&12#0>ihj2)Z2V4wp z7_^ymU&JT((0Xgn0{0vtW)y_)3xB%Eep@ zT<8OBcub`TOT8!r(vZwx?8%wv2hFU^u^0!EAP9Z%13_TCxZE;080X03-<(4wV(&gcuO4p&Kz5X zM4(XeTu+hc2v~rHDkX#rjn5Co&Ase1R(J(59aD7NO#o8`WgLlV6uK>03q=S7TPOss z@B`w+QRzg(z%ULXwNoDbOe8gnK-kj@Tnr`k1Hyz*hY+(jRmr4Guve&3xZn}=R8J4R zP5OMwJ_}R;8&N@+Qnl+(s|bf@_=iET4d-Ca0!7fkpa)wBO&vXpe!zv2c-6BA)IS}I zMDPRQK-7j1vw^Ho1#^WeD54gCXjWQ7I^1Vr%EU3}5G zNQ7NQ)gAr~$phudz|e|Yor=d4)O|e08*_zdTvG*81z2zm9&tzmlTQ%67fB1#F%?r? zG=xGJFeu%TMvXLy6vaDL!-HkR#X!$;J&Ia@O!RZo8(W2e9M}ZgP)XfVWWCpLIW|?W z)B#h3uXNFv1Xq(yRdGGpwIGC8XxO2+$^qq7h7dEP#MTpS&q2sijSVn+_0kYEwz)jk z0u$OhD_B-cST_t;Ra^{0fDl?83ub_Yn1#y-1x$RZ*Q)&sS(qLg-K~1=$>{&*wASVN_WIoeNgQ z$Np^dx_!8XspV6>_yz5FTC0fF#=XF}mD{Vui@F6c^Xv&@4KP<|&qNT~uT|EcokYQP zS#4C?gun`PrM}|>jzUmfnmC56pxv1Oj!dUg#xURYlvW0EXGE-srT%-qo@4wOIvo-`rbXLX_XMwO?aoU4*cPLZII6{X&r( z-+;_qLttMQ6JW|CU{f^U{iR>${noYEiotzeSnOXNn_HDENQGSC6&^@>1>0qf{$Fhc zVHz%667Jv|HbxUZ;j1-AA7(~DuwWPiT;@w%{Y_v5Ufm@2N&c{j9^;vvJY8Z42IDXOMkkK6R=83$PGdD*<177KYJ^`o>|$@V;To=A51wB* zEMqd%;C19+B);PV24ozrV@KTK0*2!~o?$v(WIN7bB^G2I*5f+lWAKyXB4y+c#$-Gu zWK}fe4MyZiR^&$JNegd!M&(n6Wi<5UJ_hAg7UfJHWlb(+ zQXb?#wB<@>J}!R>oy(H0D@VW`$+uYL?|Mbmn6IhUSQr<}s$` zq{ZfMM&?wOU`Qn5-LquJ1?ROD=Vf+hHq_>HCgyq8W_A6O?+vYj%mo7>6EL!tk%bq&QUK8YJ<*Zqz-7GPUMo6 zYHTFxr$*~`Y+|1NX{BaffyQZ_uIrZ0>AUXav0m!9KIF3w>v2ZtgTCqhf)3`rmg}+( z<-Zo}X$EYtX6(Rr>BIJGhAFl%Ot!f$Y{GtJ$8PG*4(W%mY$(L+N}I%26A)6XFjQ-$ z)sCgsuBF$`rP%JJ*$$=}Sv4p;ZIOYrK%_LQaF9RzTLqHjOu>W2O6q}|6KZypvrUy5P z2;ZrwBB}|ehzdul3umefpNI_~i~}#g1m77k_aWk8v5FaT>32 z8^3WJ&v6~!aUSn+AOCS64{{+Naw0EsBR_H^PjV$+awczbCx3D%k8&xWaw@NKE5C9q z&vGr_axU+3FaL5d4|6deb22Y;Ge2`QPjfY2b2e{tH-B?Dhp!R8zY;&D4^M~?*QyS; zsylBQKd-P7+jGL0^OuCYI`^spZ@~hu5%%to08gnt*Kqg#b4suDf_U_nigXZfvP3U* z+*@>on(hoVZ|Kl;4M#K9Rx?Xq^-3qGR4)oq_w>ml^>BIaFpTaCQ*K>nbzcATLems? zvUOSCJzQs&SRZvwJ2mYFHB;|(XNU0GE+$wX_VJ_jTmBJkASCTJh3cYyc5mP8F2r_f zpFC~fV$@~oi2m$vU-yZ$#Bsmn#Lnf#2KUBhcYA+q1bz2m?(0vUcf6+Sdk^@u-a>tU z=6L^Sf46IZ7kGw0TY@k6dOrB1PWZg8_=dmuuVzDtkNDF)XLN68w#Imo-y-*UqRHNP zjzi~*&TP(x?2&)@4Z^kyQfQQ~YJP|JZ4Y^ag?XM|=RK@>n7;Xar}%}}?4CdRndfSn zh6bRwd5I_MoLBd#MtZ7`d7Vq#nQeN&Q~8l*`N978st^Mp7JBQm54yB>`lxq#&vtvgAN#9M`h}Q#{p1yl}kL<~>`pVy))5QFO6a2^b`g-sD&&T-C@1nmaeY$u2 zzQgL3t7)HKebDD3MNwDSmp9X&eaK&H$;W+mZ~fiB{NA^--w*uY|3$SX{%<$_O+o(T z_dD5Ve$@B;wugS!*Zt`~`RZr2YL3=Pp|%BbKBv?D~2`5&!Fz`KZ1XM|EY4_=r8}bo`C+fSDSwO zy(J%g_93`Yepazn$RHjm(ue+qe{k1Pc7Fg;$Z+G$RbGL!jX0o*&;@ANfe4z0np6tb z*C0m^y3|%HfArx>M~e6X3oMEd0?3Dn_+f}5i3lQyi&FLHT#22fc%qa5K3N@vGIFGf zD~Akn$cIqD$Y6ssw$v7qUGC@yN38sTh$*i8kqAevcnG3gA{Mq>lvDB<*q(k~iRGJz z0MZ8`Iz|lz#7U1pw+sSEBKGvj(4T; zSYrq*<0|xPU%_5CY@vZ1BFk0E%E)X)Y#}1ZMuTv>QH6it*he9&n1be};IWd^5* zE4%`Q;|Dha$)dBI9M+Jw`G zH3Ge&2tI%e{`1c=f8Z=LL9oQ~dBI}~_BUyPZ>NZlzXKn<@WTgR@q&vgj@2Q808hw- zl2@y-AFRmI=A3n2r8#JQm&N^ZvnaxiF{8JPh%&?kLX0+loL&p;{sP0yzWoX!OgOWc zYWr@u16pH)t0+Pc7V-m!0AaubA~1mpTp$Af;D_TSu4z~?){b%nz29jqV?;7i0F`7X zt>7s)CG*_gxM8V$Kq`1XJ#T9-ioGKV5Imh`S5QO8%hB{QZsAvyL`~%h)rKCb1o&|{8 z3)Fr7S`jG=ZOssJoFg6UXvaI+5fQLJmJ^dFD5!+dN@~Bs(usMqMK&cS zIG6gJ5RDL#sFW&Es~Vf3j^&|Fo#{olN)nu&469->s#W_$R(1N%t7;8NSJw&>u!>EZ z;i76;>w4CY#?!4{ZL416qS0^3HLQWHD>U!g$h7v=t$arl^5c1o4qOI|UH(Zz1|uR%;G*ajQgM2=Q1r8TWSQQKF}_K&WB)$MB+ z8e4|WmbT%vtzL0UM%Q*0xxKaBZ+{Y8;SQ6yidF3zm3v&?E|;Cn^~-aiTmDMvuGP2) z1MN{ElHICq*CJZ=?tZ|lR`Kd3y(lH`dDA1`%3PMcwbkrxsVhe7ju*i7H7kA5icS4i z)V-O7YHP9kUk4Aks0GGrei7_V1#cC;LYwemAsk`--FG_OwQwJ6idhZAQ@|Tm@rO+m z;)bl3#K^(0Q&B8b7T?&zE#BLUeKlek!-vL8wJ}+Gj2RB^xVk!?>q>!qVg44^zk*z{ zV5yvB0^_*IKX&qUgltnHXBEkowepokD`wJGn9C7^@^l$IRo1?_q-BQfnPr=1HJ6x_ zv<356>kQm1&$+>H?%aX#JW6H>m(O1@^6dZ}XhILVQ+GCWkl7qw{wW)i%*oaCqu0Y| zplzAbr13IWF-=ZCJJ->jUag$tj8svt*~E-h^k-FFYfi6PI-llSsA26I#i7EqsGzk< zTMcPr=XzYbzN$-t?d$yvTXD89tt}jrkLBdUCfC+YwqLUCWRI)cF8Q`?#NCo4wj{pNQ_huG`wTG55F^UKMid z`$P|!4~*~@PBv!gxjYF|6s+wS(a!#(bDpF7>_Zuh(6J@0zoJKy{6_rC)^ z@PZ#a;R|p0!y`WNieEhA8}InXLq777pFHI&Z~4n(KJ%L2Jm)*_`Okws^r9a<=}T|= z)1yB1s$V_pTkrbU!#?)1pFQnsZ~NQhKKHucJ@0$(``-gU_`)AP@r!T#<0C)$%3nV7 zoA3PRLqGb`pFZ`gZ~g0IKl|F>KKHxt{qKW6{Nf)!`O9zq^P@lg>R&(m+wcDO!$1D= zpFjQUZ~yz_KmYpQKmYsh|NjGE01Ds$5?}!u-~s+3U;--O0y1C&I^Y9BU<69w1X5rH zTHpm@U3bJ4ey5I}KU<}G2>p@)&+Tac1 zU=Hfw4)S0R`rr=&VGs)85E5Y#8sQNlVG=6g5;9>EI^h#SVH8T?6jEUoTHzI9VHRrP z7II-1df^v>VHk?x7?NQbn&BCuVH&F88nR&i09L6CX*5MuAz#Qh`9>!rF z${`=dAr0K&AQEB?2qF#4KpoDZA<{r2I-(2+q72l)3?QNm$iNI-q9w+FCDMQ;dZG+$ zVhn`hCc?lAz(6UUVk)AdDxTsCxZ*3CV*V+b;tP<#2-xB+;^Hm7fGvsu3AjKBi~tFU zfGv^$EfOOM2qQ3#z%Z5oFg9Zem_Rg|z%x=K2$%o}fB-aNqX~on2y|lyWMec!V>Et% z2bd!Rpkq2RKm(v7JF25PdH@5MqX&FIJ=UWMq`(TS01BYMG)`kbHlsCyKnKiY2N)y= zAf!PmWCv`32!wzLlz=yifJ08C23X`pYCtd6A}=nZ2xR0$I;2HrfCgN^1yn!Oo z(jy0W00*q&f371tHh??+zN0zv=RBI@2bcf~us}XSl4)1UC14)rU-D&^mML7KDPS@tUD{=02IgTxrefA9T|TB|@@b#?X_`)^W^!g{ zex_%(zzme;3Xo=L+U9D?W*;shY`W&7+5l=YVk6GLA~s?m;^uAQCL&g%CjuvMeqwNH z;&Q$~3n(Wj%0T`sUS}*KCo8_9ELx{4V&^X2Vv%xWu397r*nkX3xOEp2Vf&V#^nj%r!)p6 z2q0(&aDWE9>xOP9vW5T$cqp=BWKK@xMjjXQ!~i!w}G0J5qpIa*^q_9r^}Cqi;7xBjOGxU1?So~439 zBZ8)Gyvpl^GUNt?fJJ6#hZ3(ydS^#+q)v`xhI-_RBCL!WtVx>Wj3Vs9Vt|e2sKW;7 z#OkQ`{^(3_vX8heD+ZT&2vK?36C(R(55T%CF0+CCr-TUfOTU z{`TX{qO7^TDVp9dy4G*b=4H-)C7cRvoGzxEVy0x$DV$oS4LEHETP9~h?bLRrXj*O6 zvOv}*>I}3%ApW5rD&h*O@F41;ACB!Eo^2g&DyZ%zBU0iG|7LHpEpY}Xsjez?ied}! zttPsvtzPFTVqyy_oP2w2~tN&+l2{ColUimPTVQp8)^b<2DX6Ah#*d((DRg zW}fnFSFUU_yX69(sRYNR0xvDnM(~_=^PCE10qdy-le1;UWe0cWV3y`!e&*B`Y74MH z3z#Mg^yUedEgr`3qq1f`8zKsC>ZdZIr#fN|pDm`^?IqG}tNt*nu4;55r{Br|6T2d+ z#v&}HY7DdhDq6HFj=-(b>JuX)zf!LH;_^~bZc#4fY0f7kXXJ;{CsVekIIi@yu5nX# zz#Ge_d?IKa|L1`Ev;(Lkf$lLMyD%_U6YK=UsPtYqO0qTfk}{6cwOp4kUGJz} z$8u02X|4vNPu`@z{`Cf2t5T!oR8I4a$FDR7vS9-KYVnOrfoEx;=^6+sZ^d}~?CZ6g;yTEfhbmAVaMMv=y8>21KA`(AwE+%DH zAMZy_u96NfgS&J>f~2Wf~T2r-EC5tPwN&?dRaf=95^pBMc)wa?U$?bM#%Ni)C@60@ho5y@uQgh; zwM@SCDku9Xt1^$aGKz~hE9&*{Bu#epUtg{BQ)WKCwwS~A48*oP zTcXuQ^qTKB3a_wjHmVHMa1C#&KnphxL!xm5F%bXl-TE*SH@6VKBB9Tsbyu_$Yj<^i zbfOpQqeHq@AG^6@B($108=K=zhvtMbWqL3EWE;b`8_TrJUZsMTqr2`m9yfpkxbCXA zqaM$r?go4be87XE<<&Fwh3Y!5tG!eMJG^3bS7S9&=4(}#r4^hcbuDs0FOG z!X_;CX0IvVC`*p7Pt9;VCFSmRC>Ug`C?7(lSR0?F6 z%KDJ=dz*rDlOJ#bi>a9&Ig}eb!V@i)E4(;sxx^3V3`{(1m-%QaYMINknw#dv+cumR zV%hrk*yi(_)9`Q$B0*y+Bz|fqHex2~`En~Ka*pDkZ(`L__ug)_bmKgtS0_j>x)hW2 zk@j^~zkP^KGDeh-uuz|w@mM&jz(69lg2Aw-A zlHedB!%m$dhziwk0cnK_7b+;QU_k+e2^6R*wOZk+QluB2TG)yd1BMG>$CCZ}G_2UI z7&5eNn-*?dxnVQNb(?|cUA!as_62&^s0I-s2x|xd0`W=2B~2Ve`N1*D#s^O@HduM` zWz7ar7|dLvLp)Ct68^R4bruW6tZEn_T0Ji>4L6P^!EMRw`$C;zCxBeczI`kFUrEmAXf(7{R;bnwh(V_+T@GWGZk0GN*eEIX| z(}+KV27dbcV2GiG_b9CJJq}%P z;e`-I3=swxMjY`&5lMJqMHTrX0Y(;KB%!Ymh`Ldy5CXGFu%LF@Ku4Q6P^kl(IylmU z4h}1!1jJM#EQAe?oN`K(IOrfr4?tj&$B7$h54_H84Lm@>1`~KRN`xPUxI$s7{>VC&tF62WOH{A)g3Hvo;2JAdSl#;TE)o2?5!bdN6{@hqoFptU z#6&C2u@g>8NFpgcu#joWTn8_qS)q`i|j=ZJ&tx7X4Y?%dgu z^DR4bfxC`g?CQN&h3%~Sj$eLRDDOPM!k3WTLu+P7T1uW3Mie<15 zK8zDo@Ie4OoKQjy4`dI92i=SC1r1Gn0R|9LhG9h#N|f=$6fKl-1R80~Ip!H*%y}?g zL!eP84ibe_r$>!^i7+Wu8dA;N4LBI`YMhA7h$Ch@GA&O&Mbc=@GtY!`1{E%< zh;7NXU4b$FE}K0mNikOfbb$>f5&;GVHmLN_z;hbyXb;-RuX&ePC5V@*UMN^X_)gGU+In6CD zRTxMB1^|hc)Zt22np4YMQm4Ar<;9VLiIm}Vc%<1~Qg~Lh;$|Qt65wIxchu6%NshG{ zPjYKbxG~;pl&7xRG%tE{ilw)#R~zTBOJB{Imkp5PJ?C`qIpP!M`Lt6VW2TQ^^b?OV z17l)`LZ*k5siSRjlSNLTEzB_Kd34JXpd2C-DK=mOV=N=!V6v0E0ciwDV`E_2 z!ZHlO}QY@61UPc`eKKW=jK{$bl>5Q6Nt zK>SFEJqRi%g(76I+R7lE>HN?JQ-&fIeaL6+>={0DR@@mC7oSDh367MOw7_YA0XG?1 zky;o<2K*4aQvxfM2&0jdC?tmh=_H;S(=~6x=ISNRij+~NQ~&1^i6=b%>j~KV*ds9bg{%ds z9guwVHy_aIPhtP#&w#dxpo%SMwF+D<1VM(|2>Lm;xHVXACzv66wuogN1n!LF*=QE^ zr7tA>*$Iie;-N^&g=XZT)j~jn7~FKfG_l%3LXadV5hYCKR6jrz4Nm+Ay6GP0_ zM2mRQO$^{j5mBI5Em{%P93|8k{p(+1YuZpPY~fBWa1#t9jx9%FY8|cexCuyL!W8yY zP`7B`F;Vw(+PL&oBe}$1H-b)H0`A8U6X<1?=&7L$l60>H~cD4iM?miQ|#9$Q2 zLtb+9l;@>Y9uIm0pXKqsx14hk)?J8AY%S+?9WD4lGf*%rkiZXcU5XOknFF-D& zdDe6k?#y+F3n&j^LerN>aRwwP<3vnQL%q=iOH_MW4OfCgH|?ozq$w$oJrg#CII&E% zW+|XHQV|cBU$O#e$$O1)5^iQ|!4#9VR-6;k>ytCKoTrgV0cU~*6Me*L{=ugSLZd&py@vAsbV z8if~6HATj2NU-?(=+Uy_<|3?Ya>>14{-&3V#r}A9`1NJ)q=$VYU!R#X%N`8DZ?gds z|C&2HG5U~}J_Di{H|@Ml`@Qx-8~YfBa_(oGTc|=QyI_TYj=`c6UFhbCW@03tm~PTY zKn7f(1VUg0l#bmbscG5>Ch~>@Xeyvw!f&LA1#aL24$5kNs7VqkpblzEbPeq+0t5_V zO*m<8-mWFgMgio`i^9kv=0xv2LZzsv1Y7FZ2#@e8g{EHUXlx<_9B(X|Z7igXD?BBS zB4;Wf$8qpTQ?jDMGAE8SYzZ;U0@MPKJkKo5V)WJ`F4WCe{DPlU4~C=!p=9ThVlR_u zPcg(Qt}J7ebZ__QFvkWiT83{mj%+oI{x3CT$;q&X;)bJpmM=MgDSPCFIxMbUF0MQD z#XGEzqKq8e`0DF+EdK7Wu&ILLkOP8eYI7I&fl2GVHhUSEn5%qqBFtWyl{)X6YBEVcKzg$8{4(dvtq)2Xp?5Knsu>?!TYrLpM zqjHVCAfg=`U^OLTOx)xo?j$jAFdvnOifTxT7=ZA~q#yqg2%l>Me1wgV0vd55D10hY zB#bH`@{XbqR5B$iKqvkKHqWWzXd;s;^F~Z`7_alHlk`fjkw}u=^5P`F3e_A+Nm%kG zVUHzSup`(`ch++@N8-l_&OV#0Gx`eQun0AJO};$hDDi4~z6Hv9V>{pl;+_wE25ZU^ z(JG|_D<@GBy{r;JE`HR<7D*00)X5e*E9UU5Emw{dM~go4r()=A&kh7Gan3>b>}BQ; z1}sP~TL45Zq%Toq==@Kgh-;si?hHxt^cE8_EzN2KOmKcM2q|#brY@#x=+vy{CDss0 zMoKg}Vypu0AUNXI9%3RKU^QFQHEGao=!+zpB#boTN*bc-{zf-}Z~+{^*nBex1uAf$ zaVrk;D40+IApVD_s3HNP(5Rl%Qz#$DsQ+RgISTIVIK=lsC1rK$sF@jG&y+t5egG-9?C{gNo)?`l71zl?C zKp`tZ<>f$k6__4WI%a^E%qQc_=gZP8%)sNagY8DQ{=?H?mka0b!{2NI4_Wg?q%j+|2pF;W6Rr*g7lR5~S5GjET^%`LzX zb3{*(NbHb!1=4OLQ!%Y3S`0L;=vrFxC9h>P79#}-PBcuFPlzSpe9ZTFEI(7DTlS9l z0u)bXRc^RNAm9c+oANZ868gM@S9^(W+eKff(m{pw%g(1?#wUG<)jYNj`*7&8FBlpo-9p z22yi8#Zv4@aw0Nv@~Bg)0y_B@IxFmF`6xTnqAo^{J1=Yu)h#bphu!dE^^}HFu|!MN zlQgRK4QG>fOhQ!6>bz#>hu#zS^b<7l)0BX(dh*T$jOfUk>?r3;ZPj*L_!B>qvX-jH zK)r)bconh`G;e7GIhIe$$S0SC*jUjAJ0k1j(1QlX<2=SJL*WM#GvpNo?c`i*PJ)X7GBD|OWgxK`J78|?sPcj*w5Fb4huPX?m| zhE!kil>ymE*af%WZhH&q%GOxx7lnWeqDJhF!ECZ6(S$fIj5r9D9=+E)$*Pb zXoETQL{HqF%8v;6Ek^Rh9_e)oEDhIiVZEz*=Z!sM6N94%VsVm#FDZx4$~1P&PEJEr zeJsiF^T>**h11s8(%B>a5U&i>mUNhIf0c&^%WfOAm>dysiFlv4l70sFU!3W1;b(%r z@62L=1}y8&(vlVNEMu}&nov%gFjqo2=C;a-j4eb4L?r0?a<_0)=>FOmj_qlLmTq>L zxdddu21+0UzVQK_`O*UFN6v^LVkl055P53|N(nZhG;@Zq1fdv~A+!WG?G4C4S&}az z?lM_5zf@yEO4sDE?@FozrHI(Z=;}~5rc}0493TQx*^H14Co~Okq%nS-!j(sbarC!l zA;+y9tWP_I1Z*G^GQkE&Kv6j_n7g8MHq6_MnNrCxD3rEdeOFUuNF})@BgjguUXLC> zwFNVHn@OWsM$=gGP*n}i_=MwZwMBjcREv&?ya05s_^^g=7_yjhhvB(y^Y%ODR(z_j zpS5y42KV|hai9%mf(n|?6#72QZxvY)b5G07x|p*^@G$2 zbw4O|gAPUlaJYO?c6;p%s@dnKCRJM$=rlyNjrk=Nl zoV0mGYNS}gB5a@?Y=CyMwt|J{O_n+$yi_&M2C5xmG~+~?L7)O5;;K>kYVt;XE9I+! zu-VKgX)0wPrIAtqXF9RMPLrZ3PCN=DG9u?_aw;GLGGQIafgIK$#%DYeM*L^}2xvpa z+^{p;$YQC)La9LsZo1xh$t z0I|vB#|Di|ZF_C+eqHd$s@mwqI@-nJjJ+jd-^GrM7Ro1!e$> z2^udmaV%$16z@#A<8QMR1VuwDTeBGERMGzY>_TP+EZw+tJ4n$yNYi&aM2cvneKDWB zTUTHtUs3GTPHlGsN(9SEi`OA)-I7JMAN%SkSx9S4Q*z^HhUG{d>NPW=l;Otw>?!cL*lQmo<$ zbNQ_ur&C~D9Wnv0gNg()K^@j16EL#dpmVRcknvb0JHcX@6F6y&oM{i!D4H=Rp4UxU zPfMR1-=Lhv&WbT?fE?=D;xGQizu#{_JzZQAyY)E>0{T?eK6VBn?D_%>OrAZun-lVr|oSikF9ZW-tCg3Y0g3STO zr~!WPUuEjTC6j$a9KB&+rh=+cyn?0x=K@lEIjyZB*&Qo9q2ev4-N``{0(jp?1q^|_ zQ7N@jJ&dXrcxe|HM}R`Tp@g82ME=!alUc0RQ{NM7#W#9NfZ}g*`5&VlGQs12Pson1 z4@ds9O*18{{&5_+X;2 zi4Pt=fB-QV1YHk!@iv%D{@HjYQR&e2hh2Iq}RQRpHLInvFC{#$kJh}4;&XZ4=P{GqV7!|T72maeQjB}cd zXV0FXLW1t-(__HU`@(wP>3_rb?S8#|`x!9c-k-r~f2Bu>(BD%?Z56_7S9$Q(f^c=v zm|`X{_Lv8ZA*R@37-DFcVI=^jA!8X1_MnLEWRl?tClr=qiW?fXVvB~Mz+nkA*2n@2 zG~#FijU4XSV~-`wsN;q*qOigWC?t90l1rv=q?1lI8Re5vs<5OADWssnmRnwF11)5zLljMv zsGojj6lh0nwpkKLB9W9*N-xml5=(Q=r0J$M#jvAKHu(h9PpA@Qlv6>G5W=e=3?)Jc z1k$QOQ6o@ARad)SWmQ(Ze#O-VtBn?x0<$qNn^>itm6vC4$;CkjiP?3Q37(MC4hz!) zmI;L*N~oBKgVDu+xeSn&S!S1M=0Lifo%^h`>1I||TCEj}8d^3 zeKjoyAuRqFf`TC^=E2R0O(^1H7Y-Jo(1itQf`^M0cHv^=GM!k7OM`$SiYBmF^@dhg zO?A;b)>s0LHs+|K(LVC%BakYJEo0Uwl#ry7My@dBkt~qOWR_VTX{Fv;a_M)MD%5Sa zm}ahUW0`3t-q8$b!fEDAXGVIG3@)@8QAGtQlu)1pDfAFT2MOd*p$sA9kw+=~JO&;y?oq6}sH;g5it^0KKoPghhqiw35}pao4RF^Ku0h{6Se2qn#kh4D~f zGK3*=jcYI^Vq%80MnxBK4Ms)dk=MZHwHjs7Z0ozC7Q1Ew6o9RaWh@dJ<0iK@j;U^V zvzy@FIL8%OX>UxbW8%!j0x+Fv1%K4jo#GS&7bFgHk*l1YAO$EsF+?C3Aqb&12N8vg z&XJE?$mu$gk~XbL1}wRhrb5z^LXwhps3et5aHl(;Bt6PN4duU_?Q zS7j)Jzq~vvGNb_@!H(4$0V?pF4@@8h82G>lEN3jukpOg(Q$dbFYyu!;4hKny9_?sQ zgwYvJcNBWU`m|@EKD&$!l2rQ5MU{g0~gvs4_A^-VA5BIu1@uU~=PA z?f6DO?(vT{a9rZtq$b80@=TsG6H5enCy%tiP=!iJLKYXv&GD%rnKM-WMK+g_)nTe5 zb|Pg+DkqYVv>=tJq+Kg_=M!4NGM2LRT?lG)6j~9FR>C8YS9*yc=QVGCr#TG(SF?fA z?5ivd$n5v%6+{l0U}EiX<`mrm1ZI?fGAQx(%vnY6b#*6pf=TN0k=bSAw16-}KoWMBRbIVUyM$s%eE-9l`@ zxf#@8Pz8ZVBp(@L9(%--os@y?N^-lASc)Y#Niixj#gkI?#CX4xN>MbByX4IZK*zIX zQDRks#g<^o8DO4mPO}xO%m#W?>DK}Rh^z&u=2&Z1)>$w+XJ;v>1DQ}qUz}ym*?J2x z%XCa^<8m%^@lRdz3#YmylfV8Q`Z5h@r#gqb8{>|}xR#d9z~reM3s7JJo<>dtBv8TT zEVsGQnND&>K#mb4l!GQ*D63tKP>yvFIK5$y1u&4Fh#Kc(70tDNVyFQb#?ob2NpE{+ zBiio0g=cxGnG+Y|p#6qGib^b^wwp+oA@)~@01o4VZ~jz*6MW!BT@xFQ$ZcQ(AMuMp zI$Re`KyEJHsHjKEk>S*R@1~CF!f?v);g%He43Ah(Ca%-t3i;Qsk|ZW>VsV^YaFQ5Y zGR78p2#pt)xk);T$8LorBsVF!Ow}nSnQ{pUKy{Ob2NriS$sLnTMU=uK_OP$a)lU{{ z6k2xCR+H^zRtj_)reI|@W6>;}Q4>Jdh$b!GJPorsz=BVZ;}a%;%s1u50M}9rF%|kD z_s})lb;Zwqmnkl8$w^yuhLh5*DK5cYQ`}4|7oKC0z;@?3YEoAaI{RdpbOEzZfx{!w2_OIjjr=39oyw46Ed+AYN|IaqpM z3z;;g-}>Qw#f?Q4U@fQZ{+fZY`0lP*HQl)fDo;y5w|n#Sa8891!3UmUx-qE*1RoRh z(d0=Jqxj^8lvJi5?k0uT=}s2!)5Q~_sI_AJAb?UUjA8tzO`6qCiky=wWoMJX-lR>X zin&i%d8)>~>aeg9E3p(Su7VVY4;N^@senk;V+aH77k!QmljWU z*MoHzPYpBye&=@%v|Ob29IEDA(*Z*Mg(pzr!BFTy0o28K*7a-WfkG*Cg#=YHmDd}W zS8SQbDw0)forgor^LcK8f{7t6(?qownDpcJdQWGN}Gr@Q7Ov@Bk110mkJ3aaI=nf@wmST=n#Wmqw7qHBWxm zcmK3p`=n3$q-p@Q4%E?j!=X?NH69vdY7o;f7POJWaWcK(FtH|uUI=-^wjUS3c?5D; z$##bBHD+|iGu#wJf(Ar-s9)KpU!-@3<^vbq=54*#B7aC=I2AVcwuoS~Aw{WEHPQlP z6ntN^Z^!3|jVLCM2uRUae3iHYGOz+PfQgC2m1@F?VYP6C^f!<$etJeT9^Ln=)j;IE*vFDM{8!#=|?X6o4+nj9V5UxIzLTP$NDuJW|1c zH0c$~W*e!|8UZvJ?fxWb@u-GWmo1)P0(Wsva&aysh=L3-E?T#OA()Th^Z=J(oA!ff zv^78b$dARv76Qpm5g--_DTH;GX$pC16f^;&Hfm4!X`eP7fJc%0M0lwNoe3p*iMM#q z`H>-cF%eaH5VcV80eQK0dB%2Zn`d6lb9BKnlhU#QLOEza6E!ZSQskgtL_}Y(CzPJ? zQbn0lT$3VR1aIsXd`t9)NCYF3=|xPbMO(B*H}WP|xs(G}p%%K7gcD+M!X{T$R%jWF zT;)j$2UZMsVtH~Vj&y#RlM#?q5p@}hGMblsnJEkRmzeSrv*Tp-7ZZf3J5DBz{kND# zcS}}b70CF1{z_U)&De~l5-THMbk~R$%|m7ykc^YXOP;xG!@A>E3gu!!qcQs<|@b& z0=Pk05$H=-k)#-lbV!#kq4{RO33Zu;SzgKk6SEF7fER1#0Vr?+3=kNFHd{LLO|u1$ z@KZ1AVw-g;PHRURbK0Bz7=tS7u>%=|K1iq#BmsR&cgm@>%^3mA*>^<p9 zm}-Eh9Tt;a51CL1HF*sMAI9Mv2DDN^+2bx{p&6 zGuKKmH<*JpSV|#fuS6>wfUwCkWl_2mG($X;`DH>uBgr^sVCrVUv_p#pD-yUrlEzM< zc`qU>8mQqcr_ln@{PFf4|gCxN0xXW-Kyg!=){)&a)KG#+wN`^iLsE5A4c7yfn#B1Q=# zS+igex>IMvdLQ7p8p2Zp=2KmyJ3R#_U(-rA!mn`h#hv@P7W#aJlO~R1Rb`dBCB})J z*bx**IfnERm!cA{+Yz%%SF)JL4neQD%g1rT#*c$?^e3>SqOU!Qn5OaqiMc9UR%YsT zq#{riX2y(2u~U(?b5hE&*BF7k0xJ!8z6dhDaKgOkXTzxaJyK*wF5J!xJT)e7OjK8DE zikX;NF%`&mEAI&cv9wb`!I)|GFPpqSyW+`ns}^uZK*v%V;+rpYCTCOk0an)zCh#oM z1Ol?@8Cz$wz+4&PRHysvv-eXOd%BPP2$02W%m?g`2ux26Tu;+1&C{&R%?Wr^JCVe_ zRZtvX{Ovo)z~Jr@+#$F_U~moY?(P~0K?WJz-5~^bmjrircemh{WPX?bIp^M&d*AP_ z)w{ZOKXi3$xrRi`}eFNHd?^6Qxs#Vt_Q!fU=-%T$T25k>!O}bq= z<7oBRs{fX0uNtI(@X0_+rtCD!`l$W~OZj`hD)+I66`=m_aqJy{VhotM{!m zbfJG?D+&c)9!ZqBnIbkc0d>t`2J#?i8t6D|8Gs&&Gdq8XDj*IeD#ivo@;Xb&@YGV`e! zS7HSN+KbJZM4;?2TePpunzsyxphTR^iH((w-5-q+-t)8?cg2MZG{H}E?2jOWu?l$s zJ=W5_y)v^R3Iy!nYpSCAX8y6!P~6N^Y)Pp!RY}Uswx7(R^GDXOcNi1GTOY_wotK7L z2lj{sc8L|adbkdM-E>s`O6k10c49GB!{G3a%%0b+K|olzsx4R)qG7~ddbaFRs!g&u z!D#!|lu{@B@053ci#L*G!H%Wfqx5GnL3U8-)I$BJa2AFE?U=j`#Y7fZfDCyap9~w` zN=L#GX{Csy@v=GFUY)QN=i`wem$ifKNuxK9U_#V#QyWQGw^IVH%d!hbGxiO@+m-~! zZ4bVCZ)SS$^PgtFn!T@)y{kce1WqkmloZ+6#6(UlAEYt)TpajK9Ap2%9DkO9t(3SE zdmJyhesfwKTG&POHm>#Kig}@Z;VW71h@Pojk^XMXp-Guavm}Lj7oj;w{b9b!5`Tl9 zGYf5;_V*RMv5qu!)a7h=V`r;$i@io=Xvp#U*xBWd@GFBs_z5!ds8jMOG~X>|5L!JT zoPn#zN!7K$UiXD$A^fNCl0bBo!)Ad^AwO1W|t6^PKQ1nCKw*v}j54 zue@o9a?j=pFvigfzj;YY*$kOkSvR?&%72+2yCS%JAwma}(!ndi1mTl^Ne1{H5O=6e z-mZ#XuOdFG-PMLa_k9qsI+XpnnBLMOj%XUjKogvVCzOQJ{7y0b_U8z}v=gfkqoA-h zE}-{W28Tv8;lkQ{yHL|sa)`!$)>`-*@f$uLj| zJW8~nyjx)}2BH)MThc-rB^v*e8a@vEpcDofA)8vgnUs72nR51JyX5WwHls`sJ2`s>UQ`iLSTda_+(6F9;C!}T>QHc8O z?pEnFT6g3>z7bp+fUwqOGf5?DjX<75^EFDkwTM4)=qAIl{jPUG*l%}viGHDwp(ti1 zRpq_gaOI29Btu&gPX<&1%Fl`91`l@g1j@dxX4K90Xha64?ZI%Z;iwg+8!pa<{7&dS zUoA(mMWy<7;bZVVnA8`Jr&44TK(-~{yv`{^jYh8b2A;4A*1sZuFbRAyVyjeo<`fhA za!s}Q4FI>(gMxQ0IXm+CzaSXytBMvIH3V0_aP(*7B|;G-4i_axT^kUil47**woZ8AfU7_%UEa!j^~=HpDpu^|y3%n#j%Ke%_#4PyvhCPIizPU|PR z*~yDkpd5eez|c)APedqoKOVIRj>dFH2tK#GP^citoE}ag_!cpp|C9=`Q1MM3PC-s% zS3LsN0*Y`-gP|}lZ~ne|SQCp{sZ}V?KF(C(b!Vo96*XU3Rnyw3xQs-n!phd*#jaFc zVRatORu50ss@HHgJ`vJC%EI=sA4a2GZ&T#V-_Swq=*0Dl3W1$_RJxuTkIacUgm+dv zCYIM*Bqf$_M%nU;Z}s>)hQOwg(o`GF-|}9ieGjrg)e)R@kwTqX*hNKus;uEEjJY^* zEqr|_Rc{efWr%ffPq%$7_PV>^`tvXLVBM$x_Dkg@;K;PpO43Q35+#UOO4lTXkPm0U z+2F^ zdAaO~rUOGDO)H`zS7=wco`^UMjsDX@CoViR-ADOduHq;b@iS@Z3jmr(e!r+=Y+-CT zNGvbAg2rcOgWb?D_8qelOx`7Yx=egCfY)cn$T6*aQDJZ9s>(YB?UkD1N0v2b6|_(j z|Em_=T70)c_SR+6<=U=8jaC@v!6VH(t)P_Rvc7|IfY5NL^kjL%Q>kkAZFW9QIpFg1 z#ien;?8NtSCLDGRz1K+AIb-5HZhWm zOaK8>t53K0XR;+O9 z(ukM;fXMXY9z|WF1y-3?&cRw2lXr=)pJtjy&z3N0eBG=evfB~P?#-NklNiZ%pzg>y zk&@mddPaoG8Nr3~qRfmJmU+&6%(d#cV%K~kHrLA->&>;;8|sRFYs@IvEC=+J9yl{Mx;sR_c^B}YY#r;0O0dyA5t^CT58<41CTEf86%A(K6`Oao+9`cWv50dtxb9Ip{imr0*nA)8-JzCbrvZk5 z{v+7>0{CN8l!A74YwGr-B#wQ`-W#D=&)HZnP&58JszzTvp+ldY6SPd@PF8@WMFYhW zQ&E^vdxlGb&G3ljNU;rnx+NZtf=UvEEmWn>-pHzjvK(W6Iofi}!Nx-pW5A-Is}{ta z;th;7O+H!qb*?=caJAhE>dL$pLgHS%JL)K{7Blsk8P_$5V_&1szU?UEzZpO3xv|!t z#BCB7u`h7v3^tp!c%hp~rF9@_6})nb6`{udF=Td;KP1G)w1B8s;M{fcZ&0oc?s7)t z1Mxeh;913|DKSi=k_V$xBL7jwJo};JGhX)lM!=n&cTVf}kF=?9;J@rx6RJ|`a2QeX z?ooEyv?IL+GIVj?ct0=;t)H|=!PfDdDrcLaO&-~hh9Y@Gx#>j<6)e4$&z@O=Z`7Vo zI2*l@7*7B~b#1zbCcf>HPHU zX0^WZ(~};axXoS?RXm@7@SG0uoS&~+X$U39|OsJiDv`z&~@q$7mrM-)u zE&_j1LvG{iiq*X7Z{}4G)K+EY(IJ~Z>}ntz%tK<_({#O@(ADkH-MF`onTFePG{@=I zPu_&{>X=(XT#DtP@UAN=8cDsvF|i>s>1%U-?7~R-2GK+-JNmez-u`0u$&ndhSfU@% z6DTdk2X2Pz8x8-*TU&xo0@V#PeqV*`<~FJ0NDw;wv#;V7&-^PH%}J2h?4TRlrlV|` zHyi9MB*?hj;CAdEvN+aJ5fR!O|8?>NNjR~1$NoWfhCNzQz~?KUvv_Xi^zh@^92G;2|~B9O*+eA45mW>;A70nsQix2n3wcY!0Jo-usvbjS|2K0rg>H zCDU}D<=B#e*xv9E|Ii4bMJvJ4I+DS~6_&(fr&aIb3n*3!e}TF#;0x@hVwL1pfd%T% zbA2|tm#9l+DhcNA(*nZ!D}%xH*y(K`%1$>l_FUG^x4h1CuGI_H9spY~n$)J0)OHF$ z+oOF*kWH6HTz{W3TBQ1*tNp&OooiqqK85HMt>#RM=OFk!AuJ;}q%2H5__)2mUKpj2 zst`u<3E;v0r!fAaoHj$L2A=!Zvl2O4@~3nz;rIFsR&Zx`7+C-q4;|8_^}vK48^WWI z9bYN@Lm`=m8K>F2*GM^;HY*u9md`X7uGurGk_-gmYIFvD#3Qjbu!U-L}uR_xHj|kT~^KTJoe@;pKXcVRdc@ZgvDm2(dGq^N6RdEeJ zWtBEtjZncocnASXOUG5>2VKUgs+3^GLK8FPifL9Gt=J7FS`he_QUwB_b=(LnTcU-9 z^-%pOr77tN)0E=HuVyrq5m4)A+!|fpWVO09TEa6Ix9oiB9V)rZCko|16;{oBvqkKYkz^`Z_>>@|( z{l={S=4lYfYMHtF{!UP-3`k%}lVPs)w$4ew^qPCyMO#W=e`q`A+~U^h4onz9dO_$k zOp+o^C=z71%{-Dyi3YWQ6o+hi@oP%+UB9z%I=v)QLB;II|nt(PJS4C#S?0vL>0vcp7 zkK`hcB8RmjdX%G?E(V>Fi@d!XJ~phXC-!g5_CmUI1Eo`u;C1PM056fJ{{Yl5!|09M zWL@yCA~oj%RELf2+vk zVS+~EqdECx`F-zzm2AsxOA|>5PXitdEG*DhI97@$cGjgPjbeKM3d4~jA+O>5k~&n; zn*ImWZ>CZT4;5Gd6xo5~DpX25f%rbv-L zu9p9mtjaSudd}OZKCY^{FD7Uub$zM1e?fTrSM{cOKt%cH_&)uoL4_c$GG0f?WX<@u zzT7Y_6o03|ISr_syL4m-@pmglxW=;BTOLhjwF@`J>dE))W_C5F*$ju~5?YyzH!9RC zsy434mN7MqsiiJ-^=AJfG?*yOb0^O2`jD0G}`Fo%80$ z;?qZLu8jw)}(;RNM?M^I36Pq5o$nl)yeIOpHpTcoi8L%Iq{BYt!&#f@^` z9`VH*D~IprKjCuKXi$XmqGq*2ndnp_hqgEse^;dNv`KUpHWPwFE|Iku|Duo{BR6R* zE$21wklaz8wxeLQ4rkn<(HCDliCK|nARbm|p0kAPJqyqgcAxrWafW z*4?Y$&2cpjn`qL;McSOOqQJem%kG>iw_`8nq-OeOsMK3C_s2qb`0qN1IRr|P7tI*WZ1IXykk?{_*2^a4{Z({K7)+$#ZVd4>*aO$=IFPn>g26KSP zL5|7c#&Y_ZpbKb|RAoNygnqV}w*9N-mKt*G2& z&e4HBfq??f&iU!DB?-ZVV<^S~{hKa^fcDwGZ!My^!BBM^)PQSfP9lYY`zS<9(?oqV z2!^^Nq-yaBj&W9vYY`L9(-WrOUY%H=9q7@f8H*OLKA$?c(q9uDHd&PadG94|zJKs& zzL-mHI>l@CvX>#PdYG~hT&5u%?vCjeZH2A&4)J1uwVa&;3>M~15gZgh+d$($N4glh zJt0fgM+VybHf=_`zc37uW%2Z`m(Yy(Dph+8jQD78aq*{ydeFOwnLbu@l;c(~!CF}P z{@a(-$*oF_?48+n0rgb>ZTZXNo0mnjP3U#36;O-E7`B3&TuT^^eu_l! zdW*54tc9yhx1&Rw&JUtOIOHur&vI9o#E7^;2@kwe9(QILE=q=_MS|Xrov`!?_T5;6 zF4H&L<;@kkr(Doz>1;>ZhO)8u0xBl99&-U5VNM(GkTJ)K0EbI(eK~7Xs{A3jC11YS z;bRrAtzDwgHvhK+@X$1W>HV-`#;w&Dn~0X7hWK$x^%LU5*DUb^K<0DBhcJ8l-!`VI z;hFLo1`ZL5iW!))MT(kV)8NBjb9_F%IMx?8eX136_{YDZ*0zN3BvG!D{9lApi=F;!-DcpQNF>yX?m1SLQb&Jk<`L=sL2)yK@ z7tB9x86vhkffhqgcr@vJq<$YK_L4XxHWz#!?IW0!#w`T#6a7Y{KfisW9>>u{^z`=y zt^9+;VfB5@;@e;@xvkKo_Un4|!@s3?r%tQ-v-7`&O zr6SohhesA2WbD$iz??uo()3h{vV6ohuwA5=AcEDC_oMI2}u~ytl*CcBVi|w>e3pwEju7=>dpvLI3F&F(PqVNbUoB%hAm528t=>JO4&D24lqB7@Qo zz93n|4gd+2hGdv#E0DY68N205+o?hp;Hm6qk3C3^5EqQt8y?EszaG=6BVrLEtTp*)6%pJQO=ijHE^`kbQ~+fm&@&wj+QIjU->dB{W{K< zO+9YY^eiAi{;ZmqrAm^zn6I!_602-&e$s~Aw5Ke)yoRUs#)(cOvZk43n+@j<{S8B; z-rF*Eq=n8kMkj81h27yug|wX3WDI? z7K;^nj0ws!ZM2uQu}YhtwM>f? z&&!LE@+&K=Ti;lW{9p~zjut^U#~J1s=B3lmdH9q zoRG~d=pX9e?cV>kGpIsPeP`++I0AkRFC-R$;^+)z2@UU20M!E_!Jd0s z8BBwh>xAJE_s8J#x^&7uvD{~M|HaRwy+5kHo@+|#D{ew)1`5*r|$%s*tlTsK1CCXR%yxY*qH83sOV;hQmkWEWt_&%OO}W{nbQix+?lkrR^l1K zv*ZzcW4ILLTdQn#Q%U?aMLKN;C!MQ39EQLUkh3_be~W%bbn$G_oywB6C3PG8lJ zK~EkNP$zumVG{7f({%O^%^IjA4?=~AUAWIkAd}AaQ~4A{N?r!;rVvBHke?4(cGAR3 zbLgTBpGcydWZAMMV?5rME?-B#vH$sy80$|*NIqt*i7LsZG#m0k##MZ|V`WMrI4|qW z5djUN;Vr&Tk&ja&HntxPK=QY7Y$uW$Ay&E0nTTBGXBHU(u z*t$WVJsDGy6DJZ8ZhMh~erWF)Gm2ew5NW3P;<(36`0bZsO0OTNIJN#j1neI^RSIyj zgd~IYX;%A`D+;gAywfP|)X>eCsWE#z(x@#~+2(9%30jykcp7my%^xP-<_dvq?QA?> z5kui%GjdF73_SW~p>xxdav!MJK{m&q@N&&WCI@XCe$#IRyq;FkpH?CZQcWR*o+Qsc z&tduzt0fl&N<$8ynz_d)$<1?~`QI#}HT3$Kz89)6T|LMbQ_?5ZKVZ99K=Dft)72o^ zSF9M`OghuJ>UGk*tcCqdfqPxjJuhpCVaU?4#h2B}>%NN8O`=%e@v%el@zO(Lam=QNWLnP@%%S=DK=|0&s3FK50`fd z6cNTw@HvDBI==!3wA9QRVvjgJ%1>A!@k9{ghw*(Jm3GwGVMBliP`@GqkO2Sy+xr2S zg$DqCFgZWd*gq3lJYyR_qZvG->c8s=Rqua<^1p$?Vo63>0oGNYGG;P>go{?7#s$PjEPN1Nz2O4EiNeh zQS!a2yrQPEs;;WKzOtsNqPnHLs`Y(A)*qGsql)Ub%9{4trp~6e?&_|t+<~6V zvEJ;7iK3~E@~N}h*_(!io36#H(dotUiOKQFiLu$~@#V$Yt*ynQgRRrkqqEDCcb)#P z{(qexpI!W)k@vy>FP)xUo}FJ^TwGmTUSIxiU0q*a|GxhH`}fVw?d|Q|d%J(v{r{u; z|GT}9{O`+`clSs4Pg@T!$B!@9kI(ndFV8P8FRyQ}Z-3tY{Q2|uFYN!-KrnzUC{~LJGysot6m_MfH~FId^TUE?0Xul*y0dRq1WUvG;WEUP-pTh znnJ17X^qlu;c2(1H8P=De1AOe;vjOX%kK()Y@+SsPLBjU8VrYS6pK1EoQlIpPabWrpblZeZLj_-oDUY|^ert9f^T{dxXxkf}F zdFNLOv3kF-0xsQf3akEf;8^m}aGsKBf2nZF*=mjH$n=(w>vp>?Y{wtlg zd}5pOy$EujOmlp73Ap_zy3qC_s2V=68W^cUFih$rn9ed5TmJz^mcaW^U7FVZ5J!o8 z4N+5>?^cUWUT6w}tIENyfQKn4`MQvz_&T_#CT47Zl%^xer=6i@?!AO*=`uv1XY;+{ z-74Qwk&Y$Wy+mm2wS2Ua_vtb`Bj5M7BEu|{fFDvA4yS%vlmJCqvn%C0XR;}j5ne0F z%PU)VXrKUXxHg0fY`ealwIaGb0NZwghPi%JR?f3OZwJ8OVJCyt&C7~a-!_DNjY0~q zea!rudicpaMw#8Ws#PZ6Sb|kKCrpAT@}hTekW^!+TKf1_&6?nRHXwny8ZiYSXJac= zO{$_?RpFO9QG0kKs;7J1H0e04tb~v)) zjrb{wl1NYuCB~`J+d*amea#f2&kA@cbOL9%8jQO7*4k2Hz~c$+tgNMM-X9(5dd@{d zQrLDqd@ESq{4y6m`bwUx0rC!vKaVr z%F_g{)>?{cc5p}NN9^5(Ns`FFRaGjs1uXGNQouS}xpB-Otw<)0ZFf`1n`K$^%l3}V z1d@j9PZT5M@1Uz~w#Lz*38M{pUiICzoa8sdZ|RI^?Cq--N)DBiYvUaFS0?hmBN?y% zm`A-G*NQ-4xDOvC@u_nYqd6F=>!mOf1`njie~->5Nc(aY4m2 zG^2AH$K}+&Yh`c@kZbE$J7_meIkmo~>(07&5a^o79Grd2_lHXb6g}})D5!90 zIifE&5BJLXt2kQH8m^Z=lDex@IVE%v?kigh0;jIRKCqEr9Nk;kgEjz$S3+*zFKC3ILhw3LD5?2F%I ziOPGZ02w)u>5x@XL+6Q`;*#pC?ip^@s%=><t&k*k26bS#lxpAU8R zsA4b1C*2lBVzGL9!i{e(Qg(EO|oFzAbazPzbyV^1@;~(`Ik!b>9XT+ zH0PI8@aru=fkJ09_zdG`=}QXW@K?!C_C zBXA!*kFJxUZJir44@PgepA8_h>j7THN-NuK?reF83tb z_L3j5?#uLbemgCWc#mG)PB;!V>l-5m$U~Ngl(z`wYrYf_X=#R$Q~VOzm4X`;e)Kw| zS$Nj&Lk1o9RgzC)2pvrEwfv603 zrUpOK50u#K;x7i-APu5W96GWxX@S~O4ppNnR$Wbf-F}_$1-*?Bc%A3-njWE16lFEn z?aZ^nc8BRK3$fgmaYYp~dloT2>t)D1iEf2YeeRpLZKd*vfMJJoG-d8aM>75A0fS7b z*T4JXA1>-bC7xpc@Pe#k#!^eYnv-!j&6JJA78WUt3Wfz5DjNcyy+zh0)~{H4aojc<_%(ZL!#lh zk*iUaWt%%pkv{>6Fq8@-=ZLNEQ+iVxHwJmF$NQAK61TbR)xZ`Qb`yC%z8|iew~Bre zKfro-BZ>MnbI<^4!m`|!(ZL;|!$B#|BXCyyYo}i5^|^&uMREM8-E#GqxJ4Y!BeA9! zfi@vEi5qVsIV-j)cWWkDQi&t&`B32##_?y~8fHsHf5ne6{*!h(JgbwF3w%xbC^DJf z57O6_)aXO%lJ4ohr6MfJ+>?mJL=Y5W#R<8xDAh5F9vAJB> ze_NG%AYj{{V18%H8NT+xI_G*Vi)H!1=jy+ZGx_!TkF^nVYoKjL`aIo|(T0!h4{?IZ z^dQXI+yjAMTrV>LTQhEkG-(#?s@Z%9Uq7G z<1|TlSJ5ps6LXI3rhHxj^&8`Vb))lc;z*s1seCy!k3#=W-J%o zVY~YY(2ofMwOk4Qf$K4(;UnL)NLoBM=(qaOFE_7!{_34uxpk%5Y5RzzA7K)6h+uTi z18pSLNERL?J`rd++ZfxW2kV59*e=_=Mo1}Wvkbz6%eldHyc97E6qkD@?Tu_`M1trm zVB8Ut?R^1%{x6rQU&@i$PPpFVegrZaQE_kP@_O_BH(ip-4ios3XVbLhR>cjBclSgu(zO0|A>{>^{9>XcP=%n)IP0J&h_qptkJnZ!zqywJJ8Y9ho_=EyI!85!j zrG5bwWimhIJbyCMyoScThC)mR%~kyZ0b!h<1;eLpEl`19alYdPSRu?kb8*Outsr<0 zF4Hlkc&Yn}iO3V$xP9`gz^D+XdM(rK03iDtXMCHK@ZZ%|`a@7c^uJfuF@lWM=om z!UtkE=Tq-A^oR*P8I$9llOa6V2)0nqgm6xvdEh>izO#KisXFfBv%YUC*YDNvKrN?b z9?M(1giSn4jnE*Sk%%BV{ONRW8Fgnv8VwpgD-$^e(-A{scMV}n!Vu!5*A$<~7axdS z6og4Ltif7sAu0AWDtezU+&4MBKf89#hFJ*OvnMDGG?{HrtKrtJdkLvIO`$zaDJ!9% zSrurDjNv8u(4n6y%WR(!%538)jdq-dAj`T;t)tN)Ni8j~4TH~pw&v&(FvmFNkky0S zH-7vT8TX#O^Tw^Owwk{~Oe-lz%if<()If`gfJ;X$X3V5c>6xLv;zf_Z?RQ9bV(WCo zNFP?geflHQ06Fs0aOPEpys>X2!;n=5lt&dQDMx{b3rL&~jUrM=ay=>XZHN+FiUOr( zi)hzr;;nSHPriDxWWFeSlEvI~@0+;#}`X`|Ve$4XE8SP;YlkU~yGu*)PAHC;z1} z?iCR@LZqfL3NarH1n@Z~^A&tr`5}=^+qaD4KNt=}aIi!n6&GYE6r@5)PIUV47y)`y zN9^#{yro|__C_J`v9l<;zbCZv{q*MPlS?8IAz%E(y|T2E*TBcclPLHKDY=3z0G}bZG(HxJpYV=5LG0&Au>$UUQ1;t7Q3x>tD?4EkNQL?|4bqOZ)iSWo5*fv zy3e|~B_!}84MKY`+B=Pr-lpIajac_EZvN8OMyh8&`;ST&W^Jhj$b*-+K(K-rE%=AF*|IXv{nyn0Nl)a5Zp|H33I zfxNKu9zkB!yd8`#|X9>=av(8SdziDF1+7%L{39x}skT#i_HJWe9$X6vZtz5`Q6d)9}Gw zLy+9%d7&*9QgZpz_D$kXQE+3WH|*I++OTA6ZoTxUsG!-psMH$v7nzBXl%(FFd2^#!QG`UQqhP}*N4fp)v8rDQLqdcabJal3gg)u+AD{C!f*S+qM&;Jb~cg)KS* zFxW#ytx1KIp(eynoc6@kr!2@(j8MIv)%Vb%8$zGgNK4bTiFV8k?CG7DbjT+GPu$H; z-BJZo!4E!p)X{?bm@YqRsiDUef^Kfw0fy+*3?1#W{V5_H@xij%*aL7A{T+!oGEN93 zWLQbPxX|9t1%w1e+}Zb#Ya+6sZ2|fY0M<<~T8IKYl~kA34T#uy*k&>!QKB)yz&ZBS z(o4^9=_yF=2{!D;=2P%iVQV|$O_S|UgBY@DbWG^`PtG^gC_AjW2gn3fys(+H*Adnl zOIQ#*X=rV8@Y^yND`QkqxIug>vK_UuV?DHud~$#I)2njkuYFWqHTjbq^dTbMEogZh z?y@Sen{v)CO}8*C$j!6SDWwWIZw#dPmIo?^~@r&iswZU1_af_ zj&)PbIIu=c<>_Q`NWCZV{ac+U$C^Y1<{7W40p4BdYs7@pi?Qt{yz5-MpkYq*7*2%y zTr?04f)>@>P456a*UYUMx=qmWumlh_1-BtilvI7Nhhk1P7ss>~O=VLbd23_5CmyyZ z$IVEMQlSLIF-A|SH-NniQKF%kIdxG`$p4q=of>VhXIxP}6qJ^2=*?7gY^-4q?(Y4r z;X%_>_~o1Ca1&*86o1}%rAu}=c~!nTGgqZ?|D7GOXiG(gB%za3sx0O4#bS@1WarOT z&T`7DfTc7d-5YIxRDl?rVgZ)sXtVHf&`8cBFrZz|!@-hLlM_fEzc0%P>~Gj_YS`D@ zT~#r=Hl&~At3?zL4~UeC4xyD6GYQqTrlLdU zMXRCTssW*i9cp?AG4&we{n3ybPMHt58R?Oh9^+nf1mJUFNZL+82$4JV>i zVc;@_%-xC3J^pQQXtxvqpnxxNJ0#E(+| zTg6qPdG_N{S`|@tN%4gNCj5IM7dlocSA9B_Ak&=5uyu7I>A}6|846T6|C7hqwYS9< z>g)EO`_Fw-x17K(QK0LF%GUnMm|rd9$RrN;Z(QFriEECR_>byTz@)E-YoHq!cC4Pl z-%^yoEHO{5X$WuPU{%j78paIz?a{CrdQ1ATC{293#3pzWL<)o3#5Wua&L8ah2des7 z55V}VTm4VMsFUYg0@a^R0XTUwW0=%`PGUu;w14KJF|8P?xKlXhJB}V0jR_(Khfzrw z=$8-_S|gJm{sYWO?Mi$Q3&a=AR5S1YfI$WicZaYq9ZkTl;pN8_HAF=r7W9`%x^$F^ zRt{4#OM_mKMmoBi&EgP*n=NOv&6})QrkeL&cy@MAWQAG*zJkZLo5LJ8T_J@*bugbmNyizlS#>i1AL%nIUWfNdnKoG~ie9H;Dji(z zVEIguQk+q;z!0a!(5D~DLfrJ*-|2$Jg#D9Wp(%|nd8@D}9MUthd0rJ{m*T;D2gW<2 zCX`Fg=fly0l<6-HsR$a2 zp~}EIjq24{60O~%e&EN~x5JzA$wJAnz`z%t%0m{y1k^av*J`(+d4bbP4VpjJd z0r9kEBcwMSZz9M@nw2@c7t596h7Taa^!x98j<9FlSQL6zN2sov>8So$czPn+zO2Tt0Bm&b%WeWl!%Ru zk?b9GqlJ*chrP(~@kx0aD*j44TIgaold2H21q_c)M2QCFbBZ)rA&UC1k$qIUNwxyx zf-G8ed6B%~1Cwl=A8LgZO28s>iShuxW-iDOm7$922!*qLaX*IRr=nO4d+RKCfcWIXX@SW$i-bsGRS*7eI;FH9<)diU0Q$%7 zSt)F4f5b?9TL$-Ga#ueq88T}f_W^8A7-IGi#W(ci5sIiycX`@0qxWY|2qaZt%DXI5 zWUssCcKnEZ*GLtDiJLMRPOj)V%{L_*FfH;MzXBxo`hceBOZzCDW5-4C#2x)JgFn`dr%2M9WpAoBrWza zh??pC$AXkN6HJ9mT4*f9r_z}jyakLP@%MQYZL>9)W zI0{>=A1>n1)w0t`N%ZIM^0!Ge4AKjYX_bMHE4tDm7@*P7r5r6O!!iyUVU9W%t;vXV zh{JIq3glX#g9;itYSw)2*m7Cj${8rVS6QgGk+g4ySp0Xdpv4IjRr;#BzcO*bBIxyg z8i>PoGED74{q-DN)y&nZ?CWpF=z?KY`xte8&PI9G98&CURuTL;3OcR%86+2HvPPW> z@h|Ly}G zVib!hT>Ung(VO7SCV6L=I0De(h99OSV%SiFXz28zyj6!WRO&}xDu4^ZqrzwhNhZ~Z zY2^VZ(qayKXeq5~q}*{47++5@+y%cgYdc5kt*@v5Jd~nBx}|ar1?5sD4+^97(RyW% zDohZNMVo>sFBt8*IQ=hxOp4KLK+#<`GhmeT3AF*2EZ zd`u!Qji;)ln;fc){CiM^L?SH1o$U3Ecd1etnMi^|5~VyhTHR~}Z`J;Y^Hy!rD*pXD z02ux_>Ue|)K7$c9CeEj3g{HHNf!Xz@arK)5!R%eON*9vIs8dkP&MyZ&zu|slEK-+o zQJABD3uh2rB$uVZEz2VTRO9@Rai+a&tACm86&>mYa(KaE84v!j;3Ym8!CmC?4pPoT zhscewKw^A5(XH7m*MJI{#d3!W9rPCJGkT>>a$0SjbKh~0T_Gh!|K#nqwNDeHky=QF z;M_p*|tBDTvP}slL zS?Ch$a~1GEWDXc7;O8bzbB1v4(TOgVP`2o$g^^Ph8MIXmTE+OHS<(Ihck0BAb6Bxo zXsa+T!^AlHYCq2|YA&x=4FWJxGI_xtziD`qEA6JZr`eD`UR1<*Q#sv+K~b z^84pmvoG{Jwfh>9vTHgY8{5CT{ zj}(_#HQz%yV$E%hHmSsqt3qfP$_&Xeo7zy76Td;aB)(`wg+6wN(3yG7U=Ck~{&Sj( zsB|pOT;s9%n5;kBnF9{zz>naHElQrvF=6TuaMb&=mvMTbF4zZ+VmOk|gGV<@%XcnS zA+J|>#)nX!LP5ae6lLRL0yNh-kdqeY?c%B|8e1_rv8dOde_oT6*+NQRjAJ!%X^Pnk^2 z>oN*9u5bDrTx&Ivvif%Ow>;o|37cJU|@loy@l$dmi$oU%YP`{V0;okmkcy^p` zp-x);E7KY*0)81Hd!f^ILcyV0+8g4UE>lsf4^Ln_%GSughZ-71{ytADqlCG-hnYWj z?Zl-OOm48=w;m8letfHpciAy`Jor#hNTlEJ{rTI&KV$cyYO|tk&Tu%(!^hY0)~i)zvHj`(yztyFFQ#*l~O#mF^RV^ zi33Bhm_VhBL#oc>wjGqR3iCX`^1Q`4t01JjyGnv5*tc&x9*c9FBA^M?qr$6z{v5)P z3xfM1L-{bfvN6A?y%;MbKw^R?m=#s=J+O)u&;dhmdlcjA8{~ViscNIoXb@?6J|WaR zRC+?ZvcBt^rR@_$Gc&X6`MyJpg78yB>>v;Ah=KNLL>XYM_~SYFlfU^Zx&$IR-#RCz z>%UI~MR}4CO#=~4>kw0X1XIj3Nf@EA`?^PPga&*?Nl-uz@-7xSsO=IO6;eAN!N4JL zJ10>g4n!|1!66XTnlBkaj{2G*_?m?f0)}u1HyNq_TAOBbBF3A+WNSPEizy;liO5^H z=?knL1h-r%!XZpY4+BDIDM#w_iqsIk#o-AgsKV7_w}qpNYokXHTM7{VTd;tnsuxqk zLjs*uStNnei?L`jpcI>~*ucZSQo=pVI92*XK(q}()IO3U#4|(0%v!`n z)D9XTEz)YlO1z)>U@iWTNd%z*L(|0jn~+Yd$&Qa7D0VKog-#9Wap|F(_Yjp$~$g@X~>!iKz0LwTr?#j0!)5dLVypkx1X7k29`IEd1$C-i@T(L2)puP&j6^mO(a&$5zd?Rr?LeFbMbnA*+ zdBW8Z49Hok)uW@FNU*v&jmj|%!`Q+FD*~Jfio4MxK?=AuL>2xR6F6CEG1L1&HR1`^ zF{Rl&4US}<(;2=A+eq8QGLM8Fker@wp^ok=N$?Ae8;F;9Imu<(m-BNU_j$?oLzwte zx}tlg`oqq1>a9luMGc`ksXLh#!8D(lpaZln1mrrXR7zNUN=INtsH{avXh5ojnX&_~ zTtuj%xk?~$yH=$}xm>(I83~uVOT0WVzU<4c za6Pk9%*0GWFdR$}Wz4~p%n>C=>bonom`A~gLwCE!tl)}v!%4(X7X%us0bi zojxk7&RI=y8#gG6$l3g>qC%e7z?RcVjUy|gjZCFudHyBe1kNfo#Nsqb@>$O0bk6o^ zPWOw>_q#;;xEPu&x}`(9kkL;5o1h4?v=A!FR_r>ZgvzH}!1R2xMqt49tkYN|HTpCm z78;tOQM(puq5gcKsc9Mkr6?WRp|XUpfr!Q)@_`dn2s{}Ag~*8i>N^L8P;Q*iP_57# zj5d|v%jv_MxVRj3vn$b4%syPv6Gc%F?ZbDZRaH`g8IwoA#J0zA(aWTx7=<@3DwN|h z3`mM9!>~erG);U1(tyK@+~ZX@oD?H{NH01v!8#qjI-MST7IzdrDfP|Yw9@R$o+~}X zHM5T8L`mgzPL_m3Fs07;vp<9}G~KF6Gj%#f{&Tttil7c*Q%oC5^fW;9{5n2G*ht7z zMqq?SXjn~a1V?Dt)H*E_IzU_;R1D-#jg1l;k`hK`FRUqu_d-j9Ac!+Dh!ZpuGf~i# zBBGXx%TKkFWvf9Oyh|L!(5a#~v+Am^NF`W(Rli^YC9Fs#{MlJW+N8CNrA?K1d_7EQ z3KGi-cZ;_on6|nJ7Me0v6WbM^u)@e$y*5hK)O=Rp%Zt76BXR2~MzL1f%vNn>(zP%h z!o0AfO3{wQzH$}LLLAO?%~E#Fj=&Yaca5ftp+uKdn0n2`O+2Rr`Ykox*HDZ)4uPlg zG|E;qShDjvghkkhb=XE&ghgQ3hJ8x@&t=#~U`6_T83x49tjxt;dlVRTPr2Wk>p$N16=Hgrt(|KE>)PrZ7rBw+zkeq3h7|q za=I1?MM|>)6)8#w%-mPxQ_nrE_C&2b{oFhiT^K&y`J76syy0HlPaL2{*!544ZPeOj zFGoGgl0}FTlt$kbqG^0V;idk;n61lE9aRbaMhxB26w5c}CB30d((jGi>y=xvQqiT= zxG!FnFs|MTyVlA?->H=&h+N+|K0dEiz2g&Guu7ExehV}NUk)9&{pH^y)i6)WRcsO9 zGfs`djM4-~tOaIZEG?!8mSE*vre$hL=QK3vykIf4$)sak#!V-tI}i){N$?z43CS7p zMCDpM*f)y=)P-S+m1Tz&-50Lqi3MFfjm22}AcckH27DPFVci=EyMjto6>7WL4NxGa zJ6r=3-SvS?Ey0!b-IZlxC(e_ZjZ0;d;wdgwnF^KKt1*H!tGTGSQkfM)N@ra)<90s7 zu{y)%u}HRX%?Lw1+5SvcN{LN5USD`Kv3tCVsPJEVGf1@9j8s7jc??2k(Xc>Hqnik< zdH&+aOh*8gC2fHMa_yEUaO9H19(6@TNp4q`WX@=s0SS>;glVn%yUA`^x-yMi{M)|~ z{yzyZVGfzoSNvSkeKST_gw(?2)BWkt#pTZx-G=??h~;GlWWb2s)A^i{7wO>}i3Auq zW+W*ZVT>AP9#D;{J7^Y&6ExW~A)B&ph)Q*0x^$`Gjbh{NW|-1T92^2GY$L1soP0xD zMZz~!F$>PH-*#r_iDObP7VN@aQon}Y$}=OIf?B|dL!oG2IsRJ8{8bVQX!e~vJT_=} zo?pFaOvPp#{)c{O&^w;AkPU9_jH3N)yRFFCP~eUhPIHCibrtF5Y{bD$$&{YXm{jTe z)2$m|G!PzP5{^?;PT};FWr_XV(@JWg7TwTY1VtF#(^Z6{K3#`p>OIv{)YVf+XvzlE zw5fb$S`3n4w8}*FKp~zxXMSd`@tS8O6H8rUhY%t(No$xjUJA9@xBlh}l|nAsP<3uv z@a@smWF7%NWL-sYY%!$O2#W(h9nXfsGRm>aF+MDkiPllyttDT8#-llME5xa5z7VV0 zh}O9+Etre&Xo?&sceqV{PmA6-ch-9(UXMi6hP#$g6D zb7Rix@@_k==4!e-M%*P?v>cPMG3&mw=49kF|4qfnn(cM}TItSb7=j0d;hzh=YX zt32Up@!@$$&RGuprcVCQM%a{Xu>2kGLhZIrx@Adkd&@zRp+?PWL9#a-#@j9jT} z@_>c%_2g4uZefRIgzBEy(e-j|_wq0IX@S{tEq`u?g>G?|&q!GFuV@69Q6Kh@@f9G>%`*XFXK?)UBZsza)#@Uq6!EqC3R*~BWU*||~9&3pu z<}t%7!;Ds94T`VyJ_f_r%pz*FG0=NWem*{|y~if7$0M*>Huh&7B%Fs2i&eMzvanyi zQfCrf@tvA=B<@t zItoFj?*w}cfpQ9B%70SW(oJg9MfcIA<#V@gbFc0$kM6kda&zByEtdpF$osu-*fTc~ z@-8Su-I1{SN~3}EI3G(NxU~_?yOZ^(6NLN)MQa5G_#iL>wBE*(aO(-(@BTuEHUp#L zlmJIlHPx#?$5e&Z>osl88HbYv??Xe5 z{f`7rrVmMUb>NVW`YjDyMB%>pr%MBfM>hlxbmU0jBS(!C zHfp$t5yXcPAyRy}=%Pi8RT5!bq)3s+j~zdfTttQA!$ubwWn|QdQ6x!`AVr!93DP4S zI(O=Xq;tp59YBQ=Eo$`WQ65T(_TbU9M^mRzr9y@3qlb^IS+Qmf{^B+3k04>i`uI`y z2U@g3h6wTM_AT7DZ`rmLV)w4wyL#=?UCZ|G5Ws=`5(#Yh@DL(Ij2J<}I7yNvk|i^# zT)7EmCQdLr>FoLQXU$HYcz$B~H0so({q)?@s-D^zcR^Pqw_eGwIGuWas9c{QZ&m z^5@g9AOASy{7N!6S$}!9Y@69u8*a4$INEBaL9rl%P(;z7gAqbFp@UIaSfPa(YPewx z9eVg7h#`vDp$s0D7=sKcmZ+i(Gq^Yd4Kcb%1B^A?Kx2&lHPk@Ejx^k$;|x36prZ{% z7J0)BLmFwLkw`k}qz#WqnUFy>CDag>FRi2!ODuJikw+sX0#ZmMjfoLSX(}=%nUbvZ zrA0E;bQ7IE@x&8QIuxZR4@mjhgP%JnH7KElR(0rAS}D3HTyCXx)>&vZIw_?=)MaU1 zc44{~r)#Z61Ydq3HrS|%8Kziu$ptqVWu5gmnrBUX#u;n~CU`5ZsC|}edam}z#1h0o z7VN5%$R1N*!tySBx&|1Epzsoz`1&RT}oCotABO zUx#^Gs$rrYRv4;{A(7v(l>Mq+uc3+d8n1o(eJc~D&1xC2lI>?;;f04wS-6E0n4h|G z$LFqm)PjedW7BE7xwlMItNG+d40~CwpM`6iy2-IyUlI1Li(hcH`B#~*_}acNzv$U| zTEM*v{NREG3oi)q#T$P-^2sZ|JoC*v|NcDm(Mvx)_0?N{J@(mazdiTed;dN7;fp^$ z`Q@8`KKkjazdrlzyZ=7?@ykCy{q@^_KmPgazd!%|`~N=x11P`&60m> zuz?PIAOs^Q!3k2Zf)>0W1~aI^4RWx99{eB(Lny)#lCXp(JRu5GsKOPpu!SysAq-$2romj&{5w9`mTjJ@T=S ze*7aK11ZQs60(qnJR~9$smMh#{<4vdd?X|zDalDvvXYj};1#TJ$xU*yfw+LjFghv9 zQPvL^xNu$-@bM3PRDqO;tO6BW`M)aIgCE4uB=d&xkADTGvCDtJ;}*=TLNobc&FEEOn%pGMtfLt(m0nF@lY|EMTViKo+`E^(Ov-6cMNN>%$6^{Dzx zYVl%fJf}j{cvIaf5DpsPf2c|5TekE}M`WmE-mR<{z- zpdr;NVbf=YcjQB!(6g)b_&U>?3gV__-DqNk_|dEWL!_B?UssC}*yTaip8sH~Un>jP z%kK2EJoKqI5$js>RpA)Zd`DbKyGzG9bg5&dtYveG+1c*Us^0W0aoJ}Dadwus$}4Se zPy5@a{`DV$9c*%MsMcNDBe&U2pJAn|+kZG$c_{JWcExKI^ePBk zyg;Z!Ti~-!@=jrvo41O^2B->QVI`z84o$(91 z8sq%R7Rbu8v4L?c2py-k$E-E-3$GyLX%=G`R=zTpv#ez-7a7VMjw&&ZA?7h31EB99 z^O$9O3*YvY$Ey`?YrUL8DSz`F8kY0-Qi+dZ4D`9Xl^!mTI$c~k8P0fi;gpMU=Rs7DsWrwf`z+NTGdhLt{3f3}&AltQ*O>wSbMy!-=^ay7u&X>Cc14ZC zMDthH)BdCMJDMk8=ZW*BscmL!V{Pja(%GBFSoE-=hv`)(Z`aLRc3}PbP)Kh&&dDBO zv8i0^YcG$|^gy=poE_o#(&Ko3rF1}57EA`;k7KkI=3z~7TuD4+=Q z9>QW9!{FQ&XSxNU^BD7%(k8dU)K7a0g13^=-lVV6L1<-gM;xWd%`t}4j$yqLy?DkT z{xLli{Z8>>li=?d2HC@|_Ype%dbl7)#RXx7idSJ6ecwCc6R-HiGrsYTe>~(PFZsz+ zzVep8Jmxd6`OR~_^Pc}a=tD31(UZRPrawLEQ?L5fv%dANe?9DDFZ;S<03#y>vtldt^cGr#%He?Ii1Fa7CLzxvh>;*hhi{q1wV``-UP z_`@&$@sq#&=089B)35&Zv%mfBe?R==FaP<|zy9{WKmPNt|NZm7|Nj3!00y7{4j=&* zpaC8r0w$mWE+7LopaVW21V*3)P9OzVpaota24*$smZ2G*AsVKk8m=K5 zwxJuoAsoh`9L^yf)}bBVAs*(T9_}F@_MspCAs_~#APyoS7NQ{@A|fWDA}%5$Hliaw zA|ytlBu*kFR-z?dA|_^{CT=1pcA_VKA}EHUD2^g2mZB-1A}Xe$Dy||cwxTP(A}q$D zEY2b=)}k%mA};2lF76^P_M$KTA}|J{Fb*Rz7Nap9BQhqVGA<)CHlzMCJ|i?nqclz< zHCCfFUL!VUqc(0MH+G{pej_-Bqd1NuIhLb2o+CP@qdKl5JGP@cz9T%wqdd+dJ=UW= z-XlKdqdx8q)g5vP1dAM-Xu=uq)zT6 zPxhow{vQ#PejJ|$E}rBqHORaT`{UL{s$rB-ewS9YaW zekE9jrC5$7S#o7P*h7l_pg!0`S+=EHz9n47rCiP>UDl;t-u@+C=A~EKgFf&eKMPCv!IERcf^AX}!Vd%h=p#^+VWR|?9fecmU2-e(HtLw@$BfBq+Trez7XCx8~Hfgb2?(x-MJ zD1$brgO;XvlHh|*D1}z&WTK#jW~hd4C|+VHhkhuC{)Q-6dZ>t&sEMBFQ<5l(t|*I| zsEW2IjK-*izNn1WsEryZjozq^?x=j`D3AUqkb!UH(K19$=|fWuN!sg+`>mU1bSjwzYCrIacqFkGnvtSOsvf-xjznzE^! zx@no#shxV|nIh#ds3|9i0x5t3pN7Lx?&+HL>7NGbohGWHQe~bVB`2(@DU5?r8iShF zf}=vJq!uNmuBoLis;7RcQZ{N)62qE`LQ>Yknu3B+lBxrkDpI1V1E?yf&MK&i>ZpPO zHYDXRtm!8lB{ATtuJS6a4(p=YYE#0ht2!nAvJxw^+NrTFB{w{(0|>)YM(dhVYqMr6 zls@ZGibFHhg0zN0Q+g}7uBo_cE4nTzw-#k5$ms(_DpR&Ao4#wNrmMXY>AJ3iyt3&h z5JSAmsRQ)uy$&pp=4&mW!YF)#nm&NPD&@f@?7}uI!A@+A=Ic>r11PL%Cp;y_YAnTm zY>Zm$QI3POVrx^9?6rcd%A%;q9%U)4DJ?+d%Q`^JuB^?5=(E=AtF9?2jOZjFOWj2_?mu4v{c*9a|Zs%$#=w7brVy+3E zuIm11%dW2LK4|N{uIwIY?9Q(3DsJZ9uI}P&?(VMdYH02LuJE2`@D8u>dS~$-uku!B z@-DCQGH3HXuk;dU^iHq!?j{Ou=k;!{cSh(45-9hEuXieF3G%1-o^OEGC;F~0b*dov zvM>A+C;6HndB(5(4(EENp!VJ`|GK94nxJ&{uK?F(cA6k^4ln|%CUmyo{wA;kSLXk! zU;{re1t(?%uiyk%um&3^4gO~E27ho}Ua$)uFbJ10UM{c={-p`8@LV<~53VH($1qv) zWe^Ib2g@)HFXdSZC{XsW5C1R_2eA+jF%cKB5g#!UC$SPQF%vhj6F)H&N3j%7F%?&_ z6<;wHXR#J!2JmvJ5kG9gQ)A1`PjC-PGs@(9wgB0q9c;xP&aFeF#9QWh`?>aisQ zG9!Cn{cbWS8zmc?;QNNMCC_gOnzAad!+x%^Df966x^gI^vIuIjEW>dpYv3)1a`o=D{xJ`*F&}gPCbKf%FEclD{5~@@v#&HyGx}DuHH$AcXEXP1GdEwa zH-Gc=hO;<7Z_6gb;TmN&l!Dq$Dk`LNRuY5Qmh;#a?I^sd;3n&!%4*Yw0w{n2HzXx7 zcmhF(0zM~YIADW9D>N;H!a^%Fmx@D{H3Klzf<;?&<@-jJ^iBiAI(UOf6SPH>f>D!# zCuFTg538|e!za{&I7EX~*McZWbuqf<7N5FnmHb ztTi!|LNl!X^;&-dP#0w|^lDLlv`mA-TrV|K_pVe9Lo=+yCxrA!6ZBkjgC}IeIyA#4 zh{9kOG%9!kJdeX*Cv8y<11U5EHvj`Rgn~migD5luDaV?Ipn^juz_V)?t6w{%F?<4fuLCHAGwQ@Bo;50CJb|?hHFa(1| zDz_o>E zDk%P-^i3aZG@wF7UvyGt19PXfaUW$}XM=y!f+yUwVE<~T9<3;d!p5d`P1iyv07Gj( zxU)vMQ%-nMib8sOLMO;{MaOuNQ}u_}H&UWPD2&55JoVQS12D*VC^RfFbOJiZ?3GJ4 zYOez@{4h=Q0F zr7&Q_H>`uV3Ii$_Lv=Sp>2iZp69Z~vn%j1puS0VewEjhl zxm?q^QAR_Cw=;u(!YGuumydaL8|5fKZlQO=Fr;@alme&Q`kflgRFN#sILRM z*TUukLo{FmDOl=2hr+xk<#>NWb$hudz&9v#0(`T!zKis+4+Aj>gSGp6w=X(VHiOvq z`#LOlCj_lgCVavYLoJBAzly_}H)U3zc1`!Z&xZo!a@?u{`Y0&7$&+cmj)P?%z4VeZ z)32`6KmF-Oz0_YW)mMGuUOm>|t=4Zn*>=6xQ!Uts{m_m*+25?$pZ&_F{=M3REZes| z#lAh<6Rh0N{k_(`-KT5z<~{u8at4+%-*Yc5hoJce{`tc42pax1v!~*R@8FBzCpW(J zjxr)kzV!M%2U4=-J1-`apd)X-@Jh1&g8uPhJ_y<}=_jt~hal>wKH08*ExW$$!hR#m z{_Bdq47#!HTdo}IAR6yJ+0rl&iZSr7tQmtb@+ZIYFF*4)zwQOpkYGWB2N5PzxR7B(hYuk}lsJ)MMT-|PX4JU;kz+@XA3=r`Ig(^a zlP6K8RJoF6OP4QU#*{geW=)$napu&ylV?w#KY<1nI+SQpqeqb@Rl1aEQ>Ra%MwL31 zYE`ROv1Zk}m1|e8U%`eIJCsS*GH0R|8# zFqm**!-o+kR=k*TW5YN0+{QKqX$qGvd1xdwO^8 z-@%6$Kc0ML0GEhkpNJ_ydH3(($Cp2!{^S6d)I;3Gy?*|G|Nj9DP{7&%*d@P(;;Cf7 z1sQD6!3PJdB%T8g+9f#%G0afI4LS5}00Su;$dV38EYZXhQH0Er5ar=7#TQ|WQN{%U zSWUfRT%1wI9eM1rI{=Eoj+pj*EYip$k+dxUVpuDN$RweRQpzbG3m{0lTBK6TExC-c zM!RzCQp_>QJQ0ApMl4g!HQ9u4MY(oqQ_eZ*tPjMu;<>QSJ^AcYx&bD9OF=&gE!5E6 zDtRl;Lm6$ zd>IIya|Z)dpnxL_lAn7Z*7u)$|9Lp#g$3U6O|pE=*hEb35l9{Z{3_WmOz7FpWWNM> zEXa2V1C`=s2b0<38E+L!o||=~WI{~db%@=@UXB^#0`#T10GoM^(MGX`ZW=}bHVwL= zs23}`=A)A~dSa<+E|3gNvo z#Lt(G2czeodF-7#@4>pRTW`QMbXF|F{vjU_fO!OZ=kLM{N8B>4m*yI8$15)}XRs(Q zJwT8J;>SY8I!~PL(Cu!V_QzFs@bs_b&0Y6E{~<=!*d-%4ZOrdcJJ4d%=I3zb1!CS8 z+TExV2|+0I~!tA45#+A$w)N>^b~>!U2Hz9_KB-M`C;+ zZr%R+e@G^QPpK?NL3_9*Be1zwGT|8U^#3LpT1 zNbqPG9MJj3(mNCWCpClG#oO5S4}8E-fQwm8y-1fS654Hr*5gx7OUcuTR%LAfAa_)-V+ScL<_76%d z4w3N@TV5*p9syvEA05*pWH$K^d$i1P1Hc?T^t8lGlILlYTP1lwMYBu5Fm3vpAuYvN zH>DK-M3s2cERnog>7-L^2{ZEQ|mY*cV^$f)|F9WF%peHeyIDm&k<9 z#@6M{?|=#(7h)zvoJklE;Sh5Jk;fDTAb^k!gdU_6=XWj{7HHjbI`<()+)Oh+ftJjk zh}nfb_%SYh-J=+kz{LJ)$i_B)*dsyw{LTQ>HI{B#ltBOxV6=EuP>zO2j$~QnNKvY* ze2xW*DRt?kiWwF+zLch{`XgFIRa2dk3RP=K=T3oos6v{hr9m|+n_^0qE*_PseTvjt zHriCFcB!Om$Xx4BmScXEtULl|T#8y&wVDY_X$G zg^`t5GbFq2wM0w84vzR5*bD(FKUos&VQJJ#^^6svkGC4Xi@u{`;?X;+Hq@YVQZQ5WR$fEIZhR0o7>A&XQj1m?Q34E zTj2(0IKIV*UjF#v7r>-XxVa@wKvAO_<4%{l)wS+*v724(ZkM~=_3n4U8(#5_m%QaQ z?|IRiUiGe*z3p}Hd*K^j`OcTV^|kMP@ta@$?w7y)_3wWH9AE(tn7{=#@PQGWUf#G!SM8_K^H8CxEdIk$9sNoOl2#nlbS#6GIdact9s=5e<+K!xSF>c*sS5a)9Ksm912|C&w?72$5BLP;8LxRO z>th{)H#sM0VGM^L-t@Itxaz;Wj$zEb6SM%kLMngpVQ3upUuOL>lJ#`A{Jnvccy}j~FD*0N<}3jKShSPZUIf z?LxsA>cM#=u*~=&A1cn|NbmtdK^XGE13%Er^uZXCuK^n10YJeRz;6X@@CI=(2X$}< zd9Vk4@CSh~2!(J6iLeNb@CcDG36*dOnXn0+@Cl(X3Z-xgsjv#I@Cvao3$<_yxv&ep z@C(5(48?E^$*>HI4;#=h4b^ZB*{}`W@D1TG4&`tT>97v%@DA}X5A|>l`LGZD@DBko z5Cw4%39%3j@emO)5fyO}8L<%^@ev_05+!jGDX|hQ@e(mH6E$%YIsUN|J@FGkF%(5{ z6iKlZP4N^_F%?yD6ThM zjqw`)|Sq9jjpBvnEs z>kuVl!X@btCSgJ*=a42}!Y1VqCtX4(-v(*)u@-a6ogSKri$_Gc-XrbU{0` zK|l0CLo`B1bV4PxLMap*EEFd<nevML85kJyb?Pltx9=MoAP$1vEuh^d?%=M_&|3 zV^m0Ilt^pTNN*HLb5u!p^h8yZN1@b7d(`ZMWr-K-}Fi2v`**LOKAd3^HfatR1ooWCiE0g`BYHJv`@{{ zP|@^E)l^a0lu_MON8$8Nv9E0$+3R$nugU;fqAWB-+AXO>`F7G{-JW|!7zo7QF*mS`ImX(1L} zg?3}FwqvvQV-YrIS7K+swr9ikXDv2dqjqbH7HVs@YpoVzhZb$8mTg(KYR}efvDR+2 z7H_$hVZBx*z}9cY7I4YdXU%qP`L=C=_HFexZROT*rM7QVf)F7WCH^*Y1J`l~cWi@p zapU%I>o#%k7Igh^a!;aiDfebr4bcZ)@XSZ`-S9l3mc8k|_b@yiPaCb|hcX{`Bt5?8#V%c1!5dZF7H%MBjA@H!r|xQ$9}DMAZh^y0l0km z7kd)|9DWWr9|C?KAb;wKpNcVS!I>fgON?E#iI$f_!V?d^z|ZM4ls5 z!HZj%6WR}ryA&h%p^G0Nh|RZ&)A%4tL5SOrA3))R!x)PNf_z5-f5`Wa138ZqA{rWi z6I2k6iB}<%*or;=LWloh7=*YZEO{V|A(J85cohN|8hL;J_Y;mdk`Y3QK|x~vmlIAI zlovS$Dfy2@;gy@zBJ!aDL}B~@`IDWOAqH=M|6v_s(3ZK^Aq0;gI@y(d`IsR>iGe|r zf7t0jLWlLi>Dfz@e zxgtdPBKQI3h@qDg8Hp1DRm=ICKSGpES)jSDkt_L!v9Fqc_#aH60Zt*Ix49tf!Q^Vt zowxZE8lV*98KDi@BDBGy2jY*t`6A%Ai#7NkI-vp1*rW%sBla1QKbj+&L8M)Jq6Z@I zY_6qmT9N(_Vuc;J8F;#<{rMp7AqLs^oEzePzX9n$;S)>&gqOOZ{a2UqxTpxnIVY5gkg{rEZdnGVue8= zJx~D#rCK4-mmi9mAl5jZ!FqH#LasYosUM=1>zT1}`X55U<6>~AZJVwKf}ICDwle~g zMZu68pcBkFBlg(=axNPF_yJNcA~t!Skz2Us__;ZOju)FE;5Qp+ShxAPw+)wKoE`|C{TO&VeDk zBf40{3*566VvZdkoByGUSDYh&n!_hzfhk!a_IMO@ydviL0kTsd6u1F0Q;GY!wGG@M zR+_U<+#=YTAl#bCX%{0*Jjf>^8WwoLtz5PhqO1jiq_zAZ;G2O1_#3_)BvzQWC*sJ( ze6(wM%{StI=lsSeB9}jWAof_q8JxaDIR=aTq#GcmSK7@b;+_v$rs*6b#9@K`{=Cc` zLW>2PAi5aQrMrJ!P>Q2?fup#z5dwa-;S!?ioxA~-e9RyG#ld_bfP1dTdmyM- z%*njbvtxmSLDm~wAmCY^={db|_O;pj&zl?}>Y`vYpLW{jP zyJ67F^&6-E_^v0OBF2G+Jz=j&-q<02A;bacURd1`{vg&E^k}%;%{_Sj7hUFC9wE>i zfLET{Ct4gv!RAaavLF7{8$#kWo+0X?=zlI0a6adoy<*na@-RKoe|Vl9K$x$6BI*Hy zJt6Be9jD2cqwBru|DhH4fQ zS9vuz@JFKV0l)7P|L=KT>9ZH{MMBXDpL65B@o$@!Lp2yvl7 zf)OiPya;jPK#UwaR@5laqsWm7L1H6`vZKkAEG@2V3De=rm^4d*tcmmA%$zVy`n<_A z=FXrghY}@e^r*u`Fiu5VerBbIl)o67j)2tDHdOgVX>cp^O4U*-!^(@1*Y8A3= zi|{R6xozpHwR`rf-ji^L_ApXRLxL1 zH}$L(^ik17Ne4B}ld@OK4N>QGjT3fF*)(Yj#SGYXPyXC}b+=UglXYOM!U+>Ee)u?Y z-z=FIcK;cEX!)b*m$rWz ze`@`&`N#G@TYKFJ_Z?LOvR0r+36=#GaykK68-%wVXxV~j2{@L64^o(zgu8K=nTNlL z*c^$^ftZ_#+NsDLh7@UNAx1G?G^0x_f`?*nHyW6sgEfA%qk=9rxLlA7zUZTo7v>lp zlhZj_9hBEeDIS&N4Y?7FO3Jt;ja}MkrFmhZH>P@JvUlctX~u_TNLsErADs2cc^{qm z*|{H{{ptB1p8@(AVVis<3Fw497FpycUFie;;+p4#h@x$0Of zm&tm$ESSeO`RtR?M#<`^w`O`Rqs=-x?UdbC`R$eAia9Qs<(gS7utaKmE}HGC`7WFB z#yRht_11aso%!b3CO!`0W0Jqf0SuDB#SyHL!NMUtk;1GoY>>m2L0pi;hEYtA#e-oy zkj8*k= zfDtW_(S0E;pvY>G9P+_GIeiw?*icRWmep8?rM1*PZOv8J3s3EJz-3>$4cJrRv&~Ow zKisxYZ%-VzNpoLZH%NDHoVP}Mf86&(e~%ovL4(7^w%ck$mAKrCH`Vy1ML*6HK1}CK zc}|w^wNB$`R1RGe){UK z&wl&vzYl->^3P9y{r2CFfByRK&wu~^{|~?b3UGh~ET91oh`6APRAaL@c5akBG!1DshQSY@!pN2*oH$af(!|q7|=LMA@}PcRtbL z(`c78+`)v4DHCH$$k;M7vILDWQ)5clSTi@G1df=qUFhUU5;~U7j=VeE77JGpKRykR z1QBG_2ssc#W(|=7Q6$$Gi48}F4U&?~O62s0$2C$ilW*K4+<3>yHIi*?UprgEOxZA0 zMog6zV`au%*)do~jg*&C8eEuW%eLV1WGUli%X}F#VAf2SIU{Dzj2Sd!VknenG~2+O z2}@>*vS9y$CM{F>O#W(S^OW1frYwOYEL2@)TdT^JrN~LFeeFq|ePZXI+!-i%8Y)=U zTGu({sVH-93Z1DEXKVa99DG7bppqgerRb?HBw@>*`!wjM92zQymWrR_gs80aIZ=z+ zYDnRv=s!IgP>jM#qr4)iuiTW-UoBLj>=G%h(zQ~Rwp5}cb*ZjQYAl-~3#ZEBDYJa) zES*9Np)o~iQ86`BmflmS(qbyLoa!y8f=jC6qAIzFnpBxCm8LJXs=2(1F0i^wtnebM zyv#~3wAu@+TUBa9)rv2;>PxQtqU$>C+D^Q_Q?K#l>pVGHPq${&uleNaO$j?t#1>Ss z2Q}xaFYrAWCKST!BbXnl_6Z@5I0!ASC(*>Dg0#%hZ)0T)^M3Qd}a@)`NUaf zu#wlCVi9v$&LxI(i|M>#JI7ehNanMW1@vY-zu3<De{E}Ei>8EC-#hNU_^cDpUCA;$tny^IN$-OP>3-a&W9A`UPlNpK<|5&K;9S#`TW=8-)@mSe(}bK$@@oU(F_d$3P;y? zB0+tD=MbdO005Y192W|okb0kBfenCxA$MrJHhc&nao-RM9JqNXfqNYIasPl1!$*Q8 z$P%E?0J8TFw19vG_-!Mx4h>KW0mu@#r+57a6Mtt4KnN4m_k(h`fE}R?4bXf4Pz!3u z3AK=T>)>$?(1It$abq`iTi5_*mriJfc}AykHs}$5CkplOcS{EVS3s!0f&Mb+eI${6 z53mlV5P94{h89N>Ik~=m4D%b(m)|f5(O; z1y>IccmI%sq2PxkL3o^y3}cvy9gz=sCv^{?4c;(w(bt9~fqQk=3ECiteFqbG$b%_? ze6z?BwfKoCF$@uCb4kb%L|1=nr+NPXfn8{c4S+k>$pm)s>b&Cg# zDajJlxP_tTkT|G=wm1^>Scx?$5`-v|Bk^~%@Nd3|5lV*;xEFp25tJZ^k-#-&>i`O% zu$6-e3Tp=nx+j(}(QnugduLgOx%Uq+D0L37mqbYtf0vB^Fbq6rhL9O;H+PJAn3N=e zlW}R9_lKGuv2!7LcH@N+?e`Cf7l~o`4>xI+fH`W}u##K;sG3;$bQ~yg7YUje!F~^b z583AlDmnyc9nYDba9*%5#klNFf~;3;x;c@bJ?GRz2a z+}C~Y7mqomTiHjKGuQx^X`LeRenTjJIuVHXITD1oc!~Fe7=>6}>D5*fOehp9%MVGmom zcoIi_2nw7jae$Thcl?KxH98Up2!{z_3}e@n{t1gWh@Z_^n)=uP1gM=DL3H`Bq5e1$ z!uJ3T`Ghkkdr-HC{Meu@p>@%hf=S8|qz89vhj;!9>YWuae+Y4$wLo~e*`+7}fv;Bz zTIT@4fOngTnMN9#!8d$vWE$ddnndamZ>OjINEs+W3^R9?*_MTsc!?Jp5yU{2OlWjz z3K8$8rS`o3&EAwLaUm__nlOTeMm`wp?4b zVtchS`?FHov;p_DZX2~|o3v>ww9gi{R6DhB+qMJuwtO46cne*3tG9XUw|iS~eS5fn zJGg;swR7vZSbMgB8@Y=+xrMv7iK@7k`?Zuyw?x~yM*Fz_D!7_kxruAI2Zy+*o4KZY zxwyKzs(ZQ#m%6h1y0ja+3pcu~{=2!P`?+M>yJq{la!ap`3%S87xyH-6p$%{T zyRb{Rx?8%?ySvhhyu9nY#H+T|OTE);yV2Xd*K57m%eLVAz1(}g-n($KyS}xHyV|?F z#ml^)E5G%-z3SU=9$UWX+rGD(zwZ0L{@ZKoYL8XBzxX@A>>I%5+rJFF!2H{A&zrvD z8@}`FyA}+*7%aS^3%|{4zwvv&6g{K70; z!!C?-G@QdWjC0r_O>bmP4->=_GsG8D#2a(OACtr*v&4wg#9Q>lPa`?5$rZb_GQD)g zzm&znw8g{J#l`f+#}vl?$u!1AqfE>6O+P#mVk5+*bWPmU#!<{QqZG&5RL5{k#BO}Y zZBj{AaY=ro#vSp;f)mL0>Pd8?IG^M=iflK9j1hxuIF5V~kQ_*oY!Q@PNS0g?m^>t2 zR5f6P4W67epe)K&(vW?9T5D&+#nJ^Gwh6Y|r?b18VJ2ef}Rc+Ne4IHi<5p0~tavU~v+|_m*)_82hdOX%&LDg5S)>mB% zyYmZc4cAvK)1h<5p5 z9p4##)exTF9}dDHj^84_-^0z}YrWwo4%Hq`;t~$xBM#&A%fTkD;#QsFHJ;Nf9^)?F z;uQYkGJfIwjpJ2)<3n!KIu7JJ?&Cdf;Yx0A7;fZGUF1>T(n!wZPF}(lp5;G|utHAd z{y075Ury0hzT{Y*yjp(dT%NLCF6J*C=4~F)WZvXSPUlx%=Ve~v?hWTv{@;7f=QDiZ z1Rm%G+}-Rg!`R^GF8$_-&d_qc4HAsg#O(M zuIUq<>6h;4X%6YCF6s77>0oQ=rS8zD&giK=>8pP0tzN-sK5$Sj>kv)riEitzj_bs( z>m$tT1?TI(KI?tX?7GeA%Wde=?&;JH>WBX94;}1&KJ2^x>a2d}b8hEdPUG3W(A&P} z-HzF$2Qv7YVd4(IBQ-sk0Rym?x@Rd?wj7=|9Cz(DVT>@Bm*K zJp6arKzi@Fr{hYkSr6{x{_|_j@K+5BLtlEE!1Oq+c0Bp^Z4&nio%1Izmkro zKZuy`^PA866~UGWj}e5oh|~!B6DayneVB!B`lqk>QttGhO?{+5+mBBSviAU{P!FWg zow%QwU1!jua`X!6#0j z9ylOI(&fvK9kIcrITBcddc+zStJyQAN1r}9g$n9ZW>KU`UmjK3v?)`kBKbA&6qO{@ zsNgt71DUVE1FIlqKHRvm)Tajx9B?9au#IdCAbti-W_$^Iow z@xiBqqJ|bOE0|$ekij@LXb|cfbsBUTJxyz#P_QfrgwB>K$(-VWp~FTMEk zD>>{0`){IBMzQe10yp7gAXrpdYm^DEI}Wo@*5l-?23mrQKJ$WNvBjQV3~H1HK)LTB z&TfKjKKCH&>qdt@)2{*c`jc=%mDK8_Es7Le3Blfk{&VoZ2m=d|um}8F?g1vR1Z+ge z!kOuTQvOkK#U5ciFHJR(lF_GnYFP)!hB)H~m}KaDjI;RkT7sk;BugoPz|)}fhQL{NZEb)9n9Z@Hl^rM zOAkias8?qeN#gNvHcjWzbY`pK&7u({V^j(K50;Atgt;IEMQIvllp$2vA(j!MwrUY& zvzcc6wuXsk(7*=T>#u80s+Kd2tds1rjsCAwk2zV|w~~8P6gXiU)K}`M8N&MS#z(Qtu?b~m_ zThH1t!(9^l@^xb$31=F4Ejm}sF5YqXAa(s}@~|%MgmbDb{oH|U3sQ;9gGS*bzI-L6 zZFSaN*WMtRZ5Ipit!D>*ZOqi8g?Rp}h(QqjsJ?liD%!KdjF@!e@BGT;=`E;~xmST@ z>C{~hd$ZYI0awvI?}Y|@HWQ!P9G5@^7A`En_?-hW2f+yP4uaUxR??Ukvcd$AF#{x^ z0kwxf?==uj611HPPqV87ZNd$iYRDWu*{BC|vnUSjIAzqHt7*GO0{AiI?%iU}pS-%fHtQj`B05a-1n6YwF0GLh_{8%xNfB`ceVP6R3QHT`?Q#s-BKAsij=%DIcoPry_Ej zLsgwnsXD@hN;P=a{@f`#qw34A?y{-96zf#43Pg>b6{}h^YF8b))eX88sbO{ISc%!z zpQ=?O-qh!t zyT6e-0pR(1bSxY++(%u#!ll3fZ{i#}rveu%) z1u1bwYFv`qR<|5U>vF%uR=^_Hq`sx7bX96ynqt?c+Qq4Iotu#6ewTY$1uJl&YF@39 z53%SiuX*nLaIk_p8GMT^2;Wx7x#d;p{m(%R$ zH3PcMe9m*F#5`u~$wJJsz;m1l?Px*oInsUJGL9>)<7%FHEQ)?Iqe)l`G1me+_`o1O zWI}2Pnz|#XPN1qG!fNli`XR8kova-~>)6@4A-Fc2uEzrECySbdzYy~;u*0|nu0tls z_MZN-JHl++IU6F-j-9k0LT$rY+acH!@_ zvwJM=_8PnyLhr5Fdm;F?nZ6am@0s}|-Z;+0A}-w5MI|YiE1g-TrpC$6fAor+eM)es{d*UGID6d*A*3cfbc;@Pj9O;rs|kP*vDS>v!{LSZGU^*=U(@_=Y8*e|9jvEU--i(e({ZeeB>uz`O9a1^PT^E=tp1r z)2Dv*t$%&&XJ7l<=YIFS|9$X>U;N`IfBDUSe)Okb{p)9c``!P3_{U%V^QV9P?SFs# z2j=R!)w;@_p6{sJwy7J9stb(&LoEbMK#(ZFu{gkh3&4ihzeA&{{_8rHD>#?K4v-@{ zkAsK}e76pKh!0di5=20i`?vuFx)5}T3!Ff`S~#vtxbHGJ*+{{iYd3j2{bXn{4Wv{tP=7=wOX+|o3cOCLoLg+M7+d7J48cV2uE}*NOZ12oUTPQEKDrL zOr*p-Y{X8as!v?5P`oZV6UA6GMOyr=LX^dZSVg^RMcsPE?3%@2yv14^My~?K?Mfb9 zyeeM2EnhrFVGKr1Bt~fjt;eo01F)UY3uLoP!_FtfyI3`fiUGRE#gMr;JCWh|{` zEXQYb#%L5rc>Ep!EPaeff9%J1bjWE8NNXI(iM&UHEHi|hLxl{qljKN;^vJfU$B=}l ziu6QDL`jCkw8K(KoFtr4WUO3#Ns1iFNaRLKtH~oH%ACYWmRyQ!^vQXO$-cVC0)xn? z%*dm>#H5s+rDV!)a>`wt$x}4SO1#OcJj$!oNr}|TW#Y<5^h!xf$+iT`vHZufyq&B> zOJq{Zvx3S7lghoM%DBA4xjY<@w9B*vN>F4=N`uR96wCg<`&PI&#(;83N2CDg#J+4#KvNw9+7lW?1WMDl+m4}(HO<6 z_8h_-EtnP!L}!_vOJNQuk&Y*+j)L;h#RO8m6w+?AQ3E}z1m#fcIMVp^P{Jq$%E+5l zSPrN05GDzflt7C<5*7JmLEa` zmNQig<_Mh!Fw}CL)Ya5dOC?5Rt=Er$SH>X)8@Y#%&;|$i2Uik_mi>od01IN&)a=2i zQt(tI`O^t$Sb}<3iPcz7Xn+D)4hs>5j@b}$WhRbgM-s)zrcEGJm>yhR*<-B=VVItk z_yu5P1zEaW%*|X^N}5q+ zTOK8hPDl`^A(?@Y+f@LC27m=pVAV&BR9G#^Eah9;Bt}yJg>_J$dVp6?Xa-@R*L84! z%Rq&d<=1HVS2KBlUwWBmtYT??+5**i5$XNBG*$rJ)E zU;{qj=2+1%{oJyk5kvtPL&X$EX`VBUQnXzb_5DiOHPCnr2da%u=RMHLO`5OZgiSbM z6i#6kUSSqqVNVDJFWvsi?R`qTby~f3iD3{~Iql#NCQh9J2FsCCmVz75ag_f#VkAyt zC0^nsUQhrmY9c=-+b{M-Ns{oEe7U8QURV9!{twNAy|Gh25dt;FsWs$q0t| z#MDy68E!a?cL6FQW*#wKLo(Lh435yx&<6(y)*W`^_55GD%+rIa<7xH7Jnqmvc8Pj0 z21t%%W3Xa_g-CqR*YgzQOeJK&JlJm{h0nPpMV{fVY-ExMh61jj*b*>d_yi}cF0s|* z^);~oJ}A}o1Wrg~JSOF}H06=V31SFlVa^ktd|KhWVOcgwkKJ1?RnRf!<-CmIV_xP5 zMdM_qPiwB`{r)teMTSXf9#LebRBFEFGoIC&-DdtAR30d9OmfU)N&wCzCGnQvsHs*ew-G6@GfbOP&_RVk3WLZsUG7RB{PUlh; zGj<-w_6=l;mO_iZXnTHQi;UPaZc%3#%7mJriWh6 zf^JTlhG(1B;GfRvjfH6%mgx{hXo(JLgT`s1c4(t6<(>x6g$8P-=HRM+YN%G{4Krzv z#^$Ro!I0MKm*(nioa!MxXnqdsq+V+qW@xg;V6#5R)2iy9W@`l;>$v8qopxfh_Gh)O zX}oT0{=sHifZprZ&FClF=t}PBD<15?wrazMYs3z!xhBcFj_kXJY`f0t%9hlq?&ZI( z($3~=u=ecFzT41_W~3Hp$)EF4)c%WZmf_ZZ=gpRFlt%5_CMv~VXRm&2 zWqxhnUTO^vZn+-ruHNm*M()~{?&LP^*k$gPa_+Ov?9Tc@e#%|%hRzWQ8c8=}0 zrta@$;~HJM280zZfa=a(zAFD-0945GqhTeb+_8W3+bnb`0Pr-%-p8VeWx ztqh;=ki)@PlkpLUI2zBjAWZR$cyWGd!5PfJ;~2qwTfv49@_r+7hA{FPr#d8G2qj0D z6NCsK*Kvb@!LE})nzK3oJ44K1z-8ld$nbKXTXGl?bEP9X2xJH>*YOI>KR17KIFEBV zpL05|b34CtJkN7I-*Z0ib3gxcKo4|5A9O-5bVEOML{D@@Uvx%qbVq-5NRM<$pL9yE zbW6Wc5Kgf zZQpio?{;thc5n}OaUb`oA#-y-cXUs8bzgUOZ+CZpcX*F?d7pQBuXlUDcYM!xecyL} z?{|OycYqIgfggB+FL;ALc!W=Qgj$5J>wGXn__md&xI@x6gaMzx)sI0L{nz%l~>300FN5`VAO;(jR>iQ2M85 z`VH`U($|0t$N&t8ec8u=*MEHtxP8~peca!D-sk-i=zZU3df*>^;xB&O-vA9redTZZ z)mMGem;1bDe7Sdf>L+{aC;Je%{_4Me?zj7~7l9WD|L&*$?6-dMKmW4te(Qe$^>2R{ zZ~^cS|L}K#`ImqDXaDw(|NGy6{^$Sqr+Z&<4u1c}t8zrHR#_UhHGSich8z(E5C4j3?GxbPczhTMUj95Rz#40{5d3%e*`kv-$NWZ^k72^ar9CCM<9`uQ%NJ))S-tT-jvczHQ}_< zPATcslZq=El>!Pu5oHt#NHHZZj1g?Q9Y$76i+G6h$B%j(rDvR;<`JPj#B05 zW2jqw^#KYZ9GTUXsvVgYz-!TE6_j+whozB5hRN3kg2e?F#G#Ejfd>{hCIOljTh2j5J znsjtXE4_0GPHTmzsItlYuy=q#tX_R3bG@~#T&p_YeDvAcnSOH~i{Gv68B45z6CIe~ zf^NgjLfXhq$Pu&2?i~`eA8iCZ1F-PCAWSIZ{HUi^2(l zyLc3jN#Qgjy)^nrqf=62moru*5dM~$c2<3m+E|A2m1LAgx@AIq|8Dsm2!zFMDwW}Z zmhza5LALQ?k%6posd3dhr(AO7Mb`%|M+RBT90*!y)!uurmRGUu##?W`J$ixq!%f+-yxfQSS3Ia)Jh;N$Qwf{ z^0ncKpdb^hpn@iJw-16)LBYzKvL0d~3Y`!n8<|!M2ImnL91dHFo8h%y60Q?GYRlo+LJDWP*wx<0p~7j@2aPk~Aas-ncGSj8-%iVa)9avKt$fCV6s-Ts>U@@4VAGFF{OB;u(x+{**TXjU~@a%##dd0%IOI`9)6C;}T@9cf1aqk9#r`RP4S7 zKAKt4dp6q*`z9r{3s^unk8+=JFqIso&98n++W@F+gSzp3WqesF6dJ4Nwe=kEg0nIi zt74_VG!jsidy8AyLd1^zVI>1%3_o^Bp5Q2IM5)x)4t6N=`g-Wu_ zkPvQKg$vz_(i%+>p|vL=Vw~jQYObMhlbfPr%7kZ>*K+d6M&?Xs6sfW!)U72^)D>l7 zSyMI3vef^lEXPz1v8>+5=C83A_JLrjW&?H1GeyBA&6{Hg!a8ip*MnG2<ynONf)xabjU6zgM|%nn*{ z2a;!d8NmudP}p~t#!|g`_i%tKZ-E)wK5{JBQ%KQ=-hJPS$?^bi=+QE_ zw6zXr6SQ)g(<&KJgL6V@QP0(fJYg3RPaQ;cjk7A}T#8kQo_(aBCH!aMa67LeJFpx| zp0~!llPv?!nHdHzC}R!PV;51w?4|yMxeR0d$=&d{iLfmcv~3IsB-)z(fQ%{0#qeMh zK^a-N0a9ax#RR}s-o@6Tpn%ia8gUe!;i*r&?H19r+v6$M;}utN@mtfRV5bb0&IBA; zIGwTe4}DyhshCP&wApvb87k?A!kH4p2^HJyN)G0cRME)-t_MNP(tH(56DCLqqdg-?&_#i);=O$;i4~7_9XO z6nUQ=##+*mUstG3S%6XnlG{l!Sw5{v%E;IjS%zXI;;#J;@cfQq>*@1u@ zHBbMT4QfpyWjq_WeH#Z*00jWz`(1`UkVu1-6;j+~wFC zp$YQz5gi2}jZKfj;Yr0*jNOUiC^lqi08;FXPi+OFo@_u$P0Hc*mf`(IE4~yh3MH4- zTXf_ibD_)yl{` zp+~8ZO_0g_`8_kUnw_ zP{3gl*;QUmSdOd{L8_DX8D#j;MpqyTq7+Ka0N%L46G&}<34B0Eaa12YOl85Ci*=pX z6@~+**&QL2unmS{oQVYNSdSqOicQ7>&V>&e&j(=4WAsJ`km4v7rv-{4)H$SQMj0pR zmP$zyBn8JSrq3iL-cTCXEZ(C0K;BYXURDeoz67H%`qV4gpzkb@#BoX4pdKsH7OFr9DSQ{T4_U) zTb90)`Rv9brPNP$AaGegOI0Vmi6C~4pb1JI{E%SNT%LA}Csd-@!I@rqO67U(Ab|W- zo>m-y*qM15;aAEhHO6KK70W?b2relqf%vD#ISVf7&08`{fBj8e${eNHrG!!_UvjET zV5k^64yctOP(YuG$dx`Cg{cu(=3HO?R8*RY9+CGcT|pY1_-zGdUPW3U3XBS(jOu6y zsDKF!=LC#^L{cQoOx^G7#cBN5kD5^()rHvIie@3t*)fJj72*eko%BR$jHL{fT4}f* zCzdvu-th*P2GYD;8Fa>*D}w3b#o|yd-gVmBmpKQ&4dqhm%y(*_M#|uv`c#+@&r#v& z1^J*eA`qVfA-8TKYAsb%?I+3P-p5@;q9Up-1t_4=k_R1{TOOM4fmMS-8qBTZ7gkz6 zR$7KCU$!7lf^BFS+M`au2Is0y4wi0vwFDUv8+ zDF;{#1vW+ttUzIiTZ*xUvg-a*AXP?_QjD9Jhh{w7n-xa(B!*{EKtml59o31HfaPE` zPs*H$xWcWB>YbkOMh2XZ`EZirRi`U{pa-sN2u>1A(IUMnM|U2L;MStP-b=0-BG&;d znh{Si7UOlf2LK&hRDKr_qSx?ntCe(@R5dIT?otFbmB^jYu#jA?lpKX<)yGz0f1P7p z+T{tTqo%$H%5Lfo>5vV53t+;8%PN?L+M|nxvzeG}1Dg;j)8_o)-oVdgm< zq}1e0SY)7?iI{5o32Ye$DLy1@!3+x&D{s9_HAVvdN8 zXkE$bIQgvfN^kWZr1-f`&X_>@<ku_jLd!{i*pR--fr2iUCzLhvj0El_%30yEw$ zYNt+S=LN6e{^1g3QL-Sv!l?%v8$Ug6!rkBqAJtVVW9OMCF>0=#?%51WiD~7I7}>Dv z&8Inj74JEOM`)FRPAm`a%?d1&vZPQFcj3s|uIB9JVB!!NTGOTJu7-9q7W+gJ{SY{z zn#?`XtKMNkir*(8iT>b=6|GL8c+`@~F>wwsY%vA}6tMYr&lc$hAUO{Re;r|Xo`G~6oh^ySju_kYFY$XSzfS?1TG~oWE2AF`B z>8;*E$|<9AD%)bdN}f?JZelgA<34VAMy2GgQGUJ$Q13D?_wvJXuImx=TPRyGU)%IF zm033aRSYB3>rN0eOW_dnFh~?mf>sEGXb7Y!aW-c&Ta_W?ptTrw%Zj9kPMBe-`rM5a z5zmdNR9qN4!`jbEZ)Qr7LL$le&GSvc=uL7!?LdYl%klXD68K*7vKmHgsSL7B2C_Bc zkYa`ioL;j@R3(3+(vTf~WX6H_&t+@c|Bfo}DAm(UBX0N{+(i@c%j;w~79^Edb98OnspE?F{}O?p67NF+=K5@T;q z1V&(>?8P0oZDmLHDPk^WM=Kj$&&E8oNK$E1~;eNhN$!_`l_bmMi!kG^$qfJeT2s?(=v3U zaC?He*+}=TaK?2Tb9N6ilsfEr?Gly5r3e5HGO=9W)Y7o1+*d1T%CQiFD)Gw|I9cCr z%6dzu=`N;WTDCCQ&ao=aQU$6hZxB(KjvTlNT$qZ2-}t?=U!$K_#06V8iT+dG%#k#w zLrxvKnJ+04rzkQ;X@cS$q1gGTOqX!ot+(dqNnEqR7_@n|ZAP?1C7`xpO~ime-MN-< z%5jgsFBe*$b`d%*`JeT@di~zQbfRLz;ay}*C z?D>Qnh5*SN89q?{_l5q$zLRU*`hXx zCpL%kxR0~8L)z_cRQqr^%DZlRyk$F>);0#1041nBC71vNf2rchbR+#XxfgDxaBxm1 zZJ-!iijikezq>IqoG#mul>VUD#3y}z?ptt1mDupV$0q7EzIQ{l3KcxVheTKXFnJSN zdKVKFHt5P(>hMjxfxoxR64+omj;EzQ49TMuck1JmVe|dO?Oys_wTpl|CibmUrXStU zPH*|y>WeDmTWk>+i5Q7dQMy5U1%fY3g1Bc=0RGa^@%;SDNcR7N3?=LWCDfqQCwJ1j zI3l}IZk7sURSzH`sVF{Fhc|z?O1lLzc1VYP1Xq$v8D6&jm;JXxiUw4IFTevl0E91J z@ZkBXqya-hg$Xk>beLfw!wecIK6Hq|V#S9VCQ|hH5o8IGBT1Ira1td-4jeXk`0x_u z2M{t}&ZHS41PGlwdFsT86U0vuAx7lPd5KrjUAvSnb^6q43lUSPR<%09>Qxa~MYL!! zV#L=GCQN`ed-g0e4A_tDt>*Gm6}q zHK#c78+dTxnTeYq{+sLxvL(naC%J*S2@)ksq(uHnVtNS@Cs&qWX&t-umE*~m=g?t1 z`tltnbm-t=!v~ih=+l?~!TtOC^687%MGzAYb|NY#p9<8;1NJ6ZkUW7~gh(9GJPs&0kE|6VQfQ@yILLs5g)X?jf*WvA>y$++RQoJ6!l(A0p>aHP>8wbu|`7 zb5*ujNyF_n6qGxGHqJJqEjZ(b9S%4YUR}01k&+w9gzC5yDZG=myKbcIzO(MSZNE!V z#1&Osk%IQ}TZuyV=9{U$`S^=B-b{=k1`|2aByd2W;7zc-4LKYbLJ22aFy5C0wCRHl zCrCFx^+Y`PL=q=nX#?lhtQ5xw>>VmcwT$Nl>IHsd9^f%3*f-I0kRi5Ef!7;rCquVgL2lMo8OAjMeu~Pj)!K+ny6BhBy zQt(W-R%JVlv{`GdwYAkM=k;-2ZLdc@#H{zvvPM;O3FJW`;L z{y8ZjDTs&6W(FmjO(|zjsuIt7h9#g~O9NdB6H1hpG&DW!LKeCZ2>bOkqL?L42C~}K zbdog_TF+}Syb4;HGqywim1R+ldQ+dKQWi*+4J~k!+ut(97q{8vFMDH5rdS|E!97t` zlCca6PL&xdrb=;>p!YE;K8JX>}Vk^YnhaA7Qu^D=}Hy!2ud<|Eps;V zT^4f5PChV#Gl~9?VLd5|fy@$u6q=BQ>;!=eO&F-I$g5F}aDfUGmaro-8IGFyKMfefWlzG0LMq{l#{S5DG;4@Aqq*75iZe?k(7@0% z$h$?dr2d0ux=#pWG9aF?DQZ+}Q$Dday?#NhDlk;b2^DJ4wFH%HWwV|_f%s6dmF=RD zfs7NAyWCKLO1XvG=tf(>0x3#Yx?1GvsuDMun^LASDOgP!WraD@n3q@SC8KO`6W%x8 zlvu(N9kEWwtmF&}xLhJ+b^@u?rN&Nn**PtFdbVI3?wYq$MRrB1&?AUJ~vAygD#~Ou%CoEKp^<;*<$_mGYEG zyN^q@*P!mLHGJVSm@Ll|R|cVvcqh{3`)s`H@ep&FFIH?}{pUZ%l5EKrQ1UX3EX|f( zfXE}e=8uq!5eY^xn*PQJM<|%34NzoDSiV-4YklCxPA#soa03e5w7I!Y zK*32-7L^)+!vqlUI26$8ngcnO19r&5)n>;e{7YH_EY_H+slelra!uEK z>0H`wcrb}R#)Cdu;6E-Q1n4eeFsa$5E%+3M)tU2lW0YPEsbyChG#KDcMV zKCoz_s`vKe@04cZe4-~T&S_F9O?Dv@?gO4wh$yUL565CCrv3tkXy}JdhYNhZ4~I9Eyk_>M!8W5=~{gxa$D#5C1sPSl;N29%sCIrT;iB)6^)9AT2k% zE9mZPIIKDPnPmST@2=xB%lI}okdV3(Xy`hMmFy5?(RRUA2%! zGSS>a8q1}zpimPbEx>eFrV~Q3p{2r5v=Uixrd&0%GYztfI}sDq!fQF@zDXlw+H=0o zP3k{MLpp}QE6LZzt+yy7PcIAdlL~)0&V;qvjNY{StG}}z)?J7z<|*3}N-7)<7fIbk zV#=WyMbURGL`ob$si_s^ltLqx>!`r+5<@0-tT04;lv2aovNs@4UI!gB?(Y@h(y(FDB%cck{=BaWqE$!O*nk z5Zkg)zFZiZ)g}?QX*DjIdohxHln|5$_Oi3v)2d>=O*&pT83pMQo{UmdDC`UX>D^}b zT;~brHr@Ot-NQNQGY9jMdp)|Dmhp6bV2fOaGpWlNf*(kKnvSg0_IA?3F#Csf)G*W| zm+x!3kpua$_6+%NNn^KI1&ng0CgndBETZutP>%8^O2%E-Xi7L}UEEmM>E+HPEd#>q z8t^n_u;*u-4;q@uZklYd@L2BF;UDFBnSFU+(rbaf0@;oYdd!hRC zl25Fr$kXBrHD-sKd@>mFrcJ91?lew6?sUb0W_%qufi;uARpP4=bh#^KbTG%OT-v^X zTIaa3z3R6S`{}5kRA=OOlTvDQ`LRZn@_ux}2x(-VA5?RwltrkJ3h8lzr zP@DV4{8JR;lK<$q?MiM>>fXdz)^>#=VE4E-E*Kqs6N2pB+wrJ;Ulfq$^(_h-=Zqp2JxN(ftpdGZ(|P zcx8)k0*mT$;FMgk?)a8j@ixp9)*mA~Z$gtQ!xDJigP*oE807O?kDz6wEGUu z`fgJesoec?q=o3uwCt@-yna?Lj`Bv~!oae^Qn!c|DdlmWroppvDcIoDpH|h9Q;SFM z!`&7-w^r}pP-s`L`j9w+YJm3aJCS!))#yK_w1rsbY|?XIDx<-Z8##s)VTBuuAKOeZ z81=b>f=ZJTF}Qm4Wxh<&d>6xeOUFWF19OUXoo8^DWnj34e&G%E(g~9ub!`46C8?eD z-Vv6~npL0PTws%fK`Ya_2>-1;X9aAvzTKLJdAPYIo7@pOBknWVEl+};{|?TtZfgf{ zD{RE^*=ZGC!zsj<$_6r zi-%td4OWqLxDL5e733HBrl#w;UZ!s9wLG6VodDrsifae1z^e8txnktfNfGq%+gujX zH6~>T23@y&R0(N}9!<00b=@2LRA=WnoK8!Y>eje)*RW+d_UeYdWB1j1^hWa4(X~GD zqhQ1U0Szx-Sw(_bff0Wn0)Nfb6Y$8k<3);lMCySnz+jM=mudwWx3a&emJK%5lnHxwF z-5Kpi6^PaNWuMkTG( zLiJm)^IAj36WqkZBjXoCx?SO4!%dA(_j`esj7wAaSYzFK+`+8at2EZ>j~XOj`_P@= z&kL1T1Z#5+n=xkGP>8927m#@mqF*ls43BO?e(N7`r?%#?P+9s#+io&9fPy*sZ7t#KhsVJrhwS*eMc z;_fw{611v=tCrV$c0vdwSPH(?N2vAv%`MAo^R%nH=3_J7VEhTUPh*!uK`s^__1jUE zM;ZnHXS{(!`M1LbKWQgQNcvb(sFLSQ zz5$fIpeE;IkFysgw|cm{7m)(5-IoLVZ(xFiz^Tx)ZhM*}a=H+sx5z@Af|3tt4Tcfh zz&GQlI?O9n)w@JoOj_N)HZdUuM0~g|nMIVIg~v(+lXcE+o zHG@)$IizVr1H8W|UW1`;W>CudH`VQ|84M<{li^9_(nv*1!lKa$(CJT-REmZpQShiK zWrm>;Fv(yY5AIDuVUP*=gUSFc<}yieRKl1#DG;*A%x1&xe61s4aNGhHt5ZXvN`+s% zj{0mcDkF0-gbA7Gfz|3|in-+RbfRKmu;5nPJ^ElV^+s@G43S^EZFsBoN{xZu(C{{_ z?OsJYX(!WOuj7Mm*I?(5eFQ36xC)JuMw5ZBC=9}J!7LFI@nm1-lRkiur!%Q+>K*<% zq31Jrg0ZiNs#Fros5~W{Q=*X9DI}(TQT1sZx7(zy*ZXt5KX11>?O^^b=61rOb&H4b zGK+P)ol=w}8Z(RWkD+10AyWcFB%;vpzL~LTn}$WB(ah#*e{#%yUayt&qF9WCf4@Ip zZ}7N4NPfixfM^ebpy1z(f&mplr111rgQTJKWl3UT=$hJO2uKZ!2NAfYn?;eNViyM? zkkgSNAy8L5-vi%=tQJKf;3)U}Ack@s}u?toEU1x^b-H3jn96AKx!Lya_b$xDffY~}Lqk2Q52ld-j2Ctu0+JZG>- zu&&p>k7mC8%O#D0LveVPVHkGL=TnGks!UV(u<(b)0V-UVQyeg&eoClQ-(yWOlSp#sFTK6zvTP=?|5Lp2 zV(k4x$DEvSbDDWz*Gy^J>erfL*C}{y|U1+0lcB(cL*MWc1Nq< zDEdk@Ze0@1>`QBoBZ&P{mTIVrw~}GGj#rVLVwqEkRBoPPN2REfqC`AIZ&%aSeD&%$ zl3$}y*D@}3UGM$#OuwO57v?5*1QeM6o$|gGA`p^GzOeOOlA%6&!%*I#FBRwQJ3O2m zuHzY&qkKcybxyD21xZh=V<@e$j86arJ*>~y#P6LqaJ<;=sBvc|RuDei<8Nl7gFh~k z#OcEORi(#%!kVoL^39Q>9@dy_boXqi$`R9Tz8 za=KyH)@+A+$|bBK(VWwIsQXf6{}8>tAo4L1y97@)2t=P_iM7dD!ItEbkR7*GkKHb( z$HH&$nBy|ui4u!|LT^cS;G*u{1lgL=_wJoJ^mb#xYD{)~uVT`qQApXh1ry>^)9{2p zfjtph#E1SWdh^+5_|Tgs1=dG>S@hjK{v+N^Z7S~ubVZG!q?Cl$nRGj5&+lPgE?((J z@IZ-CxjGx;r~Y;B@f?EfM=#dvUw+_uYO)X)#hY}y+MLi^Yc@D|h7pCjpbq_xmWta# zmE9J`g|896#RZ;uc)k+vA>ot1m>lE*EW1juhRg0eSa$a zI6JD;c&%oZq{uM%6RZEzon(ka?& zkR-vnDDX01?mLGM6vtP?ZegHM!hyNW4-sE7Mjqbo^Y~+yZjC7?Eb5=4c3gMyh$=^I zw=g`P{Eu+q%J^twY70+)<%M^6^P{3+O4MAhM`4Fa`9efVzN+PYyHD@>N!tMRgtku< ztWowIc$rx62q)(sCP+>P=WCf7{mkmjjfCz>L6nsu*Lf~18`5Y-ntKAXm`SZvgObJ( z3$I}qfz{kb$EeRoMeoodSJd2M<)?P~FHmZ*22>vew_C1BlsY)4&yQYR>3uBMW`Pky{j7VxgRn!Z|7AEC`@T<=f9KEYRi1xEg z+;1(1Xc*QoL^ylWY9#rXiD0sTGy#nYn^7pj6$XoHdTrkZw{kx=)_e)tjlbr!8~h4 z0r~42c+QV&^ezeqsc|AZnC(|QYW1vkn}budb=Ffhx8?(nC#yw|shqY{B)JLLAQ?@t94zqGHR&cFJzH3o~H&u&r2T@>sb>e97wc`MV-VK1p+hMSD%< z`(w?p&0IvcoU^9WR}XBI455(pDxcJ0WX0vG;_0_bX^dZ{~>7%4pFKqO5=WmNiw_4_)=o}vg&SjVfH~rmf3E~JZ_f{ZFVXx2@tct z^g<(iB>ntP{$56MA4w8BqWfY>;Y^A8BCXorDlmiL<-CC!S)~9;%RObr+A2y}oDl@i zt6nmU@fzVB(MFZNO0@?md|FB^J|?{T5}eMXq0sJAb7AF<4F*N}cxE^^y5lfg(}qTX zIjpUtl3nE0x%jN{FeT{TBo#`NMavJ3=EGb`HNv(f6qzu!SYZfT)GVnuc^uSj1Hj>P zUJgGa!}p`YF~IJRY4*Q@BNU}0%rE$8QX*i7BLFWEr#$3F8ut2}QUvH9kzU@B))(%m z<>V5co(p2Cp%@j~VV=B7XzPHCPR?GQhgf!#EGEd36GT-n>`%ebRaU&S~x{kz$DXQfre zCQQCpX?+FGuVS%6va~SnvD{s_ zTv4gmnIdTraf7s)LS06NYeouNX&MoJIn-44Tw-}0#^C7q9yb5R2aIv6^Z<)+$kMM@ zC$>wK;YQX0@fbSJml?Su2`cWS=bL;;Et%h_6TkZKm$rMH;6^+rLx6zFG2K~FQ;{te zQP9N#?`jmJMU0vmsJ`J*@S=KR=-g9PGOVZB1=%tqSix*$IBX^~qb~|7CDFRCGTa_c zR*y2jUu6h44V)o3?jf-WDdZ%E=}6jQpC^V~Pi?+Ge8hR3W?%5xa!MD}rV!yR+48Xm@O>_g zF3%R|V!J7`qsL0Hv}wb!sfC0`Ataf9j7Ky-GkJ^3p_N$;MWBC|{WGTOTd}~yMl;?R z$v}(1MKc7kZImDsW$ZX%Sq zj0<70Q%ho84li^XVwtjOU1!14kdduA^>Q54%2XA8m(orVw9fhmXd}sY5#7*ofw$On zwFWp78;=cqlVAAu={7R7go7@&UCUwY(y~6~+z)bEPRET0QI)?;D?{ZA5qAoGxA^{e zyT5BU=ROHD z8}f0ckSSB3=kyeH#MUsZWp)%E+r{qIyjy?9k&s3ayscfLpS6$IH; zrDQRrCow{VbtEHo5ClV#^qHvp^+V!dh&YT(gCaL-8VGG+1a+y62tTIbmK%slVa#Bg z(|pz2#^2c;<872o_5E0QUtRrUm!j`WyTQb7YG-OJ`Yr05pScUUJ^^Z0=D=9hzAuwD zzPs|i`@OOHb=GlcT)O2hc&uFf-gN79`6Ql5eiqW24%tq&n`0Hb_?^zDxK(t?q!N@hCQCL_;E~3#mtE| zB3meeAS|uSQFWDat_p%$1#@)KKwY9@%V=jA=pz`$H$5_0n-+nU9PpDlx?;8Mw)(hD zLb#VQL}sOlX^t7vSp5jj{~}VbjIk}2WYDwf)cwZ#`!WTsBy%}1zO z)_Mji!@x%3=o(M-22V2c}#Fy@ste{J=7?k>R~~)Huj?NDh4&_p})@t4aK3i*XY|fmn?Iv^3>6c(~l<5 zSW=2(vCF9!xTkdD&7l`*7&NbLQOs>HjxkpG?8KF^RhI=}&l|+nM{CYc!HwfpiYShZ z3(Dl5$%}5vdZ8sJCk=htx1~Q3@PzhFP&}&{h%IvOC|0pgp0{b&AVxvz52C=6oRkbE zu2d%fi6EF;%KZ3KRo1%2fXWXdSKWN*UiVs-px(YMmUcQfAH?v-c<6y#QiX<`!Iv=B zTE@o+T@~M>#JtD#O5seOEKwH2lToZ4@y8y|X;b@KJ9<5;R^KLXFZWa`x1GACzPnay z&awL^#b1pUnMeL;cWlSj+VoHA!uz`AOu1|P!Y>a|haE4k_>Ff#x@qf)d~P0(Rssr4 zf?y#v`(FxWuZjdo1Vq0U-Qg2r>dh^qDH4fPubUIG{|;jL4Q3IUX@*TbRW&0+cv_Y5 z7S2TeO%XU-VxYezXRW6oZWfFPx#I>!%HA0{ucIA@fQ&Rq|(-N_G2kyw1v<3-Q_mF{!WwlOCg_De-AB zV{a?#w^Yi(R3f4m)#NIz^lW^L>YDD}01{x_RTIOjew#Z5UJXYnp+0Cs9@tL{d9p5B=sj6|e z#RvMA_zio<)+|~R7v}S^r4?E$;{}SDUr0H;VdAqe7qN^NeB@;PBaBX?+Ay(8C!O~f zyv(Tq2`4m}xJcc!ixAoVftN?jjEfK?>^e-SL^!&PxdY1u^OxkzL;)*A18PJw&0*Hjr>9^Gv|B@_(^cUzm*x?x!#PE0k?lKloT68$;}B-H{rv?+0~S`o^=d>60@$+?MeP^@Qjsk;e{sillv(wZq%O4E<7Odt?I_6`Mr0RRAupBG>e0svi!aPbRx z@&?#^2ChE=R__3dKL86i!0BtiY=ITNw>1^atd61M|NEiXwnz(GcZ{!17E$X#p^&5g5G)3|ayDE&x210IstD zr)i+a1i)(;;5rO&7zNml0IY|BHj_Y;d4SO@z-$a)J_Ilx0ve0~bfy6sqX5l8png9< ztp`~?i=KrC4-X#}4h|863{m3@Uikyx?ajl(!{dMB>GAPD`fofx zKRrL+KR@3-KV3gRT|PfvJUv`K-e2ASxVpW&y1Bi&y1l%*xw!n)_5bAmt^c3-_Wbhp z{Nm>H^7`=VYVZ1L^YUu-;%f2aX7=D=bo-@m^=I4STh;W>oT0ab?)RYPSC7UAx84`; zxwoMGpE=jRTAuz)J^xvM{d@5G_vH2O#mk?&mp@NGf4{!{{`vmv?fuvLum9-R@86&L zj6Z+=eEeSl`vKrE9}E&b5D5XnQ0q^sgpP#cqf6yoG?k3S;_~R91i2i8;_-z&3GrIU zWfDlggm7LaK}shO@prjbn@}s}GMl+ZRi{=izzK&wK8v(fEtQZY1!_;XRj*X41ObR_Z& z{sC3;5gEz6-vPYd68e|$w_oHL2yrx1sQfMP58x5<;`_q4Z~y)Q?qEa!km$I^0C*xw z6;Tk|;uR8&I*beRUFZ30dQqxmX`4GsS>jpduSMfKPXv2zdG3;l0BrNhJq@kerq&C9 z2UC`MKJ$|2yAH2o(!}l%X*7B^UbdClo)b&a`BsgJIELjZ?=r|r?A1HsXeH-t`7;E4+HT-J8FSOs^17N6YZ(3&1Pi{n^(%X#1U?n#f#mVtB zibb#uvQ%a1T&z=M7)qcVBk)tKOQf!AR_}UGkJ^G2*tR8p#IbMjs;lsw@nR+l!qeTW zOR!5~rATluo@g3-UKpr3yBG!p<7F8+^lWM8*)w-oW+%7HKAOR| z>Fd{d1mf3ve5J;@$Zu{w(=Co?woUY_@}zHWuhe>Gn5)CR`1YskHUxLJDDbW#$yRby6p0=d zwi3D+4y{2iQl2bw7P{NThgKqHCJ&Kmf)C@=oI2(*_tB3InZ5z<2eT-b0<$Wd{?vF?-_=<4nL4e? z2GOQ?gBKZx2L5V~%ZSRH`7r2q->^afX|Z_lIjobEZPzH)8_mzWO1mmG=9 zi)JD}{z?UZ&&DKat`OnTg-OlnON4&lkVDE@PV?>EfyF2TqS0T75;SGN^Q;yptg^c@ zn-d=4(}<((jT&&cCnMi_G!mS~N(mIBp~+f}Qhd-x*N4L2G^CV;GTr2;LdB+edX2S@ zmYaUpK=>rjR`jH;#Ey&a=dM%sUzDS2z?WDPLc< zPy&>umJw@GLScQd+xffXq7d)IP;yQWr7)Q%l4A{cpf+T!+vI1Oqud7VRbgy-X9>uk zq<-VaB&5lvW#O{XEh>~?q^|<%^jBn2{Ic%Gx99dPRP&Bca19ryG(X2H;$HkK^-uY< z&gqPScAtBSW}KyG_eyXtJ&E^hDCh7t8Xz|0dl{x~J3ypH_)0w;0*+5s(8ZEHolR+F z^_b|VpqhPE3du@SX0=E#ds^-dg{ZusTPcg4GbLs_;OeD7`j6%V+$niF2PY*QlkU5+4w`g64qB6~k5 z+M17Wjpm}4?`|h<^y-&V!E2Z5mE1Fj4{OtWiFM8qR%cVGmTKBsexwx&wx%^`NMG94 zjQ4V0)U4^MNPXN?6l$qf&^_hJaoF^w&|$jWsk~gJsZh3K=C7vW_m?y-KSa;ldO;1l9P;=PukWIr@a3;gP>c%O8vx$)7L}y z4WS>M051nTL%NZT#Jj7KhHV{@IhZzR4w~kea!mU@t#*)H3?Edz{TD8R*1I9Zq6B!# z>d{orih!6De}0>?Vs-Ajwzp9hL%lew+rpjgu28;;3RV}FmbB$>!x}laRXC$UKs{5VEvK`mIU-mrS zqORW5bkJPHQ|ceQ?_$8~lRgF@n@e}RH1nitu10*K46CgP_S>AF5Tb%zl(B z=JFC(aD==QV-*vHtDha+8taddJJf*9Oh(2SO@jNh9-;Tv^!jNVw#lsBKoQYSUKmwc zQe&t;8F{OD<`k1FLbk&VR{3P+RZ4Ms{f&Jkg@@r9l0kgS49g1E(v@J2NN4{Ze+}n% zdc%Lev}@fRn`4Dyo!JWbmOg~32Nwm{T-s~DO|W=ffh+#FQGKz%F49^q0sV-ezc6;= z@&Okw{P;?eyL|yUsE8l`qs^5dqLM3;TGjWF4l`T^@ESOS=7YrL6P1ZSiYA)5s+&z? z)442*J?YaVDOb*E$1$$v#o^1}Va5ekZ(ctijgkaeq{>)|InfJQZZOITW9yQ;4_!z+x6JIku>2k58KMJ39b2@#DS9}U#NXcM*=fpxf%k{QP%+Okx>S)aIO2{S0`3RSJ zkIDH&C*79_u1+s*v)?Qne=ntxVr&)aYo4L%Y;caLw3Yn9?WB z5Q2GHpzKi&lb9~t#IgA*U=0)^+;Mbba#F=-sTJxc#g*1DlqDU$v?)}YrKoAeN@E&I zu~W()#hOTdI2zNitx3m?cw^tDvuR&wlB6oVRNy+(#4pjNiA6gt%Lqy9;KlRk{*@5c zDV0usG0r`SO2YI808FoFxdTTNR$ZJ|iy53&BVpc*a@xH!pa_0We$6|PwLG@1q)MQx za1FurA*Qv1o?;|}RfmHk!@U>nqe5+7b>nYW&sNvykq%Wjw^tqqVu}D)*8E7fG=wq1 zqRAGsX(>jYDU!u0Ld%$D+^kJ2{F)||iW*p|&#`tLhQpHr*Ab345mcKKY&w&16cjX$ z(rG^>0-tE(GhNb-q|@A8gNU)T^VcG}54Eo`OddcYwFa4=5ynY+W$P15p-7%`Zv z@R+FLn0N;9BfzpI5dH(G)H#`n-GW*TXrTha0%Q~8Ii%3}t4OE(BbV6s05kGYk`%F) zUB)W28?tp_6o2?$Yf>uz;k&cltlq$(pfz#n9Jp` zS>Xp+;c-NOgGEU7i}2e;NI1@@Z#j+I_Xr>OP1~#>L=#Y15Yo#w2#XB#?el%Gg1+5@ znt9+igX|g5svMF)HbEe3)+%u=K0;?u^e==>70@)b0k;MaYY>>)^U;z)UyO0DuiVL^ zZ zO~}_t$R3b9zB|ZeGswSPkjrv=IIyExeyZ6OAz_k&V&qVrijW%0K+ad72mH#uUJzE0 zTT~5_(>Mtl74fwY>m!=>~{;kUWdY|u!9Ops|ZR{s?Ftw;vuQ zu55zL@Jz!=X80NUx+LL08&w+N_rq=LbqsS&}xUQ zugx7s=faiOGFd(AN-bOv^35Q!U#%9q!bq(Ppvn(9hk)d=2pK_Ar*fzZ*VyHQvq1`< zq`KEOvzFw%2$`d=`xg*!U4(odgj}FU>QRb(IXEKNN1}Z*c8(eXK#gXh0y)M2ojw5S9=A*R&oo8~hev0)h>`KBy0=7Kr#8;iJ?UtzM*s*&3Y?waPpwdB~jHA_!@x z7Ag8BnRls$X(x19lLf3d8f7jiNjauewNRgkgL zQ_4(YVDRBly9D(|a*OAxcJPC92``e6A)7|dv~4BolpVtwMp{O(Dx6=NNebo1)Cd8= zdZYq%B*%;k=l3L+NyzH{qIWq+WgPK*p_fezQSSa$%$DK(qo7&NO#R8oJMXe*WIEq`>ltxl|n6 zHnZEuYZIc@1>+_l-u1ycj*?|#t6c3AI~58+MnB4=r9WkJISeuw!3Oz&^JKvH-Ok#F z4OnO7NCCiA5HghW=10)Op7&`pT~cYEJ;C*2aG;u!1(S)yd=KmVO)u^c)4oYjhDZ z7NziNfqn|j^j5)Kk4FX|yxA(NjwAag%yzG)$#zB>K~PCR$tu#*oV=ZE#OMvgmGqbX z>!yiS!0aX2`gor*PG@b5IU&_~`qaCy;?*oJc*A99z3t%uS&%Sf5054RxvUl$N@R12 zKmC%?SOL#@s3i{~sYi@sF6G+iSMwH7kui-10bR^OkgeU7R!KE z<@>*>oUh7*3R?X>NFIvVg)BIU_K$0`1d68$TU&DYF$}Qzd4*!7puP*L#dc*)eNLR# zxm_xIuf7Xu0+g(P^OApv)|3Ngj80PZqYgx56Z=DE>x2*e3}ks$I3X<8F(m7iO7WK& zxg~wezCs;M{+fqy_a3_0_^LP1NcY(Hjed1NJNsrj_Wn{{l*+Gy3+<(Nf$x5 zBk-gBfYPv&y?`UL(tDt%R`ZLnFh^N$^6-z;=Wob2-6qcZBg*53H?)Q?BQb!p`z@at zWKI1JNScS4A(GvKSA$j$=z!O5L8pLw-7X&4 z<-w<&1=wgX=rKDV&L_~mHy$PybZ3p*ygwR=Bl;5YNA%HrI-O2_kP!G}35O>5^&xv%oU5P9M<76k#7 z1X;(B*!i0Qknq+@{O<+V4H5*363s+J>L<<8BtCi8MIn^*GDP7Jur8BiL?KnAF^r}% zrEyXwHgfhd?3ZP6`)}p)EdBbBp?U08fLvAXBDe%2+R1~;B3j%ly2=dG54m}MuB@6k zq~*m3%I1Mz@Qlr)y0uIl@RBoe@Z-yNjTx&kwIKtqDKoWj5WQ)T!`!DDY!iavj2bAE z910L4!mMlTU@8$T@I3Et#`Pryj`;R9!&)S6kXo-p$F8fxE%(0nh{L8qB2@$LNy_gA z!JnjY4H8IXqYb@Q^-PJvcC~JaU!CnRe;&j!i3E%-QIRVL?>hKoH2BOdW&7f@Dp;~#@q5OXwmRkyxgb6Y>yg0R%K zoa>b&x`J#|w(nI~cHPWKsqo%^@rZI*$Bam)tK$(Ase|oAumv zX%u(ral^3oGWe5GIp6I~VBYlW!X#%DEqVN+kTHl?k70?x0xWtEkc}sLwW;9p8eQtZb@&ZAR@D!NJec*K&>~k zm zA0&IzUW~2BFf8&2Dn>nfp^g_1)2FhDhhOO@ya>dK-TIVS)6fTB0cw*SzkPJ$$~AUrRy;pS-7cQrNh z<=P~P;U9%O5J)PzPl3t|^W3*ada1c#x|GJbu|oxC zCZQPtTLm@}Ex3Ge%bWr#^Yi8r3O4XLe|%H~lCc?7Y-q)arn&n>H5_AVg7D@=mKX|7 zOE6DqB{Mrz5mW%3DbwUIw4}?-=yxnsNVB-<0yt?Is`0ibaRdTS*_XESJta1SL@qG| zcfTIos*i0hWvqJcAzs{v@UF;X-BzUr?5Yj=DOtv_1pnH!H|nO-$JNCc5#W)MXN5Vr z9bpiig|7|1k)66u#t0ok$4T}0u`uq*1!2yC8{m#84N3a6kgwBIXGUWtig)01Jycu@Ah$rlNwe2a$hpx=Z-0t*{<))<4R0$#JsV&8^8{l5Wze zw1T3&=pgaz!`OB+z5}QDMMZ402LbX6rysx1zsvsF##<5?_X!RO3~MV>T{7`-1`l#_bqI@- zX4se*@7`Dt|1b324_l2=t%}EtfE{2vAx~T`M62=Ray45)cXxt(>52B(c)I2t*rlPt z#=P8Mr)u8)`&xVfjF8J3IBzjh%Du#dM&NRcA)`sbFe25;My?WO{B-LBl9fd44Kw4*{12qBl!@D!iE?okRE4 z-7}Giz39x3yTkG?l)iHUd8=69<5_%59kB54bi4Kyy2`(?$aXJEg;>Hx!p^?P9VSNt z-U7+Rwm@u&{gxVb{Npg#!|oR9p_vdq4aJJDZPf1=H4W&scqBQ z9f!o&C^&U;E8@a?RqYB*nwc@dc-QGttXrrAqx5;s&@#5NGg15>0Bt~$zr3b_w+cYK z!~?D|8#Bryvwur7#W@wo!Mw>ZxX{RqnYuFw01jHImF+q`)X}qI89|EU4WX(y*26gV z;y9FBzTB%lPIEc%={}Bu7>Mb;-qX4p@edz_HLoHi;B%J(D6rcRj|WRWRZ^v%gSq^G zuB}2i5!)Z49&nmgWC**tE0~g4G;{$5(FxTL%l&m7FD!3^knPZ zMvK{==fkTc6tFBDAL#(LFWkm2#2*+jIY~<~t~0~0^ExynJ0e-bdXy4_g2QS18XOa- zfWkYl{t2S`+dp#SySVX+mvFZ~9Kb3YM72=FMcgeyG(;;4BL##!;zEpzWUdIbyfX?o z4;VPki-0#XxLDc1S-~z+yra)KK|f1H6x1o<7^;gC4%bi0ID!aTe;m!ERyj$v6IKVj4^vmKQ+7neS{i<^2dEFEg%E8 zBO6;{Oxxu&G zHKMD*xdgVw(#ytLwu*=>dxWeQ;+emMwhXv{zbq(%+OcdCD1o#;4Jfz7G`Dg)NdFtW zE3+b|A%n?;$VC(b%e+uUEW|6KfHAnDOc4wP6r2foi_f$-$ulzvWE|5p&C^89mx6!= zfFssaNj!_q(o;PYBq|leP1n=7M9a?X84&FGL3#;K0Ln%H!58Z@N2R01ZruLHb97Qz zizc0`PA2@lXB?$a!%i>#P9|J6p%YFYiK|^(PD#T$>g2F-gdg2=QtR7A`J7K-i^uvr zKmC-kzO=0Rc{Uq^!yOB#YO_PsDpb%KGR1VLJUj~rMaXx1l!>&^4W-l#bx2E1JWZj1 z3Kbj*C<7Elj4%UDe{-(Lc+r*Oyf%ZC&e%ZAXaG6tK$UC_50uRm)X@d7RYO9rA59kH zcs(TSID5GmDMdOIp)jXx(m0J%CPh|dHOCqpNA%2&Qqn>#Jw~kzwPe%~<){!+qLJkr zx*r+3dNDd4)UYH(ORs#8b)_cabXNYrL0+srYpTn5yi+_iHa%@NKK_lioXAJOq`x8S zw$j=={`T$|^IXa{pnRn$`6`P-63#?^L(-V^G-OC7Gs8&!?9Jkksm z(o9vB$_&d{&Com9>^coR8x{m`*;>sFTty^Zg;`g0ombQk{{09LWirPLQ>HQ$nXzTv zA8}Hb%N-NbmTpNaZs}5Ng<7S(*7!gV;N!U6wApH`#__zc>AW=D)fiRF9q7=(Gks4v z4O_$tSF$ZzC5Z^e($^U~i2$`Mo^e|Pm6L)JGH$C|xEYj3-P;13%*hm7zcs}7?c4Wt z$ojQ1i&aqwWUh{6j0s2;$4wQ*d6iUksp-Ou$&J;MtrgMRjpN|l)H|e^4BZy2Nuz?r z^w5taZC3u!wPbzW4+dc#F-PuWI;#2>fB_zF$=$77;bR;C1Xzxmlg2HD5F)MK9tqbk zG}q|!mh+r7F?>#XnL4VQ*XgyG#lp+$b+PT;*R*5)KY)drJ1oro8#f{Yl$J0 zomBY!TZt_L5EA2t)v|fBx5kLPP$kt;4V4Kbl@Az6RE^x0f+^9UToANe%O%C^Y5)YF z)t3ESLyBNziP_dEWcGSJW>G#O6<063CZG*rcWh)3c20AZGy!;1`Z6`ItXA!m%9(2( zZM~1DZ5Q+zFzX;*YgA<)nV)X#y-5PcEM?wx)jBG5WF?g!BZg!kQDP{$PqRZmCRW2X zgyO&?ErYVda68|GWoCA3Hw9EYFW%57gUB$r&@m8$45enjB}6eABNg3W$oN>0Wn9u6 zxKRPgR&le=+rT6|=A~yuwsVwTO<^l}lEkZ4sqZQeo@m z7Zc`|c3XW6EgyRdA^SF(Mxv<5+jm=|}*<@3#+GP9#TfI8papa<&PZnHB@sJ zCxpV?5yQ3=;-9V3ljb$+qtBJr-u{->(-`v4f(lRp?W`XYt%EwP&fxi%9G@#wY_(x$4JgoXC06Qzc-M zl%qMa;~Nd@%LVHP4l2+^YhJZUA;h9aMSc@tLy zlb3muXZVtzd6Vabk#BW30QrB&2U5^^C&vO-;D?9*`4A_ChtGx+kNKOY`3$#tr_cGI zPjxt8d7Q@rs&8^Q=y`|-@ic%3c>sEtfB05VgR`Ibhp+jEe*?5v17P@vsn_~acY~`p zdXb-dCQti+fCDPg_=@KRZ20?%$9oQMdXCR?{uE8eBU?ns`2nNaC^76c~Urjv}btG_j(N<{nFq4-WUE%w|be+2iLFuA0LVA zH*tp#d8QA2=*NBC-*D>R{z|WV?AQME@A25z1~njY@Na(*w|(*_ea1Ka^N)M?uXM@> zh<^hAjoM=HAi{(S7cy+<@FB#A5+_ouXz?P(j2bsCbaQQ>uQw1`2`o5Kjlfn2wFyjP zu$4eJ2!Z|M#qlQ2oH}>%?CJ9-(4Y?A@EZ6ppGl!gmojbY^r=HEBn2XUI5lZRl>by7 zWd8ZjOBWP@BaPG=mu4(42ib z`sh+%{-X_$kXmXPo4;5^=tNWDnB{(36qR9+|6O`2svO~Y=ANm#surAWrpc*9u~zDp zOInRrmZ`7$`fEe0PFg9j#Rg^NKk_K~7p)Ls!52IU;kpH~ew9k9vDx}6sW8N9`|V9$ z@wn-s5{aUiwEG##8n4)b`|hK{V&g5m^-AQ%cKOhokeUy972LF{(RC31WA55}Fqx8O z(<;IZCnT0%tw=mE#Wekc4aFIM3gLG55Nk0OI{xEJLTXs2slzFEx#~44yNsN5{|xM% zfdgSBE`%7fl8rz%c_mpKgJIL#t}h$i;gQ+wdo;XLp?MI^HJ7^uoA+FpM$}uqk?)0U z8pSTtVJ}DuD@%+0tzh|V{2beDKd0o+2Vvu#Jgulf%68+bAy2-(u)^@!feSvkZDwx- zN0bR+A!Zw-7*06kkxM=~<&|50Ip&#bzB%Wed;U4-p^H8`>7|=~I_jybzB=ozyZ$=t zvCBR??X}x}JMOvbzB})|`~Exd!3#e;@x>c|Jo3pazdZBJJOBPX^wCQ{J@wUFe?9iu zYrj4B-FyE%_~DB`KKbRFe?I!@tG_<`?YsXz{PD{_KmGOFe?R{D>%Tw${rmqv00St% z0TQr)20Wnpq^7_HGO&RTd>{lPD8UI*u!0u6AOelfvap3Nd?5^DD8m`ju!c6gAr5n>!yWRlhd%rv5Q8YhAri5OMm!=Clc>ZcGO>wH zd?FO1D8(sKv5Ho_A{Mi##VvBNi(dR97{e&WF_N*2W;`Pr)2PNZvayYBd?Os=D91U{ zv5t1UBOddp$360~kAD0kAOk7LK@zf%hCC!96RF5WGXAoWj(j8}BPq#AQnHekyd)+w zsmV=pvXh?tBq&2E%2ATCl%_l-DpRS-RkE^`u6!jdV=2p7(z2Geyd^GksmopRvX{R6 zB`||2%wZC&T*2n zoaQ_yI@77nb+WUa?tCXa<0;R1(zBlSyeB^Msn31#v!DL_CqM%#(18-PpawlCLKCXc zg)+3E4t*#@BP!8}QnaELy(mUAs?m*dw4)yVC`dyp(vgz1q$WKnN>i%Rm9n&@E`2FX zV=B{`(zK>Fy(vy}s?(kFw5LA(DNutd)S(i!{-{PhDpHfG)TJ`DsZM<=RHG`@sZzD7 zR=p}#v#Qmta*3!46S%+zJ}_gc>qUMb7r_pGFoYvK z-(3_Ji};l=hBK_;4L=vaThs@KLoDJEli0Pi-QtBytl|~3xW$O|a26Zv;u+Jp#wy;$ z7V}}_9rL)y820QHQ|#j*6S>Iog|QXeYvd&}xyjtM?-gb2=s&ksd5D1QCTC=pYAD;Dj*# z8tPG(`qZiRYb-u7g&fd23V;4^#a=bt>0R?Wu%8a>DM+n@VG|n)xaMoHiLGp7_th0q zP&To1a0X#`(%|9Y8#H$#JyKn4EqTY_cO&~ZfT2Oyb8$Z>neslg}t`I<~Y}R zy8nO*zmhr!FPAyeA5C+@f@0WKV7k)@Ta9ubJ?U0A^wI@O3@8j+6`K!z!%FzhHSJQosAJK)j0cD_11+64b=;n{t7 zzXAf-0v_qJ@C7X`o0>23VR=H@sBUqSPX*QH~)L^qrc?g_ca#! zUd3RoKWyv|7U4P&gzu#F%jbQbeU|w+`$@!J{4T1-PpbWCu+PQ+Tae~U_0xXc74n%>!-Cz#x zpz`H{_K}=1?3E|5+Yv(F3^t*L4c^G#p*e&KFFOt|U_98H%;VcFtG3r^C6(chG*q23F zGB)G>jxA%7Iiobr7?fF&kWC{th8U7nk&b1fH;NdLG2=ImBZfg^kdY%gLfAH15s0Ou zI~v%Dq1ZdlV}GsV6)_k+=HrA_7#0bbKK`S7DcBcXBS03UcG=?=DVaeoBz9FJ7%3z} zMkI4N+3retNwRy@KHUD*{%s-#RB z)@F5oD#WU*vz5u{nJrDBz&8XXr~#^qTGq#3EDT;BfW zVP#|&K_p)GWnxjJ7xATE4yIuNraTfRVkVYeT9H2{rehiwU2YLRJ|<-j7KM3{T~?-M z=E7n|Q9EuXX!=!4T3Be7CSP^t6UC%yQl>d_<7&QUE{G)+WhQJUCTcQ~VAdvO8fFx! zrfwo;Yfh1G{^no?rxX!qY5pQ|a-?!Dr$siWb4Da|M(09KCv_I2bzbK`W~X-MBX@S^ zJbov5x}$iGCpwm=d5$A`rl&V{Vl{Z4UKxWRWU)f+v8Nd-;H~jhD1;ne ztwP-8!Z1`p6)0R^wSp8#!4y~leCib}AOnR`s3+K5g(5?$!NMwZXotFjDgJnZh>9rp z@h9L7UhctyDKsdHvgp$x!ys4z6%4{4xB@KvffWb?AXq`)=@s6YLMTwdCj1pDM1heW zDUurLv^AU*L_vds!Y2fRlm@~S^qz^P-QXERl};#ye!?GA=)xg`tO>#=d;%-{fzJs8 znnq||0fK6}i%wB=PQ#9v;)!YTA!6_~=6p6DUDmyVDyRbX4TG-^11S8#uMR`Mse%=hX)J&O{wx?ng&IRFqyl~B z6@zN(U%7%5tbz{;gD0rM6bwQuKpqiJfg83$%H@JEM8SUEDy|-?V7USnRBA3PDxniMAeMSMB zs_VoJ-o)nBE8wZe;vW^DX%%z=C~yKYY=S93>A&)oFHCq#iM*eb?mEW5fN#s0y(@?Bm5=^y+-%KpJ8SV78`DZ%Cy zCsaW!48s(JLiMqNDTtvJ)E>E311qGTwMqdiI9t%}D}rABYSJQ|#x^Y|46C#CXfE7q zE(B|^X6?$-q1#676wIoRR)G}!L6AD>6g26Zp28+f!Q1*^Uj=L3%G}-NmD5^kr9y2k zyh1AgLKO%CC~Sf&41(YiY&A>)C-C2?z8a_^!!YQeE385%xWdg<10xcHmR2q?=%?^j z!zX}W=2G0eV02A>}$7 zD|qe{fPx_4>+vcrm?73GNC6cDsDpYg)DlB0z=GdGX)btzDRgP?xoZ{ht+YSmTGCIm86%D5+7h@zx5hjmvFm5sveI_bn<7kp*D^H^;H_>Fq zaxz|~7d56W7h_~{(JAlpDb8{fO)@aIqW&do5iu8YC?4}+Dl;q!Gh>RfGdJN!s!>Qz z^Cr3_8=WLJpCMYx5m!ocH=|uxYNa`!GdicUI_p?9$Ge8HlKo2xQ7qmeiG(sn|LN7E!H?%`PG(<ngHB?8nR8KWkSM^XE!4V{Z5|D#9e1khs(mi|w zIV6Eqm$g}+HCm^&TCX)*x3ycp{xw|3wN57iIef!CIFeY~v|R5sU-z|N|21F-wqOtT zUK>GOC(=EL16dO`V>h;AKQ?4Xwq#FsQYV2p+%+MI!x2z6XLq(|e>P}`wrC&q5r~5z zg~MWxwra07Yqz#*zcyMYK{)u)I*Y?H$}>`^%AHE$0$aTm97A2(bZ z!EED^Z6mjHKR0wow{#CRIoOdqD8Y1Rw{~wgck8wie6<{{Luz+7d6&0&pLb&?!EeJ6 zHy{Cezc+lxw|uKL5^%#Ct%G~dw|?(8fA=?0Bf)yFkvojHe;2rcA9#Ex0eGtsb|bih zKRASIw-T&Tb4R#^UpR*T?{;;gQ8;9{hkrPTkM?qx(K-lsh@Uu$r?_AnL4c1@g{wG> z$GD8M^@fj8htD{U=eUkb^@xWNf$unw2f2{@bP|k_I1D+GC%KZFHW=N*W-B?AM>&ok z0cLyAkxMz2XE};9xflJomVY^zBY2T}(Km!SgcpHKn>m($gBQKHnwz&0GRx}rCCH!wP*AG)7!w-Ho%7M1y= zmp7M#Lw@h{I0(c#EVX@mMstI*q-T0|v-uXCI;ul=5_H2rw1b@Iv=Oj_K(IPc+c!VR z1Fy$SssF>S_xk>=w|aT&ITm?2u}il&D407OL7zQ)pN#`NpfvgeZK=vfBHZC zdN*wQuqQirk9iikgSeBo64*L9aJzbd!%$~CxOe+aTgSKGG`HjWxgYm}UlFF~`*t6} zI1mB5|AxB@HN4w~z?gT-HbH&{nLVEn}gyuts2wj;c} z6M@2uJi|-;Zgcq+ojl6-_CIt3vgdR>fV`;Fyvfh|%P)M(N4K$8(X8+Ma3{e#2!x;m z^~{HSQXjm)Cw$J|JkUG$glAFAKmBcwgM#rxaQpPp*F4hSJI>ep(vLjV8#lRM(Y22~ zZ>Re}aQ*|bZ@p2!y2THDJzV^HbA!ci$2-tHs9QYCqrGS!ffn_--{&?GsQNqnJWjiP zQI~xKMf~97wh?I2;}`ch#DmAjIp)Xt(Puv919cMcI^O_0=*P@G@cMO(zCe_|Jb3)% zvrJxesRyfZ`3|e+dA%ty=_N+(<49dL%tTB zee=8aIEeL4gM&9*KlWS4Jzzifvwl#2H9P41nBTe6N55+WzSNsPY_GSZD?U=se5l`i z)b~5@t3PWqzR%l#Yj3za6hTkBKR^%>IFMjLfk^)S>o#y)LUKfuBm~FMp+SomF=o`b z{*hxxj~_vX6giS)Ns}QXCRDkSWlNVYVaAj>lP1iECvoP~xszv4pFeYcODGOwynpXV zrkp6S;lGFEhEjA2lxkJ0SFvW*3AJWduV2B2C90KdS+i%+mP~T*U%VtmkCJRUmPpfw z;wm!Do0e~1zkjdd4Lg`{;jiBSCsw?eF~@KcGa5xYQs`8@Q!6Wxdb4q7&!72LHawbi zX?LJer&jIr$h&|1G{c=7(unJLM>ZF64bRBt)xUuU2kEYKapQyE3Rk{dc+-VM#C?-K zU3$KM_o!3ne6guFf{&eY^*#{%cIM~Ndroqkefyc_)5n*emR;U%Vc`=z(#~Q2l5XI@ zfhQp)?sF;$Z@S^eI?Lv3(802}a!Eg#vOUw2#ImHp$my2i7e7cBXzteoOt-T$s6nH;YJB^ zh#RY$eE5lHoe+EM(n}-Qx>3yHxb)J@Gj~eDyd;S*f*cspj5E#%$E>q33+2pH&pr9< zlcXB$3>2*7{4CVaLlNzAJwX`-i>^c=ja1S}R}-w!OKG|XPD(lL)YDI|IwDL=NsZ}I zP*F`))m1gJwA5E!B9zrxX{~kAMPbdArEqNR)z@G31W(st_X5_~W0C%yk4|EBU5CwN zp^a8r&x}}y*=u>7R@-g4MN8Ogi7m6+amg(=q-DV!Ha2tFZP(q4QcCw)cVvCn-g~)C zf;f4>T?Yw#0S-7>B&_8(U2gsrSmA|PMS>fH`CX@8hAFN%(Ig6nSYCJ5wbaEVUGDcBfe!B;w@#)S!dwL$=GI=!UsqYa-=%=yHdZZ-88FlKfRr-dUm$fe2Y=hhc6zsJV!j7D)&yKrjHNWwi z?YmiW=NoazQ6h;W$d+61g;z{s%IHSMTk*viZ`|?6A&*@0$^I#?-15sY&s_7(Iq%%_ z&p{7e^wCK#-SpE@PhIuZS#RC-*I|!c_StE#-S*pY&t3Q3dGFo#-+>Qa_~D5!-uUB@ zPhR=unQz|t=b?{Y`st~!-ummY&tCiOx$oZl@4*jW{PD>z-~98@Phb7@*>B(d_u-FU z{`u*z-~RjY&tL!j`S0KV{{a|40S=IW1vKCR5tu*)E|7r@bl?La7(oe6kb)Jo-~}<5 zK@Dz@gB|qX2SFG@5sr|AB{bm)QJ6v%u8@T-bm0qO7(*G(kcKt1;SF(^LmlprhduP+ z4}lm&Ar6sgk&0Ec{^Av}m_;pak&9jQ;upafMlp_& zjAbvnM+;nl9#>ovn+*R=6S;`j}8YUf~K>2%|;k+@dO~kOL{0 zA{P^Sg&?Bv1WvfZo?B$aA9A2iP$0uSt{4RV6cV}#f)+H3!!Sh@a-f4LfFc$PDh)gz zs)HOv!4$8cXcqHfQ7L3p3ZaOFasCMf9q3@6!@$Q$Q7Vj2Od+9C_(U~I<4}m^U<#iQ zhDULVMOc_(r8NBnERYHokjhk_rhr9KxtI@FoPwu1h{96~6H}2+;S^BCYF1$Z3Z9Pi z6B7lCP!qaQv!1n!xllz@eLB~gOjV>(P{m8>>P3CTLKRfV=vS}W6|v@k3V)4iV6~`^ zU4+80BlUz^Wdc{mhGG})ge(|$v5Kxr!4pS~315l2id}qGjQYsMDh%t@P6#6=i>1OU z+R571#={i(9BC&oyAsV-!4&cEtZx3rI1g5IH42;<22xQw1y;xdxn<ipkstX`MSv3;VJoNtOAA(`K3tK{9qb?nRdB^|EgWJIkC?^PAxuXF1QA z&ULo)o$;J!J@1*%efIO80sb9mK@XbHg*Nn|5uIp7FPhPfcJ!km9cf8Vn$nfF^rbPK zX-#jM)1CJ8r$HTRQIDF`r8f1cQJrd4ubS1ZcJ-@a9cx+7n%1?p^{sK8YhCY}*S+@j zuYnzGVGo=Z(VcE}ubbWNcK5sC9dCKho8I-d_r39*Z+-8Z-~IOYzX2X_fe)PE1vmJ?5uR{` zFP!19&V}6?b&p((`QfjUIK?5(sEdoa;-%Vnm^)6YkApenm>T()OMa=7dpYG1pE$=e zE~u4vx#b#v`J9On{&STRZ{@ zf4a=0zU8S~JnLHCy2rcT=BsP`%VU>$*_m|@v=dA1UN(E6+TP{2+bQl`o_n3@zU8}* zDeqd|yO{c(<-gx3@N4epwQjEE!!s-KSzbJ`8jt124=eIlp1iIqZ{^G9D)Uv|JghoD zjnBU-^rJ6T>A@BHGY=l{atBx8tIT@ByZ&0RpN8yhWP99GNcXR&ecFG|_Tc|K&hqNA z@wtrrEh}Hk%+Ip(u?+nyOW(@Wud?;gjD78=>-gMHzW0|8{^pDS`Q(qj`KOP5HE$nW z-EaT*-yi<|_>X`7<*)zw@1OqsS6}^UX8*O^4*=m$0OgMW>CXV|4*~H{0rigo`EURH zum7gu|Cl8JD{ufWumCgg05>oJJ8%I%umMAG{UneAiNyj>5Cc`kOhO#1&6TBcu-e-5D9@$35AdeiO>mQun1*P3TcoE zAJ73Ka0hh|3vo~jy^sr!FjtaL4404$-z*GaWen4>4A-y;&F~4|Fbbh?3g@s2>+lLk zFblzO3-hoG_wWn*5Di~N4F{183-Jv3um-O$5v_0$0Z|eCFc2B>4jqvT&rA?Yg%C5* z5I6qO4cib7KT!_jkPb)D4oeXaA@LF?@f0gj5+AV=P zcX1gTr5VTZ8Ot#mad8^cu^OpS8COvoTTvF@(HgUn9=9<|4|;j z5gx(u8^w`PiZ376@fz(h9(z$Chfy6Pk{uUvA1m@6zp)zw@*xMZAq$cq4^mLb5h2Zy zB++pq-LWJ2(IN3sB`=aC4H6=uQ6guOB2jY9LNZWBQY1@~Cr`2_8FD2*(j#-yPX2aM zC*iCp>*OenvL})9C(n^4qtYgU(jspXBSBIEH4-4XQXn_7CBHHzUGgenk|4LzE4z{- z!!j$!vMRBXC}nagQ*tfgvMuG(D&4Xy>yj>oQYptIA??y6rBX1d@-E-9FXNIhgYqSZ z5;1S^EY&hC!BR5Ck}nz4FU5o@moh06(XC163M=D|8+vn4)Z!_ad%y|X-DLKsBK{`9`$J98jC z({mL_<2(N$9|U1Lry#fr13z~Gp{BDt?~^@Q;uE&B3gFW#0Mjt|;S=UlJ;`%6UjiSb zfWuab!-!!$Dbyuk;R!HwK6Su92LnGP!f~O|+A98`iOqDb!OSmHSR*NH0O#x9?G$CZl zJxo*|q_aA8luBhnOn>!NL3JitbVd_GqVdXuaY>soZRjNwUHS9A&EI_F_? zRU%*qc67V6IL7vQ!9o={Y-dq7d1pc&0yYN{w*Ewem0s=CYU>t!YXY72dV`f1s9=rj z*K+%~E0T1G6XI-B`71#5ki9ingLIAm;bLFeEAU}HSvi-XbqDx2A;vWaPS=aw42r2Y zlN%W(<^fFKID`%3LjOQ=DVLai`72iVnq#7kr{JdO)Kaw>COS2OAyo%LS(FJ^C0bzz zPF9lh_eAToo>T!_Z5f?OH+$<9d8b$Qc<8mystG?Y^i%=)BN0zs#B zo3T?dgKx91;d-#4npi_Su>D#>2-}^D7&Zm_uSdJEak4W#JGC>jwNaa>ZRE7|d8;>b zwN0D0a~q>$`?Wh;HcMNydE2;)o3uZhwU1l5W!p7W#WS47fn3S^n;Qq*$YVUmU0ljnT)myV#-TjHzkI>FJj%m-!znz! znLNqM{KFyK%YPiq-(1X*T*tNCiOH)KvwY2$e8|!4Lh?byErYI(lOi8H5=0*yUGt8%?Vx7AAQghoy!5;(fyp!1^kI4 zJxFFn>XebzJ5(>Wc{t=!Zb-OW>d&s!bUPuU&~-2uMfMcvu&z2Yan*7Kd!AwJ|Wp5rwh#xtJbS)R(vZ1*Ol z_iAtW{)kTJnU3eF&gU%-=siy8MULoA&gfMx&KC4iP!I8FF7=+?>A7s_8>Q(PFY2#; z>Y-lirGCq(o>5e9^?=Xq#vbXwt=lb5t{vPQ9pXdg^$_gLq4xi}~e;O7a>l&Zx9zV@$PUgbi@@$?oW^U>? ze>6JZ>p$NxLSOMlzc5PQ@lKyGQeW~`e=u5K^DQp(HShJqBKB*4_8V^ZdB694|M!7E z_=SJ?iNE-b|M-zV`IUe9nZNm+|M{Um`lWyRslWQI|N5~%`?Y`jxxf3p|NFr|{KbF% z{K>!k&Hwz-KmFBz{n@|$-T(dJKmO%^{^`H|?f?GqKmYZA|M|cF{r~>~Vw%8#1PdBG zh%lkTg$x@yd(U@w&rW)eq3!! zsxQdCJ<|6CN8yGYet6r68wO?Ki5*gOqEHI87}Sd}%Ge@}C)&6nju`4#A&(OJ$e>3s z{sW|eMFw~ze@WiAq250XnFl1QB|up#vehsQ#h?G5V;Z6+t=; zrIt#1sh@>vnkc7@dKxLHlVVD$sF~gvC#rX<+9#`lnkp%arMkK)t)1HXDXyXFTIsAg zruyru!ESWwu&?r3?2f=HD=f3E8e1#0w@Q0avOO+)ZL`@v>+G@A?)q)7u#U^CtmKAk z?T^^1t1Y|SZtHEg(aJk5z18|^FSz-Ni!8qI&iik@0q2TttP`ahoE$5#dl8emUZqE1o#xi#z@~U$vj z*5^JHA~1dm%!)8_FonOQi62mS!aPDqLNS$3FRb9iAO0{1Rp3J}A}kCB>!AuAJOLR_ z3?iAVC=^#nK?gd3f-0)m!Ul%1gfD!GKBABVSm+RoS=2!eSy)Cf5(_S#$iWWoh{qfR zLLYF^;1qPg$A3Hl3Ux`7DeQ>HDeQuYR#e3kbdZBh48;{YuwWnA=n5U|018sL<0{rT zMj?jsilZ#bCw9;YFvjsHf7rnnRT)F6bYcglV5AAl5|1hDAP0hIMJ(ds3Qjy>2T>Tt zS}@3u75-xwJNQE(*{F&g=pYbMi~=$F@yz~EW-hxh@gaG z2X7>2EM53cImYuS`p7{J>H*6XLPZ!lhyonvnG`7GV2SReURn5I%|Bq1DEt7#CId+p z3{r9sK{@3oFImcebdnYSs31Rd`O0Gkv6UR1M-Ke?4^!;G3brgKICn74Wo{CbE;SPy zg(43r)H0tljLIpR`A>a9g$gj`sr<4+$tuwFPi1MPB#{z`9RNZtXR-nnpioIFP+^!; zpn^O^no)ZOWrf42LOcrE)1sX7tpDiYKk#8swqmrV|2XG2|KW)pP+_S;g=b&qvjaf{ zHLXuM=SBHS*r$ME2NXr@QL)m>!~V{dsb3)m4=nkQPdxGopO|GXc&G!pdgV-r#G`3< zkRYj?=?OegqcR;^!=s$i3h`LyUZZ+fv_3W|tk`8P2El_I5CgXKE1+I-5!k`*7AlW~ zXiEWV6j)T!sIk3@ScxmZs6>^c{}_Zcr7+B4iYKq3C<_Kp8kAkE^tpc}iWN3ljn}d_ zu|mm5C+{fSS9Ecqx~*!P$ih8iO(n zNE-7WQAO>6)*I2Az5=NK_-T3jn_#HS1FLt8f^#R^-k|Wq6oL4}S&7Qs`7ZY;uCOLM zh2q_in)jv|WMdVMOjIZw{<#V{rYe!;K}-hIl_=NMv45d*PAX#eeppc^Cr~LAeuy_H zZX9xhReFk`v~s{Orf*U5!3ji0lD}Y`a!`7^R|Lal6rqu`GRerR5ppqBxt=g?TWw_2Te)!)1$t-ZJXG@&uHA`O(8vqoxbq zZz~$3(WWJ&!Cjq{Pkgnb7L+i#%{=9J*b^VUl|n4|Y;u@Gx0R1x>>Xn|=!Dyp)*pU0 zg!S@BI!hcb(mnOb|03O&qnO)C`QsvA!GkBT^^`mKq)H{5l{58L+js@{(aWOJ#;y<< zKYn^$-doFAa(4O{ zUqz*y2#O$fNrg^Em76&*w$6p#-Jg|c}o2;z@AP=z%CZht5z zL+vL@!B3Q@pCIba3C@DIB%OsxlegoY-=*FiXVN{^O!bA!uCwQ$Kq66~ll-V@MV}^aOqfh^G?~b%76`5QjVf zNmBq{K%l<>d31O}P;rN6=r)x&Kzz7Bk?2>sLqM6>i3wzdn@E796nr`8gh>EXwgR97Jniz}sM~cx0KzaC!o`{K{SckVri>zpiU08&}_=?4- zj9jRS$C!(*ctEmfjL=AY%NUHrsEcHTjixA#4fsEALyi+eb;7uf&Df0v_>Hw_jn9~h z+1QTA_>R%&i{*HU=~#`tIE(W*jm)@@u;`8P2#)t?iTi_(2zij>xR86Oj{`V3>)49~ z>Hd!Vc#RZEj}{4!$!L!l`Hv5Ig`5bG5Gj!C=#k>+kO|3<`KXcsBzY{^kigiIG8vQT zIFmMMjxVW@Fv*iU>60t@lPOt~pm>hlNR1@vj2+35@_3Sk7?d<=h!ByKOu3W=*_5p| zl~!4m6wQNR?)(m1xP8S-F-HDVATkZ8`~*b19TPNtaOhlsIXZ zE}4cPDT*4Ylxhi2d6965lFd_;>Ufl837BX3m}wcAZP}QA8J34Bm~q*cH))h) zX_6fKxJexU`qxqVsnVE^nnycxWq8X5j{uz*< ziJQAQo4;w88+n_m$(M&%oPjx+g;|-fxtx%Bna0_ip_!AixtDmUo3zQBNEw}yIi1WI zp3>=?-uaxiS)IYjox^FKr)iR@*=ptKnBxhaz=@pNS(mN3p4mA+^7)zHNty2HmB)#d z0P36q`j+={p6^MZc$k~{xt+whpaYto78emDG8-u(A|Zky8rq>8S|J`9q97_EB3hy( z${;41q8^c2_pu-+@}e6OqZl%y6;h)Ta-$5AqXx303Zf7#Djx$<5g1AuE8-y=`Wr}! zqWoc`MEV&`s-ze4p-DQWOL`wrTBRK!8%$~%vEihU0UHOgrB~XeV)~{2iV>y;F{bj7 zrUkL4?a`(L@uuhzrvovk<58yqai`9ar_->f(@~}z;TL!+r0{X3aZ#xCaj15YsQR&} zmeHvH@u+(dsRS~qWDyt%F{pf6shc_-oqDN&0jdF#sXbw;r;4hns;aBXs;%m(uL`TN zDyy?ftF>yYw~DK|s;j%otG(*0zY46uDy+jwti@`q$BL}Us;tY(tj+4I&kC*4Dy`E> zt<`F+*NUy#s;%3~t=;Oa-wLkbDz4*7uH|a3=ZdcBs;=wGuI=is?+UN+DzEcOuk~uL z_lmFis;~RXul?$;{|c}HE3gAgumx+d2aB)?tFQ~punp_54-5XW5i7A1OR*Jeu@{T6 z8LP1y%ds8nu^$VvAuF;YOR^v}}5`aGJDqy0nCP5iSd}J1ezQOSM%?vpxH>A>j(2V6|QA zwO@O)pWq4;@u$}jsBRjxdvUgMnzop_wszXKfbq6^8n>GPk+++H99gO%kXs#58o47%rIu@@Y&sE#tGJ!3xS#M5s^Gb! ztGHRq6)n=E{E@mY`lG1Zx-j~>G8(%y8WEyPy0;s+rvAGToQu1?OSl)>A}VSi!b_@| zd!@#!xl&5G-4VPI!MnZ-y*dlJ9TBzBYrQy|3CcO430k2Ay1kg$y$(v022s7&YrZp^ zy&ZAB>r1oRi=g03p8;B%3>v%Q|#q49g50L;AtY@PQz4gI^m z{Hws``@h{epZ4j!?@OHq9C-!Nzz(dw8Em}|%$^Z!pa-m<5?U?>!NDE8!6)py9?YM@ z*~0rd!tEI@2cg2y%fK~^yDS{TApE@*EWzUYiZqPFIh?{nJi0m@p)w4?|JlRh8Jh%Q z#J79HQQWym453$ypIQ8%T0FiOOvRo%#b1oL{#MMzFr36ZOu z#dGY!JIussOr9nT$75W?dknU6T*qg8#{>+&KYVgR?8kB3$BEpvfNaKCOvjI0#w0w$ zdd$dQ`^J|{wT?{5OAMV&ES-j2g@~-lR-4JCytACF#2-A!o{XLre4qVk$*8=^i%iQp ztIB9h$UYpx>e%*vmP$MxCE7CI2cJj}KX%{6<>%Dl^J49d)$ z&0I;!(|ohU?9DM-&95xVDF~lH{L3%go3k9w)GW>IyuVV}%oBXgp*+v%Op@IU&oT?n z;XKat3(NHE$^c!?Pq@a@G5 z60OSv9l#g8&lx?<8(qL1U4vJN&mo=6uT0YLY|_w-(uI7__G`!1EYbxW)9pOd#az?8 zyv+l=(>6WSnix zRPfeyt=Nm5179t;KP}8bjm>aT53s-w_y7wi*wXGng^>8vu^hUO6t1@&LthjoB*o+tjd;qpA z_-TU+*|#j&_FNaI^a>J&cm`c<0JzzMP1W4}6`=qHToeVm9e`F1w#VI1%DvoNR0Ym0 z+b2!iYmo!>C(vcFSg;^rt?=7Y@dVn9(}GRTe-RIpw%)qV3t=H?@N_}v?LEQ@2_XL9w4}qX`*bNu!lncG(gu5M?{TEk zQt@Eo13$6%PIhP_TbHK;^kU$rb$-trYAiKAtM&dA^PmpSI#&F%Q;+eQ2K4 zf$P?np0m^r{z-{F-`9@q6Rya7e!bijv*(lpt$yyWUKg-HMZEM6*L~~f4DZ3MVxIt{ zVK;m;Rt^2072KrqSfNWiIO)qCxX$k8H|qz94c7~Av!VX*+fKTrjz{fn1v=o^r44IR zQ1f7n?q4wlFfZ)2E!~N(??>T+EiVoJl|Fy6|;2WF+cEMs|Tlz^io^rajo-apY5Wa5$DSY z4&UPvFZT_h(kB1WQ_s=gdDnUm6^nJ~hrIPwYub!B_y^Bg3IE{Mj`)s`$!V{+4$km4 z`}#`$kMW;v?7A-8jBXT9;BJ;r6v$u&o$vRf9k@o1+>VXu(*6flfc&w4_Nx!^&RXXs8Jv0l*$m$jw)3dKGjO_(+((I4RRIxuhotmWeJiM3u=cHwF8IV4Ej^b$B_Pf zGFHivLvO}EPjXnv7;|P_jdK;#Mcml&W1EX3#-%)!Xl2Z7F_+b>)szlTl{;5ur6Von z(Nc%ym?D~LTvj>$xRyK(a?QISqx`+N=cPtHdPwS!c^gyh+QyYH_lbPkX4*HQqkcV| zb9L)oQ%g1VBs#_H*Dr_H>YRDTDJ=6sHf-Ga;`8z4A4g7JJ9hg}x92aqpMOLDm?8#> zPQIJyzo-I4&@##9!$gntbQ{UB_HKJmF$XiWu)YPEQm{jTJ_J$34oNKPk3llS4@8Gd zM9@43J5uin8f&!iMjQnL=@0iV97;nV8*`4uq*f&IAQ%5jlD{SMYtp_a$^L`UK?pwr zi8w5?)N)H6c*tQw$b9@UNHTvK^2q*-L~|`Q*9@^uH=_(s&g|&4ZpsX)$YD!9`y@^_ z<;2vfOhR`$(@iAdT+`0!7=_N!%^+2AJVY6UFGxQAuwqkAJN5L_KYrU#P>KpQb)!Qo zWs_1>-(#p?DxV=Mi(yj+jm)mk#Ctrp!vg@v_TBFC*tUa9C!5MCDT)ekv# z+f_HBehGE=SbRq;xWt1O)VHaHJxusTegjVT--;v-a$s>ER#Iao{yBEiV<qqsK8>ok=fIytK2o4RbNt=<~zWZ7QU?Pj;VTI@yP_7-Zi zNBuW%=7g@BZe8sLSLv7Q?SG(}f4Ne{5)fMiX;ny8*9b&ReH=SbJAM-o#**EUJbkh(g?*62BL|QB60eGCgkcu1C^-h^(RhMH9wDV?Na`WddWyu} z9@&_(O!yHKnP?*z-zdgQk};EJWTf^w$-OR0a54Uo^dlux_6bRT!a4VN);)&8%3HZI zC$OZIEOA21R@w3G;=~t zT3Hh(*ld+HZ^BJgd6OdGtduw>LQX`Pb1uyEqceSm%pxjtm9I+`&!t>R<^UHZEbCPTioVW zx4Y$SZ+-h);09N?!zFHUjeA_=CRe%3Wo~nw`&{ToSGv=sZgs7DUF>F8yW8b%cfI>v z@P=2s<0Wr-&3j(-rdPe|Wp8`k`(F6QSHAP5Z+-21U;O4*zx(BHfBpMk04wIJ2^1@- zt{Tv+j&rM<>8fH5JUIwQcpwd){>y_Cn&62HSdyhHa9L^EP@6gjrA##`PDXss65r&+ z5@s=kWqQ&DBQ?bo`S6CDH&L=i)P)YMO^k#pu|^w&St7*qOz# zE(V=$%IcKYRAnM(S;APZ=1`uzWbZ|pT1wvWJYy;3GtW}XYtEKHkNo4DkQvOPYqGDv zT0~PGQIw$+A)nd&XD-evkQBM|oNbq9EK0JHaNMLE8x3ekC-TvDER~_dx5gMQ8k2rD zA*Un#X*y0CkCnD`^Dyl~O>5HAfp!|GUCl{R>ygx@&fTdym}*$B8i%@mb+17wXb`T8 z*0t_q7IE!pUb`{bzGk-m13ziLpAFk~w$|XWL%nQ9W4qbgredrIIcsS{j@k*dHl?+# zYG89)-TZsD`-B~CaTnW)l2SU*z+xRlmo2nQCqtAwl3+l3%%`bS2x^O zrSrL4tnQ|6y0ZTFp6$c)z34da8qx!QvcW6w?u+a?-V?8QU;7eC^ri>3=C$?i)%UCQ(+)l2V;}S1)Bf$K&v?UgZ>`;z zZt{(+Jmp6(d?MSPa;iT*@;{I2-fw#L6%Ri2xh?%MRi9nS7v1tb*?i_d-}@{EKlR0b ztwd`*`{?dI4b{K?2)Cc}@0S+&JuVsaAwJ7FBmC38`ct`R<3C{WKY*LRdpp3HJD&nv zH~j;=QqzMy028IVzFTuZgM&b)+r9~mJ^@sp{iC%#pn@o%0^TsYtTQ$bUZk zR1POZi!a>37i5k-;DH_ZL5rw@Li~d&cmf^h1B;-79f*P|(32bx4zqbfsGCCroIyG~ zJpyDO3#1xG_yZ}(0V!z1+vr0m1Vd_Z5K5GSG~9vS(19ty1V7+`TC|8gcmhYf#34k$ z0Q|&GBt1=}zm>}yKPZVFG(P233FySip*TFoqmh zg@2fWLD&US{0CRi0aI{=DNqHo(1BARhA5bgebhK-%R!!rNF5MJDdSPUVhl%DyGK?Sh>@hGK*)-E5C~$>fq$@qtRRRg zSW8tn4Q8`LxkDSE6iT8jN`nN%q*M-5w1_F-fxke+KNw6Z&;g6A$g2b-8vMro59CT$ z>jc3Fg>ytpf%pWtPz5MxO0=AUO(+PD=!?GCHn}`TpsCA{xJ$hB!)FXc>_IAMOYPiF?(9zQ`eON$?*wVp3bIn-RM7u-v zB9S##a3xvx)7QWANd-*IR#e%RmA!;zQ)QLeI;7dngVLJ?l7Iyo`h?k^RXaxoTHlM= zE9BRr#aV>ZS#{-Es1?1Yby{OwS~sQBsV$SECDc>3yq-l>uGK=Jy}dgOTYp(u&>L8- zJzKNQ+O)-5uO-5{bX&32*oZ4z=i6Ef72LbcM7!NY{;=g+l<`}i1Kji@+>tHZnf=w` zyHLgDM!3a3xqaHa1xCpoGLyYr+|1k#++4)H)|dUP2a{u-?{zX_SGH6 zWjgY`-}S9u`>jy{Cg8-~-^j_?-;Lj|4Pg8o;NVSG1nyl0mcReyO$UZxmxWxVonZI% zT?=Mly)9tFeP9j7VDCL(4|X2$-Pj8@;0!+gVfiItZ`9uv28yv=nWW`b4(8$cm0<`< z-H<)r8|L2@{@WKW;TQ&D&z0aJPT;Ct;MtvF6OLdeR^JqUVkjn0tF_h?Ug9f`+A1zz zEe@0ZwY%%3-!TT@FvemhE@Kw{mqLpnM4RFU{^B+kV+WpNIOd5u9#r+#Xvj%ul%YO1bk ztG;Ti&T3!5X0GmPul{PV4r{R@;0Epy_-zsx?h+sY;70D`W`Ps{?i6V5=PrTgp6=g{ZWTxY6;J``&hF>V?iE-8 z?T+s0UI7>=@A8g;7=QsASa0>V0T@W{_l|G#F7NNI@9RbZ6EFc3Kmq730sh`@@2>Cq zHg5s{?iXMI7AOH0$ZiC0a0GvW18?x)_H75Ra29xh7RYcJkO3Fy@D9)L56^HBA8`^d z@eyYM6F+eTPjMD+{_z&C@Ze5x3b*hI5Af{1ZtlME>E7}C?(Xd7?-bZ?As=!gA95bo z@#(&C9LMqJ2J#|*awsqI6PR);ukt9rax6aqBCm2T?{Y8yaxf2bF&}d>FY_|b?-M|C zDmMYx7J>Y3b2k?O(!Ojuuk*U?&kJw><;ek#_sDb^&9_g=1%e(hXL|F zZySh#SYK~icklFu@A=MkR}XUi&TmjRfgmq|8)pGshwvBB^%_@!244XhM{r5E@DiZy z3y1Ix=kOW+;BXH2a2Mb93}5jVM{#ZscM*4i5{L0gZ}tXH0T!@t?_Tm#-*M~?@_6TN zcyDqnuXiO!0ebgwC7*6A|92_Z@-7E>g5U2c7ji8}0f9GjhPU#De|U(8coSIjG|%rh zhwY2Ucst*Cj`wWL25mj}bJPC#KreaMcI`r6^wS=J*KTw;XY}2M^hh`ENeAu*SAo-3 zc1;g;o1gIoZ*Jz+ZWHkI63B1qHg)gjcNK8;?~ZO^SMpakZ(48fT90*H*LC{-as1xz zdWUZBCU6+I@Cz^YWq*PCu5bvi@J?578h7*yZvhvm_6_%Ny4Q9P5AkpZcX8i)zVCJi zKX?9gM{s2qa1{XWQ)hA>Z}NEWdVjxi#=mhO=Wcyha(XXv{Ra3T4|p$!a(gd$gHL!W z-|~nLbA=y$(?5NRukwjs^Nh#%IDc~!;CR{Z^E*#%k|%kQPi;Ui`POdjL{IeDCiL2t zdD{+wMn8VqF7BF-aRgrh5x{O|uWlK4_E5ih05AH*7j;&j_rfoHW(RNTes1vpZmC!A z@~(PXPw!X1`uV=^%jfU?M*I{Ye^-xhV?Xv>UxBoL@B?T2X*YL(C?SwV2^K6~97LGV zg$o%DA2N(6(M5|E6f0uPs8J(}jUHQc{D|@5M}`?mRy3$mV2KeUSh7?p)1V52EBy0D2NUP%2TM$sy&Z7Wtudr)~;GloIn9KtXHK! z%c32tRIS*xW8cD!D;KWVxpwd3&8s)BiM}UHh!6odFk!)h2ZIO^0tDm6jvqsg40&;4 z#g;E)&a8QJh!K`Wd@dY9gv-Dq3YT`NdbQ`#q*=Qp(GvCu*)VSx%sud?!P~t_tXL^C zIE$YGQ?N9_b0E#CIC-z=iQH#Z7%O04hY=$N3>!9Lc=rw-yp8PUuS;ht)p&^%(Rp4s zuRX>K`Y>MLhi(ud@tHDX&V*k@_{s2sLk&4J!weHe zv>XRprxhC)%XbbIp2_g#34il^Oo@?n?Ld+Gu8r+d*M zDj$CM!H`gX3f-iThP`2^5<)LnB+-E~C@2Gi6kTLeMGsO~tF08)dEuxU;#8=JQW53h zuOtSA)vrOVXq8bpGFumo&elljh|Tg?7L7&T1ueGQ&gIu#N&W@?*OGrN*;kY2LP@2R zl&Q<^m5XhuC1{)#Rav ztdqo;M%=5P>#1;)dE_y=D5TkWY@G^Arifg7$d(N0rZ3$0@}@T7r(vGE9+ax9E-2Vg zs|+1D!_KqDY7(utB8~K}xDiwk&Md6(LUbxl|e83^|92wZ`S)rm6&W%I~6Mbv}B`Tqm6I%&nwfyQI2NR7N)e#ZE@2U zk(N@o2j0yt^xCE(J8@=+|!=+ z2&!ev+YZdM$bePmgN6HT>E;Ej6TnbxxuP5D0hHG+RYzAh_T7IsUF@cHb#wfbzz)ouMF&SX+2fOtN zv16!H!N8C+$V*{|JKJGmc*tWNM?s8a$gxrVSOy*Kfb%}n?A^;eB@>WfhXkGK<$h4* z5H;>Bdu@Cp&`?4WS;a9`cHC!1RFV=>6-<2`>R9`_Mm1$|jB8sP;QLgR6RB(sk=8n( z0JCzIM!wB~l$DBIV@ryNE0SZEpg3$#?AsBI^tK_M@oiRjc-Gd_? z$pNOfO&GIyr^IQvGxEg?Q zP9SgEoNYEIoTkYn21(73sQ8oqpQx1#YL~LfQm+}a*k$vf!Mfc~hUvuJ*+2y$IDr%) zW)!U&#{?@AR5qhYpa0r`1tYLQedy!7G5#w+WjrHAf~KGcL)dz&8mvT0(jf6AcAvC5 zn!)r~x*hh4kA2J{i3qAc{p5Iss|{YXImVf2v|{p@-ING%yha*_t2o?~4t1WElaom91Eg@I1$SOs$-nS8!($X|X$sA`dme zLo)fC%uvVKFTJDbD7O+=chkg=cGFxlr$MjL?L6awe72y#^6bHEyk4hM^`N2^_Tv%? zNv%Rnv`&X)CZ&EFp;Dc!uNAR<9qKF~xpqGjo5e+q#ORA^eoIJddu#bl659g@Vk@i{5fPG>m4}r41-@`@$b)xRC&h9a2v=V1~T{# zqZ3k~gFR2;o3aRCdzSHx_Y8YJYsjng`Mr}PHpBcBNj@D55&+@MVRc@StO>em{Mpav zf>g1K1^q_>cBR&t#q9ppmO!J=#aTZFASCw!0+9|`Nliy-Nl}{QmRg;+RL?$@5|{Ph zYW=3c1$!(>Q>LG;$?WO}>YTtl5Xf@ZQ=3w=IORJ61N)ncEcmw$^PbF(%^t@L(tJ1y zeErVI{`63c{0Z_r$5TPQy9q~svH=D2$o-IT<2xltB4$@h2ZLyPe+iM zhb07|4Af+?&vR^+%hlNY(4NoL9B7Re4c?fK@rYW)NUz~VwGFxj7B|`N#bI7o!ze2#~;bbVmwc z2gCi_#b^6=$c-a|OiG!+QLW!?q0Kn7M1 z&^(yMK^V_q92{NTg>~FSc$_}Pk?Pe^h5=OQ^ioyH&dWKJdbyk*EfiLy8nRp#4O$fb zjQL&-@{f=}OaH_Ok_e$Cc}oS=NU{}~2#~Z6Lz2BR9l#oAK*YEnMmWA zWLf%s4#9XEn*fY$gxPJ702-zMLCA@oRA7NAn#@R3ftdgZ$XU%m47>%0^Y9QInv4nr z&`vzX&8fi0Fv{fZjv7MBS?QPYC=;L^+ygp94NRWGeaAz{j19?5BML~(c$^0c4TNE2 zBvvAWj1L@%Ag6(kCw?L*GEMwpp47Z!%Q@63#+=u{pol<4Dsm0h&?3*31r-h7@6k`Q zm{t+uVi4xV^6la;`l1mYAu&Q7mO-J_Mb0UGMhEFuW*lQGiN;N#kSpm67NY*iPj#W$ zLDx1)7cc2XK?DYX@RCx+%=~>%B0AiE!ORNSRa&AB)W84$J|s%!T}l>|JtB*I=;5CE z4nU&Ea@>zIu@$5sBIPZL3@D@UrEFdRm2%Acc@b zu888OoLaq=*woaX{U8+9q@o?ZqVB29QV3sHY?V?_5k&o=K)i_mq(xYm4KDT|jIfRJ z4dn?upSRpiFP2MD9@zw4*%e})W=!Q0LM19SVF{^{6?UEYK_eDwrRH#DSAtGALYHvB z1nbn$S#HRIZA#=Rq#`O}{?$wu#Tiv4#Jl<5JG$CTYSDWcVB--UcK&pX>bQ?Hg;S=) zjPBIH1KNN>Hl|}{-bP?xB5n$TKw{`&W=39OJ)PWPodjrhrbve7MyMR@2^8L;+H2+> zY=#Jnx*{yT*x2Y?&YgvR;g{;{CQg=3kJ=c@;G&KQ=W)tKa`vLQC`qyvW3!pSz$968 z62?+erMJ7UUUSDMo z=*>V2U?iqm=A^a22z(C+YT}1>90@MggIEZPj>^lZsHCvy{$#l#O|GV^V%8yHg?cax za%jaLZjBGIgiQvJufmA`piOWFX%Fh6P;SdQYSL@T1(X;@NzoRRB4HFFBXw43m1JFL zaH)4vPM2mSn1ZQl;0t-$5}7hb=$NU>jbVK@+IF<5TSA~2s%mzyTgl|x;;ENeu?PVA zB@^AiKaR({jo3~QYT?Dlq3VtsC2E9jkE3qhM81s9SRBV$DrRaRVS#GKhAN4UPwL5$ zN08>qousO&Xk~H8YNDEn{7S0=pv3&%AZ(RnpYUi0qYx$l2#+6ylG^U15;ft3I6%6SLh7^S9 z=!SwR1P(1C%nZzYL>_&#Ey6O78D^6^%AvjTUx=NEo_-9!86ZGDiZ;Oy!SV#w7v+gHftw{>+9_;zS5mM0lRYY9gqXT*-mx9pRBEB8&xs*r253 z3Kl2}q9X2n2p_pFs-=$26$`E6V~Vv1@%WI~z(l32%x&CTECMU7p^VQ8D{NKJ&}Nd| zycYF2No+mq1x07ozEYG*ElfFKv_)CBYEb2DtJdyIntaZ?PD zmBY$RfeZ*k;0Nhp@I`7c<#MRzhF*n%;O1^@>6PfF^;3qt-}IPKN~W%4ImiE=Y@bX_ ztGy~qt{2DX&n)WNjnF18_AYx2Cq?yCU&N%lCXtkn5J>!sGX|Fa+m(jj}DsNuV?+WVi1X9oXY>@se@)B7Q`d}sBSIO-0Nt9sx5lU_M|<1~4A-Ed<8x zyDn^mHlijssvKOfbGoS#X3Of>UeXz>f>w-wJZ-&h~gX@Hi#vL&RrGyVK>307PsL8gVkJ5O|(0oh98Fv`MmS9=mI8Lm;4qwn1jc5_m&4ki!a)_phg~ zd(@+(Xi>=gc(Qv(gR(Xhz4&U=b{W#T9zO&;X|nS$s;g8a2KQAYYN(Yj$T(yJbkj5l zyTB6oI!D6th?2RO*U>GXd91V9=?D>jz6Sul`Rs|9RM2@L4YRS|1fK6Z@eK=5ED4Ag znORTApi9LNtIqInby5(kQNpzm{^X-;v(gbE#RsFkI9oUiMsyZ7`NfoWaykiV9V|^F zxN1(9mBxniln5Y&s=HsAV)rhYrNI=$`$M+#&)IGBKS z1pa$n+8*xUd%>9pqx|cSGwuyAJMY9e6fOGzkJBE9eL_m;Cc_hMuS%3tDnzu(f{b#N zlQ+3@ZrppYf@~s%E!I!J`-zsOQ8~;(aCdhXsDAoi78RO^^t({}`&tG3ue+$8`)+c; z5RTp%!!KaNpEbmzRgKje&{i|Y`#IC8R`fw}$5*lSIoo$$8ItuBmPO~u!+w}_M%aZf zJ!fIKwtP>av8u27oT%@Ggd^;o8JhW07%?1!DkOL`aD5PNAm6EcpgT7#!7v58Y9er6 z=9wNQ`@dc?<8r<7C=Wv`$|e8lk<)LsTYI)|4-F_eqk=n!wm@=wIYT%%xCgZ-{+1rc zdRm?Q$J3bE{sF`afddJyfB}Ob!h$MRsBoCVp^6j`C8k*7u3|)u3kQNDrxD~tkrhQk zEO|0T36&{Lv}~!egi8}8Cc>mSk>t&lG*_ZDIM-7w=pUdGm&yE5a?> zwrWR^a67oI;lU&nGj8k{a$(3eDVJbTStX0hmNjFZcv&-x7o$m!*8D;=YSF1#kB;%$ zMvWRWUdOQU;x+EtFAge%!MnG?*D#iVb4M0Kij?x8trA*pYb2S00DGCz!}Kt=06t{ zT+oFU7+i3MZpbOHz!n^2(83Hgyzs#VEo^YZ5JL=c(B@x+1>Qf|C~9BN3QjUu8* zg^OrpsG%2K#Bl|WVg!jKpioL_NEKE}Nu{JzB0)(cj~tRnk$PGRg(`&-Dk!0p+LFtv zoPx@ytGsM!Dyg(8YpkujG696M%!*4e!4P9>tq{VJi!Q(T+Ow{`_{1yDvk)unFv22( z3{l4KyN0Tp~G?&G|(Fg&jpY}1vw1S+zv$)kp&A;B$2awTO&<56<0h+#~6Qn z5y%=bDmY*mJ0j=D9A|{GCWxJcNhU{`thh3WdD^&yDm|tW%b}_?N-3sVGTF;ARYoc* ztgw2jDzf52GiEj6TuUuMB_k{`z;Z_GE{)wb$vv(DGJEB z6v#(i2Y$#Tja$NLNG>UM=}DY|w27&jVoCwyiQN}1;P-FL~&o6mwP z>YtbH3NCPA8qo5T7ZCW#E`BN6(U9gp!!Ru|i+P%1`1cs9A*uw0u}RjfhAGNO$}(1y z$k=Z38Bd|DZ6*2?+jiqD+{8y(q7qMU>Sls){TZ7 z0CMrEjwqeTcW=E$>b=XB-572awbzMC4c$@3;+e_GpVT(PYGmT0sk^fTEZ!3 zjA0to79+L9B#M=ju~^nB!vcX^szh(RjMo@d0weJxC3D;q9Yuv2vvmrEu4&nX^Xa?jYV}jzf#s-xOjcc?W@V2Hx;$f3*r6J^Wro*F!1d?De z@*_nG$)iA0k6|r>ks%p*NSl^0Ns)XB#v}=)lbJ6`=$py+Tml(U9u=uvc@vlPHy8-w za!z;JSKszO`f(WLq_v^Zvfg#io&r?xbyB?^O>8Qb9W6-}^xaD!Si8y(TM zntXwZuDW^Qd)8yBR3Ym(q_K`Txk0P)>`FH^^jL21F9cO#JGu}2K66+uu6v7B%(N+oHZOgw3m zA~8}W5>ez#M34fjA&DgzOX_?@`4kYOX=ZA|?^vChmbehcXI>rPS-7e|Tk?s(c3S0E za~45DO$|{HMyoK@Y8kfbOC>9St20-^7>?ytu%J5IYLu%@-Mj}q&YIkC;>IrZ;SwU2SW-#l?ws zD2!tyqi$(uMh&SEME>&%^M>l>LF5`2#B$8$3u@J`^V+%RMUYW{U+&oV_*Y zZ-9*fI=3r0AlBw@ON8O#iX5!Vo@d%g>~XLx3!c6Pw8>7skAG-T?kRukpjkwn>JUnx z4qZfcTke*Zeb+8EikWx%N^VHiyym+(+m6W_2n$jo5E?lTVJ+2>ot?{F>|t+6?aNYl z&8H-uPVyuV{v#43i8K@Tv5#Vnel-3@K3`8d+I=_M@67^pGX)1qzzMFUT!e<;tJc!f zFK=ou(+cQTGl@|Xe&f|LbK$q%i>+bf*pi%?f{&`LQzSN~g_E1M7qsVC?U5l2UC5ib zK^q3KB4>J55ER8C8zI(d$l;XjD{23VRNMwK5f!JnY6IDED4y1myTdtf|NZZwm2wSG zn_6_ImW<*eKUd&5j*+8)gz$nDvLJT0 zqrV6yv5x84&pCA@B57n@BgJ=wkBqNP6ul%a8I_b>0(4P>zuz>iT+^`Z@2O?ZK>F zmUT(~Fo9_fr=|%#!kg^cWGJlkv87O%!qW^4FjW&0T#_cd7Hl<%-I~k1sPl5$yNc5z zx46Neoi8YkJI1ks*R0^amJRLFu2$OVu<8js%%jI-BUsMkp6IUbD(e9)D_W+-armyE zOpBlJg9BBoJ5;Oi1O)MB=RoF-q8>y-S_`(gj9q%GcNpY9EabN^M9f?;g;1nzpw9C? zk5{C}Uk0M~Uc`B>N8us@rtXOKa-<tfK^~<2begvUUvr zz{8z>W$q>rv$i7wnS}wlO|TUyMtVYzdBm#;QKG_N0wtcO zV3-j7%5f$xW|KN;_=L~V0x0-csY}2DEsjt5Vh(3oE-q}YfS~WHI!)&k?9#?6z@}!^ zs)mfcWmFtZ*#0>%FgU?&ut5iRC&68UySoRs;O_43?(V@If;$9vNU#7QnP++b@9v)c zxcB*WpYG~Ued?U=BePRM&}`B;7krF#5!T^6!X8u1gR&5-PC6WvBCQ(Z9FdnRGRS z6IGo3lAg#bDx^b58?h>BBEVxzexAceq_%y^nB-)LFkz%)2g@fhvgW~9=e7@M*GnZ+^ZmU?ofmR8E+_6BUSQ7*&VmmAU8Bw z!-^}yQvznOqB{uzqt1-GE4l`>;+ePb6IaqjPtsjA;Ae6RWTw)4xctg+m=bo@_f8R% zY7z~&6EU+is8~WAbT@3PYL9dAGFZ3|LVI9kn-yKg-gcWy!U9{$m(RB#^9_U1U{pQ` zn6jhx(hDmuT+nixUMR&GG&-} zEfwx(jVVfXCDr+uRf3dNt#rv5?6CcnQtx;NwL?f#B#*ROgxYe~@z2o&2brrx7_`!f zh90D~ACVx@S{6DHl!_;&z#rKv_YHWPfGgm$G}(st?)CAjWfdy&3)-6&mr(?!2}6W0 zL%=KpXY3OVJs@y|mAE1q{h(D^wuyK8C23S7Ca;-8mINwc$P_i13N}GoGx?AK zZo480WG5@f`kj&R9bHp?G*XMgY|+Y0^g|juk{jftxvBz{yqBGVhvyYW*GjQTbyoKC zlzZib|FJgfIMdVW?WIYR2N%0D@!}J*gCJDv>BJ#ro|9LZO4NM+nvHMcOAfaLrTDDw zdkQTS|Jtgqz`;#xv^3vr5Q2_HA31xgbB70R(n(3fFMiZZELs%yMa{0z*zmYRpF`SICcbQwl5N{3r0LgUK{GlGUldJOC)1(q*U6j z^qH>oe55vr;J4KSqiL28_Iu;ttnN?+P$L?_6RMru)(o)Q(t4%7{D0Y2ij>e zH`ATnECBuI%Nd5~C71{{>=TWANnp)jdp{zqne_<4K>22DT z9g?8AD#H$3K6CdT+~-JNYWfyHWc`;3BCyILjK3n?9+}Ii$~|d@*AlJXo|S;@tB$3cwXGB zT_5?fK5LF53vHI&PV$YWn8vI4!6tu$(nUf&X<*XXX^THS=Ttp3+mE$~(e5j#? z|EmZ^2n(GESdLrGn#79~+R+tAmQC2s-hO$`zrz$c1!txPOCH2cl>lRD2!DTGMKN{w`5UTCgN#YL z6IG>^=DC9ATi|hQukEqZn z6zkaD^Ez*-LOz}r-_bNrTZTSg-5>~ZB@c&d;rY>Jl|IrN>R8`M?FiA=Rc-Ag=4~8j z{Nx?R77t4?}rSc>CogUd9=%63)JCe8!dvd*N zhc6NmQ&!DC3|pxhC(fKy>liT84o!6_3lkZOKyRh^b18(AOK5r3DGM!7*NP#E1@CAj z?j_i0J5Z~C$f@Vli4{|VrxPPQkd*mD^LNNs+e|SPYmSS+w?EG3w|1We-aQq^!)y; z1p@w4JPBX$Q84O{V=B(_CR+UQ@^S9GD&<+WgoD^8;>oyM0fj-2%V8QN5n*)kXFX$_ zBnNI*(n}_FoHeD*c;;se7&Uk17i}+=HWg=*TIm~cq@`~=N!Gue+s9C==xwqn!?Qzf zy~70^D&}XCzAkRg4zD^Sa63%*J_}3Q>$UvN5s@k!$owgpGST*8<5DWyUZ1zxr$dL9 zkPMxS38zbJ-6E3NnfRv{cnv)24P55^{_MS*h*S8gzqdWGd;V|ll8gk>J*03H^6H-g z5e{plHyw;70T%c`bL#hS+6q-1+_hL`+^ZC}SH#jX=NTcnbVo|@uP_B$=9P+kt7Ug- z7H4J5vm^<9e{TvFPfLPz-96QMXV z(7ylrEBvjtb$6HipSCmc%mackRxx5{C;xYA!rohZ^%)eTD5^h5^%La?(y18alv;H` zkfeQ7d}LfkgRUg0VLS#MQRd{5u(4Qt2D`q=kg>5uN|qEN2G_EwRH#fG=}-%8bOxjD zK$skE1#&u{Ow`6yDt&Z;fc0gYKwHIP39|$gW5}&~xm>6iKK<48bSjTg6}A%761Ij7 z>9@j1X(^RSq!rY=ei?R{z_&7Pvz!sXH6U`ky4;-+-`DTuFzZVa>jE8&L|IN^ICwQ< zfXU4_pnkBfadYBeF8eifbGNv8UU-oJW}mi;MLwr2t^6(NtCc3r(gD>{>Fez-`|a^L zaL4Tr9vkFJ)vx@HTO+AV+MhzDABg9|B?@7Az8+T_t@c0W`@fSpf{%a?j9(RU5VblJrn=v{m@(AS+3?8woFbIhSuSg83!9+U{{STi>FuGJ$k_566 zH?|bMn7gSoMSeSho@ugVh_-=?hlUobst1*-NON1NvZxYmYOH{%)N(A#fzGn}XDQlr zb=5n`bWN^d3pGXac%5_|+A2vc9V0_-GhOTMr(&tcdKGwsUyEl(`VWhmg$8ir?K&pm z#8xmJv#@+yZJD?sViHT_9<>*6P$t-`>|@m%}Pdg*Pa3CMJAN&hZrr+5;Z z(7>5{REwc}l%=xTZAyxs%rj3AY1er--R`oQtE{rdn>DYKv9^AI-ahkXZeqhM{$lk9 z8h}oAzY&K#$|MMl_nZ=)5h1HC3|sA8m;lGp9g=2OK878oBF|tJ&9vB-qQXNar;)%j zOmx&Ou(yGuezF&Ji+mk3c$=v9N@Sj}PnE6NX~1)FoJ=3gZJ9vPtJ>sqF13;o(d zNLxnYA^g{k)2L-hL71rA6rqUu^~|lab~f0No2T)Pdo+xjUh=O5wnxz{3EQdNXItLO z`>~1k%Lh7hXckF|W4Yd)RCQtaU9>o)&T^U<%sqp6$%7CS|EDMT5x@2^=dTXIKE{*2 z7ZaA(ziBJL6J)*ncmA!h!j)60tDZSC(9XZQR{zpZ|Jsh@3hK`_b$fC>aZ*g%eBWW~ z$#v{N`PlX%g=<*tn#D*)=AmT04)ahg6!h?XQ17>^Icfg0yLxr=LuB0$X7=50kTigHVCGtNzsLE{* zYB#?|DpGC|%%eAFvo$g}vrWe>vVAsZUMzrdn?+pz;8x5nI!G>5*?4zMxSyr z`;MhXW?5__SuToG{&pzpcv_mEk6@)~sbCMNpap8T!?F@Di&&>`mR=X0u`(8p_)Lter$4Ral!FIq7Mg`w%8%3W!d0+dj4oSDzRt5J zB!A8i&i?3T1zla?;v3l9EMBwW3O;T2+hUrh#P+BT=C$U-q)n&F27QzCjVZxvhq?<+ ztJWoVw2>ixxZX1-Y-*2*$(hC9*`h15fU6Z}KrV;IKBau`tKFWg!ryG&4K`5Kk4OMva=4P4|uRtrR6qFp6SO$rnU)T3p>|9cB28kn{#B z8UUQma!I+Jp(|^^6xxVWWb?Q)E<2Um@(4UL(VnA&xrY=wpXP7Q*}oCq6}GxzGSVdH z7#Y4!j|FD&6Q)1-J5-0^FrA4=%sw!s*_?72TfwrqYUai9l0O6Ms|T0!wYmX;)niq* zpY5mE`l~;|rzzy35^Z;)Fgf99R0lm$PoEyphoGWov@*6~4;r z>0#-GqMsz%j~E_W)r-Lwbxv0N`0myM@Xw8Lohu%i&eNklZwv=9R@eH7lR{HsXlIAv zy=csnF;vD!7u6?mHwK*2Le8hJ52{fOf-#<68m(tou(rA{?rKzEwz_^4+{yKM5m@|3 zgRo$6s^_kkj2a)6ZW$iSt6N+2Cv0_N@T!79_xF$SB4(xd@e%#bAHsQ>oC0V~ic))7==GCeMJ%h>2qo@C%r z)2i{Dxr(`G^e3%~NspAnnrM~?-ja!J>SBP?Off|?EOLYl+wbAuQ$kQVb(MXIUJ}35 zr%;r4>9ro~u-PnqxX)ZsL*Ap2elQ|gYw5#Yp(X>Ce|nM{0>)GUVg(JU{xQE(| zHdT45)wY6O=XcuYI4POBb)6*m5O2J%{mBg3W-7cuw^X%Ij>u2hw5p2cZo(68S7Kx$ zgzm3gawLcjGo7lezs#RFq+qLrqfQi7G#*2HE8;gRaL#T4PzTGrvl*bfA4YJ}L6 zL|8haYFQ>|nZ%?-q+w!Ti)4uQ#exefIa0@^vp9&ev`p!|eM4!@n5sS|zq@-+eoQe_ z87qdSuj)X4$8ctHvz&4do_+oH92&Fri2rLUOKPbsZmTs*rRDDG66}gqTZuWRea7 zX6dF%r>K*K%k|WtU1*25A_AE{%5ROma%wX{ex=ed*!X zE+~%}pUAAhKcjn=$zv zGi=-Ecs-N^b{xY?cA7ZBN$Ihn>;GI*Nr3>DqWG89k7&K z7fiC23XO-geDt!2p}qK6E~`>I0j|$5bmhw6kfIlQyi*q{ zLMSDJ9mP1bRW)aaI;G^IWJ`h++m@)B->gA^p_2~CO$iiyF5NjOT^1u+fRw$Mmw9ML ztE8Rt5S(d^yehdi>l0LRCRPx$KB;X_$f;+FdN7ou4|AIMmbY34fN&rTznE2QA!gou zo=4cgD1(D>HiHZ*32bq#A%km8D~tEcnH3%!902l)06+o&0L|147Pa2 zGkHeU{a=2g>i!QXI=>M~BoPpiaBy%aDIqK@tWXg>WThH_N*_S87huo_F!~0kHw@4m z0ccMG^xlOQrvb(@0FzOG`4GTj1YkK1FrS4tpNF%X1~|Sm2Cy3eSPud0h5!!3fG@)U z*I|Ii5WssF-g5%rF%58?1-LH&ycXenzrzJA!G)~AMX$lvAH%Iaz->MuAHHB-{DD9F z12}jFY&-zg?*VH+0V~&lJl(<4wyOvjGq8Tj{$>+a6Nl~whci2 z5}P(BAJo(2?*!xas~74`!1yWsMg;7TjtDsuqExqzZfxUv+uig-X-3|vVhTu~TY zK_DQ{50L8xD6)sEFh^*#MQaGatd7H~Nye{E0@ox%YEq%KX-xGQ>UVZn{%x?OYOQV?fV)WdO93iC!DIb9m|ew z3QkNi5A>2ZG$Ti~zr^SpTk7c>8k?9|Tidz1diZ_~2nr61jEap@>4yBkLb8^?!xXJ=>U*Z(i)=hx>K|I5|+#nr|C za(R7ub#rxfbA5gL^XIR3e*L<8kNfv{czEaT;s3t4f4KiYt^f1j|7G{|vElpgvYD5R z*_ZIem!O^Jq=VPGtGDsX*R@|Sdk@d2Pp_B1|NQ#>`tFjbhrfT` z-roNHh5diyzyJQ{?!W(#VSs+*$0f_6p;+CxcJeO9BLVHb1h z1jP^a<)9tnEjr!$LWK5Q*x(ur06;ezDsCaEoN8&y>&(XVdZa41< zfX+rk`p_Y3KF5n=Q|ul>rso6dZkN*q|HrI7>K>2F z)p~nt*`1RtfG(&RvUW^I7WN6e&DCClr>K$ zXQU1PnR?enP!kxK4k6RWvB#nF?Hm$vi~C^_TJY0gB_LzFV~OKPNlHuOe584wbC0)` z$*QPTyUNP9Fk8-O4gYOPQL!?0`z-HN?Urfrn;Gw2Trr$Z!$~V$Gfy_uLrYgNDqRat zMFDOsUs-`=y}%!)TV))INpfxy&v`Iv9wsmi#g*sgt;Ugsx@=YyTS{-)?v$PAyYN`d;FHRd(vc@hWc*CwI5(gE~-cUOyaI&0mM(*m*OzWJlT; zcfG(D8wVqizuY>sl0kB>>b?m{9)GZ6{S`5lpx}$qNluRt3_>Lr4j6r?bhv$nosnMt z>$v(^54RrFi-8*I%^pSDaLyh>WA^ReGpl@EGa)yQVu}n;v`M2 zhU*Mde%>)meTlUEzyD%4XPS~|={Ju9KW%Q#`;8A4WHTtKs;V!>Ne}U-mopKj;p*;{ z5LES_*jjgQt#(Nd4`5xgMaV-;r#r-@rVgRw;JlQS*tq?uifdn5W2gm zATW@-i*1gZyHOs2+|)aV{RbZbNc_cZ7M1LS!yu6De&1DO<8yFOl4L;rybtWq@V+dP zb@?XNcuBbn}p49OiWe_x!rN8Hy$yCX8G?WY@ z(^gZQNs`gjZ*LUot^!=Srq$>J?rQ0HS)zy$(NIkyb@c>sydn&i5cMJX#T03!)+|d~ zyD7TWqNcFU*%OwaMLm>mULw32EcQ?abaMj4>`OU^jV4Vbkl_`d9ha&QA)2i6lI*u5@qo7DDP|d-K;G#Z?TkePzo$|3vJ2&xNV zNAYeQbgFJL7o<~1y-F*@V9ANeH!*KyAP`~+p4haQvDl=_eD9?e|6yh;q1t&oX)BZj z-?L3358j!go3`4ymLCSS5qr9^A(4382u^Z6j zLe)#+B-mYCW?WF+rmVO$vxSsffa#OFapRDZx5`64)qI4rh^0zDV;J)TDs!Sgv$k8D zgs}J6W3px+A%)k(kH197(O6Om{T0?ziZxJ4bS_m*jJ|&2U{~p*?HaKTRISH$wsgX5 z_ONjGvXngLK%)7{InPZT)}k_WKwE99idAdQXx-@N`zd9-s8mE40=>2hooPH3K3K$! z(LSew+l!eVQ=HfCGq4!>zcdTlH$;wby#uTFB~W^yVovo>x#&oH2y)pO>Lx}k*>@Kw z0d#*4%x`l=RYNB|Sk5(GeUvc#-UX8GP`g||-4ehmC8VFyR1=RcGsv^Y3@*cBb$igX z2yYZ@3|#sWe*1j4!+Nw?BT6n3nK;B`@0?hKpt<|UsW@Z&+bd*^^4?4*^?&njJb9Wi z{>DQdf&5zo{&RYbaUoB=F#<>Q?v}I(*~$2*Z?n3m1JwiW=A+e)RKb4*lu<{R#NR zF@Gs*{=&a7J>bPCUu;4Dm^k>^ozMPbPdc6no0{exkh+Q2^FZD6T{+XNT$3||qeK!L z3)z8Wk;6sC^!I}nW2uODqyk5&DY6AE6*Pn0hWZ~{$4}VT=Hf}yj z{ZZpQEB<&~{unKmBwnzRHviZn6ATa~L~6+#XrcD185kxj)5aw?)vDe%5;>3_D3u9; z(+Xl<`dAPZlt=Rk(Z#-3THc}4#F5Vwe?uPsMN6_In5NhZ`4|TZ#GM`2UaW|PNrY(Q zDAGmI^0{#Z;p3U9na^>D9&4FnyF0y?@Ce$75h3V`(^>d(e)(2|DMYSyA1zr}O(`~h#eAU|D zkH9caClXj4_@bt2b1YPuLK#}c_{ln;{!S33L}MT&Dy;*eF%ek+ioW5LLfw>gJPk~H z2~gtEEIwy9tE4I+`gB|h)3mI#2Nv6-EZSF$Vj0l}yAnDyRt2}%cy;q@cN_;#@H&Qc zDg<|?(MHjZxQ9?5r11@z1tZdlCgX*t$61=0TZTCC5GnBy#k&sU6C+qC9EB?5@;DzT z>7>S2cIs{-XEKEG!qGb)MiGJdh@H&!a)$LZpe~nH3A(Zf+F1!$otDP@`mOCM3Ff3p zt$y~%{{J?jLI{$45#C=+0LWk%s{>@`OA+!g2s;&eQ{zuKb;A)Lccx*i4Gn~88u6wJ zq?wbphEi<6r$qi{o`%?kR0vN8Q)ER&7`J%{I)BV^4`NyR2$I#*vNXX4YH@XQ@J7d= zOJiA$rQW**+remKX;pD7l5mKM6(qV%yV`=`G|afwK`kq>nkBJ=(72!7jss<8^jV_( z2O(kyArY2{n){04Ziq%GO16h|3*Ov06QRg<79OTybZtDxWx6|6;{Vo^RmQ{iC!t?; z^^jz~nn+t26J-Tmd=5q_xj;@VR4Xyo0q(Se#Z`cqPg!C-0<`!!p<2LUOKTTz*K7vC zUy-gH+Qt_=Dd`N9!>fLi6Sn-BjA!d^u8-2#x)g5*5$PEawh3m13ENJTlxGbnRhf_)z29Q39W(!^r=xx`v265hm}xo@jI8< z5P4aB3nxWKvHsmc&adZhZV{Q2Ex=frT`JA$k5?wn=sz@;)NLkc_n4eW7uA?b!v3T# zX(A=`n4zyqpCHAPhxA1{!oq#A)lfa`-MWPiq1Y?AhJI98(I&I8vKUNK*Em)i z2xJU6GVDWb|K{5sei44<-7Z&@b?Svs*`hMxC6(OjK8s43%iLRk;jIh#fIW$_(M~@-nXKf^Ue@hU2xxO@hsU}_`(hdzA!+y ziP|cxmEW|K|7C<-yJwbJ)~d;VzCACdAn7_~R0%B2x||%S9%|Rg%>qg#hA~BaJ4t*@ zA?IUvrFj;JL9>zLvrAtC@)rSDlV#j;vjLno4~Rp%)1)wH0CEar=yq9=T5<@oEoVAK zR;xgU7ISeb+Yoi5wsyp@k1%Rd}}F z;8WOs2RQ*8Ri?~_k;jML#snp* zSu^59TNNk0oznS~gtQ10Oj;N1<26e&%!_$^T*AZ@+9Yh+!iI@ppBE-}&n;w`B$_7L zxZ8^R2*0VtlKix9_=Pr=B0Qy~pY;U(R&%EoN<<3L?Z{aEwtDxC&dc@JvjA9*6?mk2 z0fAiiL>=C{9-1{?o+P%R2TZsOIU?9Lgp%xPvLsjdrG}|@;m*98p{$z1x<`|>gw&LrgJSx*U_dG zPR9jIhbEEk^HGjv(6#7%%mU`sAPCGKLaGlkKvx`Q>I032P+Xaf<>Fd~^!@AZn~kE& z-|8#UYc+=B5$2r$OY-nD@qFs-$H@8eRh8%fJShqu*dc-q5Y)7t+Us$LIS-Rer3o*m z3MXq^O=kYBP09n84h!Bb2CA<6`RJ=IiWv`6shx!TpFFWB_IvOk*0&f$7wgUh;RU>e zTj6xixFAFX=u4vC3%vyklpYCuMW9ri5Y(dt*|7-W6Kce2xNB6(noJA*?ui~J)@;)n zDdA7WG6!`oV0H{5+ALrW?xPK0p%1CV7&&i5k)hu#Y$TDPJ2u4_?t=!JFt3X+W7x6n z7cgU*5FG#;QcLn3gP5iLI7Har_jcx-RJ5tEMWd6x-wa|p?Z@imA=(6ibSW1MnG2bq z)qJHPG)xK<8>n!+V^}cUY|72H#M{Q@#e|)O9F?j)A zEMSUZ3DG4SPJ3Zy(YS^Dz0@gXs4#HRds)u9zAHC#smA{0u!~u+VL>w)X!bc3`1*Wgzc5pau1B z)%t@-k3iYGBmIS#iI=lAd=oZ3lNMoL8R~U?@WPL;C6q zfR3Ul8av+c%-B|LmZFJ*R zn|57>;^na>mDY6kXLR*Pi1xamZCgv%@eFUflM3!R!vCbll*x~L!9P_Q`}~$CZznZ- zB~J*2NDU;{aU#ZCfT0N1XnADcIGN`KAr|kZ7IxFP3)0p#Gz@SEwH{n{M}mgtb)Rw zY3zOP2DilTosUAtiZLAU-Jga+mlm#6aMr&JrOIH)N%PwBBOW0JDHh;^uZOIPxDdgv?2e zlDtt-@CWPO{TnNI29|ij@Ckv{iS!}~Q#j~^JK@d9!sdf@o+^x6|4Q$rrlY@jJ(vfL-RJXiYfQR*cBR2s0gpan ztzL)DmQk?1)a?$V>yc5m5Mg6_zfbjFM0D?Iydez`g|wf}blR9I(T5BiUDq^dO0jHk z$}6YUoJxTx%;oSn+GepxqEI?t@9A}mPRh^F9_DlheIQi zfXC((_MTRq$;J&P&yT{sTq^$%yhr*c2{PMnKB2se>_sIr4d!b!cy+&8EW{nUCH?FE zc$%p4OkNiC0rvOnUnF)>a^L;pK{8k?L=?f1-x&!+);1JLPI^5QNn!U=EP}yz{7W1? z5YP;Q7pa3o#tKHJ8pG>0PnLQ*e<+Tkp0}lsdh$gMK_+n|4HEVU+;;ACQN0Fe{!A+43a95GhP0*yufqNu5mB8-&GDu`=a`Z?7 zZi6sWWr`C;dS$_F0i;O5vss9&2pnzOf&ilUV=RxK=|nuQ!<~2$>j2aiBeqXAEZ?N; zP=nD^Rvx+%u530^lFrU4m&~FlKT7B^xqlev;ouV;o8>Dgfo(6N#UvENyj+mFrn=)jXWB3iKf~NK+f@_C*fVBV%e=DX$|x6^xltF_f^;c=8@;r- zV>`V;>r4Bxg`0TCrb+8u2d&dK1|O{kCTrKh!uDmv1Fn^QTl{$W${h#yS;oB!5}wL2^+86(t&=pNbgf zx>fGTf1-U@x9I+pIAfGyygeW9inz=s?rN@@$Iq8IWb-NJO|9jC5cdT!&cZM?WXM*n z5Asy=fSLlG5BqimJDG8cB&U$f(j4FNqNy_3Utw!9510m7q~{6;lx%~Hk3`&r@Aaz%aIK1vGUz~aCR4kpem)_!SMrEsqZ8h(QjMTeJyqJM%D&d#AHICrJ@`@drlE?8a{2*q`N@r!Ziy`Ji0?;irar4 zgvf}S&A%?NJjCEpy{#@`@;ptt03|yUMG{(p&~H{Bk=E-+-g?5ks`hB@R0o|$z-2h- z#ws+}^kOJ)E0s}UI-@yj?x8QA+HsPT!Zh{0S~>5m~C9N5%7HxQPmb$@J1DkseIXD?$OxY zP-cm?;A=Ce@B|Vir{*>xPQ$Jtrl$l9+kBi|3pokV&ag z=}}~Z^l-AN1+tYYlcup5=k&OxZlN5p%8oVawQEysEy!*ez1zFLw94-kk!+;_jH|Z~ zZ8RV;afQpRz`r9rh^kOA1k?p`J_M?6-}6M`mLUvA8WW!Ro39=OR zMW~#QJe!y@x=yVcr2au_)T%+TmfJE%+)H<<9mk`hbeU~+2-7rzAcMOG7xT~PjAxN~ zRv*(Tq2Eb3Zxb~(ylE5|Cj_KFNkFs+@6?v3J!hxK1!*?JBWXLEyLAahUwIglpUm#} zf|t_acR>NyD10k$CM?*c)l#oY5vl$4IdC86XX~UZ{%bm1|92`%@e`q;$bs5otTA|r zE6YYyvlTYiW}7}_++ny6(xss;ab`rNO$^YwG88u=OLlcNBHwYYsv%QMuJLB{Ms5o> zd|e00oslhOF%%imY^*@@!wlkPK2?Rw)fA{Mj73nhO0DdUC>CqAxFyPJPfTylP79$P zM^{QBos_Y1HBtY}%ci9OrIAIh>aSFBQkxpiX@^B0^9c1}!b9W=S=rYK7~Ufk3J zJ2S@RHLSi7im%m}5{ic@ED#hi+3aZDHM2qj`td?VD!*S=NAaCD*2#{^i*e3;RB!L| z)Ql9(YHrz#4=F9e4~%It3DPxko0Gmf)S10~9o^~KiAaYZHjl^4_=j1}ZH+E}xYO`o z%tl=-L6)%4V`n`7nxvR-wbErxm_ z_{v*Nh*EL9y3b#Kyk*@mKS;yCg>QWfByTeJG-EQSTeSA8UU4eXvy^G z6*30E{`Hlz4+Gb~no!R1jnJSYPP?CmD*?J9(e`put2HbTzrh|YNe(yJ{YC}mE~eZC zC4XrAwa%2_RGrEyzr({hQSk3hTxRC}XQTN~vxkJJGu2``q~(NJhLf@sldA=el4y`i zQ1o=+0|h%%$7XH8ayRR8H;GMd!$l%iFt~)Nr|1oi8u%fJx^B=+@Ij}CoH9fZ3{SbA zI=e_pErv58n2L5Fm|vVSom0jPNo6-pYCRHb`^rrw8o53dyqe9;ry6NkLkp=Z_mr(S zF{@V?5fWga(+$Q87KI^5n<5$8gepYiv9a@Ti-vL|k8sNZwV4`NO^_{$@jbf`V@=Xo zy+@{6)2D$b`pxNC3&PoyK&cnu+k1(^D*8%jzaQ18KMtkc2ruV8DyMU!raGmxLBFFt zWw0xBTR-y;BcGy073w7$pcMK(9``36h^1o3agCegCpzxsJ8^?(g}wjxiNetMF+(wu zHb3dtja`AW$ztMfshjnU6O!`tk;H zM3hT#5V>3a1JfX`d|)c+21<(3+kd0kD(z+nK{cgDierN9!*#a|qNSApegh1r!|4c*oK7nN?qqxPaE(@jKt&3C{Ab))0l7&ly()u*Zi$zeoW<{ z0t&!jR}<;#(hhaOctfPNZMk*wobjcyb;%s~&0yxuMC#Czw_i1t)roKpEjg(zc*VJ% zk1eptoPr~2;U#KP8*1U0!TO<=u2(F~A{2a zu(&WwqUHPNiLG8w)b)s|Zsk!g%C;^BbH5I)%0(VD=R+KX1Oy@%Nn|&Mf&uw$>7;b* zK`P&_>NDR9oMqGax)42efZyyZ>~P3U7N%l;g(Or}BqWWDw~pv?;aB#JRLx3cpR-=Y z&|B2<`jd<{2m`CLc%^4M9Jf0(foiROaxw@@cBTrkv^8> zaU=KoSIsSZt>@nrd3?q%7MOXx!Fjnd2(KT=UxML@!5E{1xMEyyZr_yQxk+kCV=TUt z1P!TgF%!FM*gDLCY1&kmzW-B9g>jSdK^81o7NB8k;=v2ZN_cGNy&IgNve;1^{6M*j zsW0_W72NptIMeD3+O9n7?(xwC?R~c;^2Oc+OI#meQ>wPL+T8n#McvDCR6@757svilFQPO-0!w75{LT%)D zcx^%*?EC#O)B^qG*vodQFgEOTd77~@!}HnTLW&f_Hrz@>da7o;fRMgCz5(tgwJ`MH zi;ZLTEU0VgWg6x<>J%Ctdx-fd`{17R(pIp%D1T8t{Xm4qJGl9C-*W{rqA|fnlARcX5VCl^{JjeF27=eQx08OJ75p@hhj&+H}b} zSdwcaM1yN)6GM$lG&BHzBlB^cgH^4y&5+`0F;Xp4K5QwhzcI4Ev3GQaX|77xYLC^h zDM=g>)x5{?v05iAKD~L?$WNCaQ6#s9;lUFA5np6p!x*xp{@ky-*e1~1+=GrHRNI^K zxx@GsW2G=(>5rp8`$sO6S2#d{2A&+%ep*gdx@C4NKa{Dq#cqGOO@R6(n5jerg+RYS zF3Dt^vjZg=z`+$|uw8x#<`AU8c1jc*5vx-u=Mcb_oYViWb#hL(?qAu#7bl^Sep88P z6?URfNmT=K(BTA&+0h>@R#I(R-t@VCWCEV`D%j)B0<5Zp#!x-%`dZn8*QEe zLrA&dwiJ+;{fP57eJ~;+wMS!wp-yCq0;+t`0Z*rU?uNU>p8w*J@afSwdvVx>xj&O) zQo9k?zouI^TS-sbOh*eD-fYSqb-w)LG#BDR-)6;mEJP<64J!e4E3qgGOVRw*a;eK* zVXlGnTs%4&DXRIZkD^?Eh$+2WXtuikF94uGU%v;AvE}Gx0R}Rm(h#;{E3wUBdPHWr z+F57>PiThb+q@DFsb(e7Kp?O|M>T4`;Go3euno3JeemX^}QC<7+SkD=9z*+0IZIiOCF*`M2`@MVEDM z^UX}0qVAj?KbIMf(KNEUp~qFG8>|K8p)O^sb74wt=PFi$ZhAytz2u$0y~_%b%pU0wF!9Q2^e)( z@4BC-$X9L4wl5BCAqB%SZf(;hLp3<^g%1AM)D}ZB97EdmHgVfF+{QiK)@Uj9Xj055 z-_~+HUS7%&7zt~zd<&`OD@@KP%##`!GiBuO%gi>f4LFb4-O$YRo#bI`u|7?LCR4yH zIgthD51?M<{+(Yx2jEqP>hf0fMR(y0j3W}^VAQl3EfOnpd@`sh4yxvF0gpMddZOTz zk(iS?{K%TI-ZHUyM+q5|S54as_p1koaLR$}8}e(qdkI61dd&CFBrv-s=A?w?Wu?Itp#(@sCw^N=Fbkaa$ZfxhL2 z**LfT+n4Ul>>-DnLcy5`S7(Q)*&HFPb}oT1y2 z5D}4kY?2xL;HDkUphqg_;M6Ds`kOdo^rRt%-A|s=#1Mi&1Syf!GYx;F?Ta9)1 ztCC52e#Po~R04<}K!5}(Xt3bGgb8cZu;K9GLmd()Qmi;JM-CkrHDb)z@gvBPB0GX9 z`320$lqkQjZ0Yjl7cX97c3~-#OBb0kb9&*qvkR9jK!I)n%H=3dq)NGL*}}AG&@x%3 zYRRJIs+KKTtxoO!nuQG5GG)MOA!Fu@nY3rnu04b1tr|3J-lj=Iw=UkiY1ZULqecy0 zG-&|8g^R|m;JJszGOkkQZJ8=q%%F)}eQyEke=e& zwUjAQrbv+zr8e#;QJ^G&Vp}(q;KGLwZ_ z&Rq$3@JYlc8DHK=k@N+9{P4m42mJW%+sCi}g9niMJ!5Jo6a5CjP!#1I*3m|=QEq*sIy=n+9gh$4Cz;)o!YxMGPU8Zjb^ERuKx zjWm{c1bY4-q9=rULA2L{5B>GG1Cd4UAY>0bAPL_<2Ni@Nh8vDJC6!fLsUe024aAUx zU3STkLQYnwkV0HS6p=+0d6W@FAGJ9WoN<;kC!H|a=~7KOy>t^7I{Dc}PJj-T6i!AN zwUkpwHI*n-S#hydRaQlcl~+}fF&0=`fMteRX{qJu8H3ezm|&yor59jp0G1bEf5pX@ zU49i7mtB8BwpJNfl%Yl&Vo9b38(3sE>}bLgo0({uskSU?QBd(3w71zdt!}^7wuElk zLa`fh-3rG96woCnZgtR6XI*vYE}=wrOnCQhcj3vaM0xbmn?#8px;LMF?Y&n6dk6k# zAO4a@?!d!+5fbQNk_vlCAc6x%=q1GyGD*;rQ4Vn-hdk;CBFG<#OrnY*;us@}M4XJW z$~e||;}I#6=;9DPx>vA~M>^Dl4M+B;%d0`M(4q+wIR~}8o#zItB;SWDMDDi}3 z9z^DrKn!@M4QYD4(M1|@G}72{jzlNgb>3-bPcZew6QFMkDz~749=a4$h(dJ~R(<;| z=~Y~H6&6^VdV1EUi0M@-t9q$A*cxlFA?m8Cw#urjbP2}STW+zD7O;iA#l{)OVph88 zrZc&{D_y-FaF{$mhD z1mOb^`yL3idkP*1XEFc|&}20_k&B8jr6SbKX*c6p&UhxIo%QTU@xfXUj0$@+Z3q3U7oW z)ZLu2D5xxP3xNBZSEf?9v>0wJiCc^4PIaok;H6c6v0UWB7`e-F@r!_I!{lOx7_^kZ zEn-nzWh|4rIc}yitYaN(pryyzNo!hC*jDXyr@JPEi+4;g!nuM6yhQT;E(z|^PVwS( zJa#RwUgRkc5FtX>Kl`MRe9#~yeGhy&s~``;w*wnMsDh{L5|Mi5%Jxw#Oa_sk z^u%O8j}hcU_Y)b)S~Ro%3DAHxBH$4Ua-#y;C_N#v87WDbvs5;$J{UU)$27K~rFrm! zAS_6LxRj*wO-(>6T%ieF_(B+pjZHOd=MCejHXhP5h(WALOYn&&y8Yx(cS8!G3U#Qa zWTlBqd}81%6{#|m<#3%kOItKoD#pPIRjZ<0MO_s}HEfile0kg#_mV1FsR1#DK?`N( zat1lhF*9{kma>-RtkkduHF|vAYi=hkKx#{n-6A9ue#eCI1n>S_LVculw)05i!HbgH zq2%(!6P|jN=Lq)OBqzOxB=@avlsGFAL{=HrQ#wSfMv`SL!RoVVicdoDq24v+mqDjF zEn_^IUi63-y}bg{nZkTgl~87*mmQ%7MTprEo(D4;!RVQq)GE(hnO5{Y$UhW%S_bE; zO$~LkN=?(!2nDvE2HD_*VA9$-%VZ`OvQvgLoS{VGDcc;LM2Gc+i9YY-r=IAfZbkI1 z5%I>Tf|9{0fzwJ=B1INW6>d{*v0@fEcbAan1y&cuix@R3#*cE8j2zv|Ue?eCV2Ko@ zhl$HtKIbczUgj~wB8?qKbI19T##wrl&1_)zo7w>fIR3cFG!KK0Vy5iGafu7t)&I4I!l~09iY{f5G-wj z%!*=&Jcvn`6;nZMAiW`6Erihng7ktcTh~J zuz`m`jJ{Q(c$5fZ(k(N%F%WjPgCOMbKm>9<5jX5h|2b`HTS!{2!H`XM_6R&>d&3-} z?Y4eyiA-W5x8C~pw?#}8qMpJOEhyS5$jw4itkT>mIu|Ww5lms~!bMSOy3^o|9IGPd zhBkb3yJOTY8^Snh@P_xht{RN15W^T>5sSU>{*`ZOa!udWpe8o=g&pkr$lqc6RCh~A z0wb{_Jm|2CsgP{&cc2R4sLpHJ_PQ{Jlb{}(b&`}1p{$5wS=MRFIK^Q-6N^iX0~ODh zYeae&3P%VZgap9`H`s6x4m74Q`Jf;}&R>VBRAdFVh=5c+*iUk+3C`SM7UU_{sRIP$z@*?o>VmmSXK$Do-hHl&4#k5b692D=2yws@2U*>i6_S z=r8v8sCv~Ch`)rEL4bcq;3SLDjFt)Im#wJb0DST>Q>3p6a+%AL#e9R>gISGftmB^j z_?SY=AE{AHKyS{P)(S*oI)9Dj9C_14Tn-YL$K19uw=i=}bMU zDo!LWbEk+!lV;H_*ag<6rP``Yj@E6R0h(IXdEM2eS^{nzuvi!3ltI$HY$zy@vb(Qp0)hkxB&vFT1yDN^wW-cotT3r3rSQ5y|fSmRlhCK<%O z{Kt?S%!!2?`bbtPZJ)V0L`6hI5uTfhN!BV2p_25+4(7*}ycPGnM}6#z>^%uzd5i*S zNWcY7I=*30++j^rK=qQ`pl$LE#R@s-xa5Jb~xP=<6?%sd~I)Kxx?jkStqA&g;Fb1PA4kIxZ zqcI*MGA5%kE+aEGqy95KBQ!>%G)^NmR--juBQ|EEHf|#~cB40bBRGbmIF2JZmZLeI zBRZy|I<6x-wxc_~BRs~VJkBFM)}uY%BR=M%KJFtw_M<=kBR~eEKn^597NkKQBtj;n zLM|jjHl#y7Bt%A}L{20{R-{EMWg_5ZUM6EA%)>tTLRns7FZ4q{_<|=M0x&ElV>aes-a=zWCSvww zNh-oS^n+YdrZM`0VfI5i@MR?)0zCA?K7ghsB0^`TW@jG4BXXu{cIG>1=13;OW%dI; z+=6TpqapOdJ{ab0Ug9knW-xRjYQE-bwx)3!W^Cr>N7}+@!scKyXE54AZ62m2isn49 zB_|fAFC2n*DyCtwrXaYcB7El|v_n5Er*v*)B0Q&WX6AYZBO(BUVa8=-Hs(77!+kO) zd`2R7Mxtwqr)!!fda7r9UZiEJW`7pEP1}Jj&1A(R|gCb~k z+U0`&c4#m{sDvgbg-W7@W~hJ~=7t)mh(aW7D(H*yq9T|kBpw1H_NEgC{Q{N^UQW|LZCijHS^8fhdJsFONmdoF2}c4;gY zreOj@kX|B{66cTtXqIBBhHfc`im5^-XljP3oW5crG(%^)gCb;Nnr`QsUTB*RD4e?J zoem_OzUQIhq9M4ZZJuZ){^=%ODTcb~kuEAh#%OBBgNsnTaZ zxPz&hYHhBnJCy0F`od`5!>Vehr}87HmZ+{K=Q|+6t#V?XPAHm=Dkj>(t{!V@Lc{*A z?xScTtFzYWvTkCd4(B79r+N0MwR&fC3W6=*gSX;?VeZ4X;zMuRrni>sxPq&1dMmX? z>pdpIv&JiCx~sH8qMkl$mBOoa3Ti*B=$k?!m(uG#lBv8NtDOq$B;KpD=4+_BslQ$- z!s6p@8mBMZg2i4e#%8R>V(h^ptStnoFEoS5j%+j3raO@A$X2N$G;F1!s;>fUoJOp~ z60Bjm!?w!oDjvc;(CW>y>AZ5HvG#+lI_x8&>X`;C&f+7@_5(2VY|@${gtjXsN~$IX zEu>azFc@Yb6zbE?tZE8o*P>z}yz0-2YT0Tcg!X5pLW5mOBGQI!Jua=8!v1Y32CX|_ zBGvjSu@^&BF0C_oF6&kzst&E$b}S?YEijmFmXhh> zu5RqMN)Z7^)D^?q)s#;W)F z0($mCFnsT-_UG~1W#)!&A*^hwqA0lD?e@ZB@b*J9#IO6ZC?u9^!S*MrB4#3tuP-ES zY`P{}mMSm=!*fcl{j%fW27~h2uWL%J{>m$S2JJogsv%79VV-aD{&MSU((VGYV=wdq z@mg=GGO2(5s0y#}jz%Y{o@g+XD?D`PE%fGOA_6=huRHXD;fAmezvBa^VyWJ&A#5um z^gN4v=d(WVGe7sUKmRj82ed#BG(i`%K_4_iC$vH@G($JELq9Y`N3=vwG(}gm zMPD>VXS7CdG)H%|M}IU(hqOqKG)b4VNuM-Ir?g71G)uR%OTRQs$Fxk(G)>pEP2V(5 z=d@1mG*9=mPyaMf2enWSHBlF}Q6Du@C$&;9HB&dWQ$ICSN3~Q>HC0!&RbMq$XSG&u zHCK1FSAR8FhqYLbHCdOnS)Vmpr?pzIHCwl}TfhD_T*tLs&oy1wwO!veUgx!5?=@fd zwO{`=Un;JwqYMOVkfp@FE(R0wqrjwWJk7SPc~&&wq;*7W@ol$Z#HLlwr77f zXot3Fk2YzSwrQU>YNxhpuQqG9wrjsOY{#~2&o*t>wr$@wZs)dc?>2Auwr~G7a0j<= z4>xfaw{aggawoTPFE?{Hw{t%?bVs*zPd9Z}w{>4Pc4xPCZ#Q>$w|9Rxc!#%mk2iUj zw|Sp8dZ)K~uQz+Qw|l=ge8;zZ&o_P7w|(C?e&@G-?>B$tjlm$-?aIEr)l zfyaY9sB1vygFGO3iqANW*SL+}IF9GIj_){+_qdP$_=jhMJmiBv?}I!5Ig%&2k}o-v zH@TBPIh04ah0B8m+cQ1LxRhtPmTx(ice$5;IhdPxHqb*pA9BYUu$ySlGCyYo1@qjS5*yS&ePiK{cc-#fnN zdxhJ(zW2Mo>pQ>yyTA|px(7VLA3VZayTK@;^Jj=VhgI7Z=T!I6rJSBKSFo?X* z|NMrNJcQ?h11x~iAN>MQ!Y?#9(IfrQD}96iLM1r8(KkRY06o@ceS{0WgY!ZI7(FF$ z0w`p{*C+inEV$Q$z1WlfJ=mYUf;R&t7`+2%0w`=k(Jw#)EWOt6{oZqZgU9^>h(a|e z_%GajEG#(S3qIi+{(^IY(PsiQC^$4+g3)UN-(Nn~`~8Cd0s|}nCp360R6gN%{^v7z z=r4ffCwMi)eI-x>gZ~29W4`Q*yykDdCM-jP_kz)5g6-ozgX{hR@c!F-f-X4t*EhiI zCqKv6{)FR#(U-o2JHO{scrkQ7B`81kTRiheI5Yr0FHCs%8~yiBxF#4qC}cnSJN))H zI5h-AEC7D$KY07Uzvx4FH7r9eP=3-sL;CkW!mmF-SQBW?(gK4E8i=YkkfFeW2NN!A zIPlZK1q?PVo4EdwV@Ho4L537Ll4MDfCsC$Uxsqi|moH()lsS`TO^^L>=G3{9XHTC$ zfd&;i^ry;)1{q-b)$!;>r5!z4Tu@1uO{-V2X4SftYgeyd!G^s`lx$hEXVLakiA&Ze zObrY+=*5w(Tet}4Zsa8^lqLsAV~G_!m~dgkhY=@MyftlO$B&7+Y?jGjC6JRVgRCZs z0YZ(7L5CJSnsjN?rx`+4y;}9lYLpD}(hPfnY>=A_ibB1ccW>Xnf&XSboOoH7q6`KG ziF|?bkGu?K3O=2Bb?eu$t1P~qd(V>+C&n@eiXr%h;unw~XrAFOgO;+#mp`9={m|X< zcP|+Yl>R050zpYmApZQ@D8S|h!iADx^oq{D2O*45!U*5p)YhVC%~jW3d5!7TUw7(N*kOq+wjp4V z{#DD^WtnaE(PV*jR@!N)Z4ugEtIby1ZLhobR&K!!S6tG(wRPNc(M>n3aw}EW-FM-Y ziCs$Lt=HarMVfa{eEIE{Uw!q=#@~SnMmHOPu@t!Ag&D5)V1#Fkr{ReyHZ~rJXOySn zjXBO$9*kwgr{j@Hb`&3wWmLH2m05Q2VU#V@xaFB?e(+(|qM2?Qv26B1`a*h~uG(tB=#g4Rp|9@RYnzVN+CquHF5B#uE*3lDv)OKY zq_ow}*zLLLW+?2qWu#~6y7}%po2>EHb04nzE}Ut3q7IzWeB{~N@W)xsMxLMk75^0< zdE&{&amYC*So3(~Il1!DNiW^>(@{@d_0?H#-SyXDk6rfJX|LV(+i}lb_uYB#-S^*t z4_^4;i7(#x#@&X`|Y{!-uv&t4`2N8$uHmh^U+UV z{q@;z-~IRDk6-@z>961Z`|;0T|NZ&z-~ays7(f9Ikbng=-~kbsKm{(4fem!v12J~F z%x$i76~x!)LMJ`OQP6@N^xWi{H#iTDuw#f*p5929!j1h6d4yBp3mJB|;E@f6HEbB% zW@tkl-cWch+~E)TB}3g&4Twb?7~puPG$SsNUr_6v51AN6bqTR{I+On572`#@+(8kG zT?7{uXU9P=j?rPd6B!xN7%tJ>j*Dq@BeTE=I~u-`j?Thi?Zj9|J?`pdw#(xl0V%6K z)-I5R99HfOnaEusQjv|66(b!P$!FnCl9j|0BrTcADPdBRopcc=JsC;~fl`#EtPd$o znab>-QkAWw4l7+5OW(j!mbE+$Ek#lcSTzJwI{Hy8cFB@nq{)`9#AQRG;fY{c0~emq zizXNn4NYhw6Q*j@6=;F8PW`rQo|T6jRhxKY79^}UP7Y+(FG<3QcqK50v9GNBuW|53kG2VoB6zFRX1vhB?aRW zoZu=pH6aU2Y_l3%{f{+z@rhzUBNxlqL`I6iiDG~vO|n>#HHuM*VhH3C?zAc$u?me{ z>_RrtaBMVi(TT@KVhBNm;I2x^VXi%SS37?og{o^K7CT(ZB>)%hL;7aH0~M$V-8X(Tl*0))HEca3+8ZWK8fg!*ATM zH9G7GTuipW3vKRyas*(jF4P#d#&;ogKEHH%&V=N=OroF@_tlf~_Vgk0uwM23=@$b7{ z!qx)8ggz}}>R$X}7nZ{{b)n1#kcfumBD401+?& z6>tF=umK(L0UWHHE;ttume5t13@qZMQ{X3umnx;1W_;rRd5Aa zumxT41z|7-WpD;*um)}L25~S4b#MoHum^qc2Z1mMg>VS(rya(j92@}>00004fB>BE z3863wrEm(VunMj43b8N?wQvi$unWEL3&Ai9#c&MCunf)c4AC$R)o=~jPzwcM2_eA| z%3&PZVSesm92@}v+Heo~un+z44*@X{1#u7wu@DXM5Tg(P9AO;pp?${T5t{diLn^{5CF)bd&B_}jIkM=@fo2p8jTSW#6f$=ArhrA z8?|v8xv?7!Q2>(hdK|$U$*~;G@f^`{3mu_)+JPC<@g3nY9_8^FA)yYVXB~cV9`$h_ z`LQ2M5dhW!dek8w{jneo@*okC4*@_OoChBh@*yEIA|;Xw0g`#zfgmR`BQbL3zfpBvo=HSyCF;@p#CgC1r9ZX;K%%k$A)b8*6eWd9o)nQ2?ru zctX-AiLxmEjZzR#a(H6$D4DV;oiYt?5_mB3DXFq5t&$1>KzPdGD!H;Ny|NsD=N_ig zE6K7fdlCR(v3Iu8EZMRxc@ivrXDr=vF6mMuv$A)_p)O0Z5#&-YtMU_h=Mns}Bl{8( z*r6ZPVKB?`5qRewbW$<(Q61hPC8rPo+yN&9GYrW=9XPWyIny0IGc+?3GWk&e(h_&_ zk~H@bF8g5|#?l;cLL9^}AbTPuhc726Q#JJwFmoq2brT*JGAGz!D4$RO4znM8lM4fK zAMBwyMaMS#fjONMCzA6w-|;1Lr!TFu9LvETaH1UoU zGz&M>LJu@S>GMEQ^c-2!c0_bXrLjH-5)0v>AKqa$`=LEK^hOa=L3I>J$q_qkhd7~B z8Uf%PaKar_bP9{~NW-v3J2XC467JEOB49uo??6iJoTMi~@G zLG(%2R2%ctcGPrFhtWTAVo15vNO!R_vD6+qGbq=AGo$7m78NHNRULj5P>HcmYyKxr zE!7zT05IQSEa$WfG1W0nbW@#C0CLAvx3Ll8p%I)A03ab&W%Xj-K~`l|I{~0M?ICKU z(;h@eS8<|Of3-PhR8^fZRgE*^R5nl2` z2_SLzmK85{c9!;WEm2{ekRi_^X{j&(?C}v6a$bwHA0Pp9^Kcwo6f-GT6?GOuQ`Zz1 zv|};XEHrlt;qqbQRwuMHO9emx+!QC^;cZ*j6v5VZ95Z+~5da!N9ZnQInYVeDP+Q{_ z9`+$K)xloX0TLRa4rjD__aPp{VM~qoCr=Z1z&CuAb#@6rCk3GX5rEfxQ;{)whict- ze)V#AaYt|IH-D`%a!pi!{dX>%R(Hhme+if@(GqxgwtyA5DFc{y@OObBcqREacQQ1B zEtn^x5_k;vf;pHZQ#N>VvV%ozNS14b2h7t0Ejprh1 zIEVSsBbmn`b@+$hu_Bv?P=UCJy)ihS$A^u0iLI12p{E_0IEtOI9;>H?rTB_f7kjP| zi@CTK!BKmbv5Unx6$N#Bd~uA?I1`aEd}J|=-S`lBaePAYf#0}}#n2VUcYGcZdhNK6 z!LSqU*L?0U5B<21L3R=IxP6Qe36+ou4cU<25LV@o4vGG-k}dg?F*%bpd6PN0lRf#9 zK{=E~d6Y@Hluh}RQ8|@Wd6ikYm0kIjVL6s%d6sFpmTmc#aXFWDd6#*)mwow{fjO9k zd61(K(&fd7at0o!$AJ;W?h=d7kOHp6&Ub@j0LMd7t^YpZ)ot0Xm=sdY}oqpbh$< z5jvq2dZ8J*p&k06A^MheVWKIzqAmKOF*>6)dZRhIqdoegK{}*GdZbCZq)qyyQ97kn zdZk&qrCs`^VLGN|dZuZ*rfpiJBRZ#bdZ&51r~ZBVr-3@Cg?gxox~Pr%sF6CUm3pa} zx~ZM|si8WmrFyEVx~i@EsdNN0K>6E=ksVnG^!BEZ{ZE+X8+6DS|x0iqV0#DBpj&YP;>VZ~Wof#jhV-lDo= zAsYHl!^`aSa(sc5<`*tE&b9lJ<~OP(>cA zJ=v9g*_plBo&DLNJ=&#x+Nr(Tt^L}uJ=?W?+qu2lz5Uz4J>128+{wM%&HdcbJ>AuP z-Pyg}-TmF+J>KPg-s!#G?fu^IJ>T_x-}$}Y{r%qoKHvp@;0eCq4gTN}KH(L9;TgW+ z9sc1VKH?>Q;wir3E&k#$KI1ih<2kZT{wQKIi^*e&>0<=Y9U?fj;Pke&~t5=#Bp9kv{2_e(9OM>7D-Rp+4%R ze(I^d>aG6ju|Dgye(Slu>%IQ#!9MK8e(cGA9q?~O@O_=|ZN>0=9q}tg@p+x`DaG-39rE`?@|hhP z@ILaP!Phb0Tkc`=d%g3o-8V9J#Y+&z~ZL3cX2GqtT-=lSW+1RHajhP@|%pYSJoC ztS!50?b-4x&#+=`k}V7KEZUT6*M4m4wje zFyelS5jQUUSa9UOllAt!3~@2ulA0M-zWbSO=(wZZmR@@rZR)bC#bUU-zY5dp2^z%9kf@?wm1n=fuZOUtaxYcC*)!8$TZXImz(i z{gRhH{`~fs>(h3p-CkvUw(nzq=X)N#dGhm7_J3PnXa4~fpk@QgRp4R=UUZ*V>LutH zgpf%n8HJQtXc>l}X($?pqRxC3{u6H>G!1%C{wbS;EJpNckb@ zS(pBq3E-FZp-G^c0NoSC9DwyYyeJ0stk$;xCXM}}LcxZ)oX7*tI zq8B=vA*35h+99PMS{fpzBx-6RrzkG^5T2f@I4X;!x_By#smi!2jjh`F>W;DY2&$-o zE;;Lvw^Eral)Xy1tCqi7IV_gJf(a@zwu;&4v1=B~CA3~T`=+#KTAL=db7I?Ot<5r< zBe!vC%crPI4)>kun zw9ySiy)M}8iv2Fx@tR$))m>}7HrHQ!Ju=$&%AGIW``XTRnYIO~c5)5bnCYljE^nIinoN&Mb9B7OPst+a8XrMeaX#T#B#6kfiEa3r@ zm%xKaqk$Y*o&-D6fD+130lYxr3p;`jQBdN7mu!t?Z zp8agHk66S|0VhP_24!Li1vJ1CF>JsytQf+MOv3?M&X`FBH~=1$6d)8Sp+!zm5s-Vdh$s|riFov5ADLKXCvCC`1$<&3vutA( zofyZ97-Inr;N=f_(#J%GE`mRwviL1yw6SWu>elMqZhU`XG}2B0B!ce8d|g`OmKmTf=siV)%>O(p&3ky zFfek_>_5+=F)V?k9i$2<4yo zA7$78zvj$yX8kR2r$|CjIQJut%*0D%VOz)A^r;NlM?VYl$=L4fi9Bg-aZ^H0mvZ(d zo2Wz=@k-i{khHf7n65|Y*$H0mqm8_cZ%3xdfLK(+7`1eOIJeu?k4&?_=e5Xw&qxU} zIv|Y*zDYB>=w1@mbh#;%$9DQlRokB6Me^IiF3!b&YN6E)48!%NC$Hb>q^lgJJ zLg9YUBZkvBu|;aBQi7mztg_|qMcPPY8N>eMm9ZR1E{LgK4i|MH(8vT4W5@tyDmf+I zZGb_-JL2!OwVpoyuW8|XW0as0%|%WyMfS17h=#VlY5qtS*(~MRB7}@u?#C-VQRa(8 zwEVQHojhW3QNLs^eoH1{>%{-w7 z8O1wm2Va80^u_adr;Lza6ta*pB&2qkZIfqU;?+7P;c&>A{t<*rvH zha`7DL>+C9+=Gnk_H{x!p@1OwgZ`xri1M|Wr0loaL>{OFv{T(o5l437x>_{2q2VoL zI{O9t_lcSA?9(d@=*hoo6FcWT>`Qxk74*36b`L7a+BF$|3GbShgJJ3n|70 zAxKLF$hy)bW-X@Yt=BW&@s8HMIJOb83=ETT0X5vXLNzXOirfR04al$qr~zq(G!nw7 zTtKG}?(&7S`{6gK1{t?l_Om~pI`XmSHJtOzy9iHe|p_d-1qZ-JL+ry z_}r&E^ZoC9^|v_p*Luf8fT!1g+ZR7EJ2+T_PuPN5_<~#*gGrc!O?ZJ` z2!22qhPp$8Qy7K*2v~$-xPoNZgC8h|R>*$1XNFnmhC2v{Qdm7yh;Cqrhf6qw_=AON zxQA@Wgo5aVd3c0}D1nQph-1izQ0Rz6XNQ1jh?BU5n%IS$_=P^GgeLfd`PY7PIEtWn zhN2jXY1oHr_=u8-hIg2Wk@$w5ScaI`ij`P}r)Y{wScti3i*ZPY!^n%oxQem}jI^kS zFvW`7aUhkkp8ZfvAe&SdI7i zk6dMs?->4(;JA$pDUShJkp=mX6xolP7>gY_j~gj^8JU0|*@-CmiQ$Nm26>4KIg1V1 zk|L>*DtU`AnT&*ZkP69?F=>)*Xp_R2kPeBH=s1xh8I*j8jxy8dNZFN7IhDpCY>2@XYgrg=Ngi++9&#BSbm<&+ zxg2I>D(I8EP93e3hf=L^MDH4Vm8;H3P6zy_6r{Nk?70>0DG~6A6!K}A^l20KV4s?apG~o!>xrHJ zX$}1e6Z-iY0~(+QN}y69pbP3z|EZo4Dxnifp%rSO7mA@7s-YXop&ja>9}1!&DxxDw zq9tmgCyJses-i2(qAlv8FAAeEDx)(>qcv)yH;SVCN~d*dr+12{d8(&-%BOwmr+*5lfhwqjN~ncusE3NEiK?iJ z%BYR%sE-P%kt(T^N~x7Y!JltFij4wHmCss-U}itG)UWwi=<=8LQPf63kkw z&MFen%9hfq5!CvY)(V`+Dizua5!fmi>G`bO>QUbM5a9Y3;ySJ5dKKo14Cs2A?%E*i z>QT6Po3ojlG?A}5v9CbUuSM~%N)fP6F|broup%Owf)SdLSrQ5R7YiHy9uONH66+ik zyBrofn3Bn`B;l}n0ik_CuTr6#aXGScS+WHivh}L3CcCmIOR_C{ul&lg$#RxlIhIm+ zv#?mRW|_16c$77{vq0Ok%LtYGNVGwFl46*+`Wa*_34av}#+navQgBJA`68w|1MhdaJW$ zyOM6Jm896VLphUJYqNCQwT8>Hhzp5$TepfUw2a%glFN^1JGp|JY<_!_VVSj*d$gJ> zlstKYUs<@Ed$@dCxuC0*or}6e>$r()x{KSoQER!W>$$WWeuMrix`g|-kh`|A8@aP< zwMq*csvDJ;>$`cIypIdKzdO3R3zmQ@mbW{+#%r{=OT8fZx_i64uq(Z++r8Y|yvkdL znVY?5YrRuTzTbPg;fuWGyR_*$jnT`yf$P4uE4*8qyXKp}=zG3@TffuWzW}_uzDT;g zJHE`zzOsA2pZmX?`@H4bjK3kQ zzazZ5?VG{k`@tuP!VX-)BwV^NyuKUEz%LAoGfcrM?7ubK!aIz^3arCnd%*U~!zsMP zGz`Q9T*6Tth(0XBLVUbTT*Mk|!Z&=xGMvN${KOW##r_DK#W38(Ic&ht%f(}?#AWQk zXKci5494(Vyexdh1+hh9EX8CD$6CC{ZM=U}yu$gL$2QEza*V-ltU{kR#9~JY*#yN? z{KXZ~3$fq{oFEFjK%ZnH8>K=IyubjIuwv>P#~$$umtb0y&~K#d$7`Gt`QTnXcE|nj z3kwi(jqJs0Y!OmqY7GDiF=mk}fe8!{V-B!Y9QjYs1xuNikBYbpo+og$ya3dO%qbBJ zheQdMumB1Wdd*zBPHYn+TycsH9QaoMY9D61ntfKGjXL zT*V=r4-U`(GRM)=FAAN%?gU`|t_a1kB#d6VudG+eAbAcx+p= z4~iy%b2Lfva8v`~Q$sh<7IAFJZm$1$@%@fxo&>YTNb^lFd15_6r`dYuw$ zr_;+O*oxc`3Ls*JjMm(I(juhTjO`I~)Xfdej41I83$W4Kv_q5-3nOF=aK-?ET{X<4 z%%;|{gK;7|)MJH=&f_F>@IYhz0A^SIOivA94We*CeU{XKoD%%B*sqNc3{=xj-4D}1 zO;}ym4j@sE`$_QiN(>N6s3Z{T9M>q(bpw$N3a|-RtV)zn46ee^;z`N!2Q@Ap;hu-TFfon2;od-4c5A>5biY)(Qp8WKzF}E`us@>AQ1f2 z-G_}5&=Am0Mro`}5DaHqG%eX;hYO$(3#8OXm2KIy7z~l5a|7{8=X~9NOc9!(;M!{$mO-$`TpY22sf3Oc47(MiapRoBiQEr2x4w5Oc)aCyqn1 zKt@_53+m0zlSogu{EDE=08rj*_oe{;%=|RbWXYaD=48IgPHqu}M?&Kq<`4K)My}jD zgyR%J521X6Jzfw7G!VJOW{xxw4nWOqu7j#H5nQz22hl*=Yzf89;QY)$iL?u#APf3@ z))kQrchwKUKt!YE0Q%kA6;WFP-*dhYGj7uLZR2#!(LTlI&Fr`g091Tl5PdWe z4us|mVGV>tM219rkM`*ou|>-u(bqdd($z*J!~ihfF?usX3*HaC08&S7+(B#;rGDsn ze$3U5(5Ai++6?CPi01@h%&@&#sMKSgh16B9h|QqpB(&}8trD>SYI%I+Mhg#feGl|x z3Dp3~@h<31m{A4cQzTT;jgJ1}7J=;?%|KKx?>2$lfnMoiq}dPWxR|g2js*=`^=c!u z(>`V5>>hYsK0?eM;}+;si=D^IFyg_^5UTV?B|i`t@A3!{Vg{i~4FJ~@@7pM`@J>zZ z-o6kiFZ2juRZ4#60G<%8PU2dW30V{hMP%o>P7zkcNtv(!_?a3+y#S+?$1@$=JWml1 z-CsV1^oB0>3K3VhO%T5@MT;)sZ;Z$laZUc6?V+XsTmA4T-2eyH+~YnFADvF))Y)%j zS0%mU0Z)s=Y)s{z?KDS6#FRx1K-wa&Y74+g`R)L*0C1yD^<=F@n-B^Z&j7oSMPFU> zAl$@(ukS@)cYLSnEB?pbDfzm!ObL{3?J1Gn{jlB8ZnVE3;0Gl8UypKv@zxRD?#`E6g96d)NANK>HN_ziyfDdaI6bqo054dpf*FX0Z zQ4OJ7`Rt$YE{xbeY!k5D0M&5!nJ()!{*)aI5WN~GU|=berb`1q^<&u3;X{ZHkxisn zG2%sx88vQfSkWUgjv*N~up~0%M~fy^uDpnnB1@PtT~3TyQ{_yMHg#^qx$|MP2A6#H z>$!6uB?s|_cAUA?DN~$LQSQ7KE8&6#L38;m`gCbmpCp}v^}3U6S(|6k%51vUY+JW! z;l^d_lCE5-{&`>Ctvi)3OtpVG1{SQ5aAAyx5l2+K_+ewmQ2j>cIhS%`y_qjpw!1ka zWXhl;i*`(Uv1!Dp3#%5)`fp~|%_}$}lVe1Vp zaX9YeaihDPzP38r>t(Zh-Tt)u*yU22|4upn``72S&ktSCHNEWiZ+i!iuQR;(@kHNy zu8((e^ZsfIurJ;68xXMlHan1|`=ZKEzxjMyaHR=vO7OA@P0CQD4Ntl-v=2vXFvQYG zJk7+^P+U#L)>wSaMdM&ZPDbTuly1ZbiL;Tq9j)sTyC1a+lDi?jD-ygMp*s>i91ApW zN%o-rbT3Kuq?GSJ`mD51OaGh%kV^rZ^fF5-;RBOE;0!zy!7}+ks~@~C~*&1>1Tb<}O`>=w>(# z&3M+2YwZ}?kar!K+me4xIoOlM-T2s*i>(*tmeq|p*_)-!mgAY7ty$im@n!VZNewId zv!iFr+1jPCZ4}|26%Jb8srelm+^YS}8sM!3?wa7Q4Gx>(u^lcO;tDrM{EscXMsp+sARv zT<52GjvVgBfeu~h(W#ys>(Z@GUF+4kZr$tG!H!+**~zZm?Ay^ko$b!u{@m}})ec_n z;pr~k?&I-JUhn1k7W1C*?!gKA=A@sA`rxd0347nPM~VC0y#EM%+{E{Y{Qla^uLynF z)TfAj&)lB~{>|hc(VFqB!3qE7^q-0U;P}ra0Q8LjQ9{7o81N$q#Ek+y!ob=%up$tY zjRYw|LC;ulA{g9^2605c$k=aw*^>$g9V0?ym~b&DR3TzmNW!SJurM#|UI}41y&EbE z8PJd+U+w`7sqip-K#YnI%SS|<7%_cFoQV?K$3&MnF@8`)i4^Nc#gAC=GCvGr5AVXo zB6^W7VASCS#aNbmcyNJd^hz3GV+}Sw#f_PPWBkJ{-Y#iDNT7wRHjmu zt7K&>UHM8_#!{BEq-8B_c}ra8QkT2rWiNgCOJD|5n8PGyF^zdlWF}LY%VcIVo%u{? zMpK&8q-Hg(c};9)Q=8l5W;eb0O>l-&oZ}>CIn8-abf#0C>tts;-T6*<##5g2q-Q3uS0S9r{p+MpU8`rD#PhdQpsKRHGZ^ zXh%KzQILjIq$4G1NlkiEl%`ar7~MrIV37)###E*=rD;uVdQ+U{6sNF=#V(puNXj%a zDnJe4Avd^4p9pn-NTrHVkwMfGIu)ublqyqoqEy(l^rbrfG`qi28)TfXPMl8U3 zRcYP6(5j3K>|bXXSd^4it&3&s zSK0bVvo=<;lU?h51}jJ#)-Z-S+#YAY=h^Xr_I#p^N@OW}TFS=4k-I=`YbiTcI_7VG zvi%=z2WZ;^;&y?$eIRe6!dlk`cd@Vym1%{0T*ofwvU3bEidYR zN4Vx0?!Sl&u;L2LxB)v(D*I({D$3a4{q|SB%L4vf?*x}%(P5Z$8a5q=RTmWq>-WJS zuCIhE9N!aD*mD+^oQGNGV%NbKb|5CPct>1g?wWYTDBiJ(eaB+Z$yjzmrX7)OM`Ijs z_r^&+u8x1q<0t$0!axR|k#T2b-CuHOTxiMKdCz!Ww4STXX9Wvdz>v-` zr8i7yM5Ff5nO>}-AI<1bJ37sl?l7r8Z0Z-II>wmh^kg^PYP5QK)S#ZVsQawy8RL4$ zx-K%WkIZUVGxpWN{;I5RP3vRZI?}$rGXAr(?CdQ=d(FTmc3OvBZLS)7*~s3uvMbH) zZ+rXF;2yWQOFa{8cRIi6wl-|c`(Df)7;@5XGriwz??2-^(9~wPSFhb~n`%4U@0Pdb z3eGulpWEE0PB_C|0`Rl`8{+(Rw}16L=!T~{&LXS4lr)~3_<22_d-?_qjZuELX z{oYc~H`VuTb&Nke={a3G$(!!*r!QRNV&^#7J#Kc8qg~`$-}+6vKJl-QJ?wM0IM!pX z_L<|o=4@|!P2UdjxR;&oDzCfV{)cY(q9gw3eD6EOmDTuwr#!`jpM2pd-{Y{O1oD12 z`Q~F9__JR=%Azkb>GQ04&&%}h00({AP2cF(hdTDPMt$mGy83>%e(keQHt)Ob`*7FZ z_PA%a?(+_Oo?Bk|grBhRj~fb5L|^*Tr+)QGL0RIb+xUA&zSEaqdFH3s`K={|CK`Yh z^rv6_>qox>Jdx^YSkNNvYdHkmx1tu84egF)>tQdvH%06tHzr-5~dYFcN zxQA)Lho6%=Yk-HWt3SERzcSmu$?CuJTL4PtkU;s@>!N;?`+mk%}+ld#1 z240xK8gvQ=z`?uY!O+t|mcRu{U;qZF1YW2?A7rddFhNTQg~c*LBvissVZtVijiG3O zPRPNXzy$@EhF(yBU#P;RZ~#rPL+~3!oqz`gD2XiG2~HpgOP~Y=Sb#B{H>9JiO!&VA zs01}!!y`;WVN=2I@&p9{1^Yt4U%-WaZ~#$&2T<6Dpi?|Nw1z$G!&Y<(N(jV648JGb z33*Tep}57Gcm@Ta1pbkQU~I)QL@QFL#3Q7HOpGb>qXbcuDO2!-65NEDVna?;w25SIJps7xPM=t}%nAinJ zQ~*tg26rUH(c?ndTM7lh1bp0yU?@gOWW2@VK&*hqn&O0qTmT2y1cr1-tWd~n+{B8! z6XDVX1vpBilrutT?j~zm@FU^!e*qYr~JuHxJ#Yn$)Ie*PTa=U8U;@nOu{6>MuaI- zD91_o1peegKurisN)UxhXh*I@$y!?qP+ZGd9Ex0kNw%~JBpl0_kcUc808@m^ikK|( z!wO4~%9`@Ytmwc7-~@*3%WPCD15B$1$OM=&$_8*vL!-)-n1*FI#Zc%68r)1=JV~FB zhgjes^qQM}z=dKEO_(rC>tu<^6iYG`NXhEJN&wE9`h=XsiU#n6+O*A~6qBM{KWp5C z1(3*5xCAh~gr*EmIrNE3;Lgw7LCfsD|5S+vh(}-433k-Xm^{X=`h=fkOs+D8P3XV{ z=!Bc1$iIBU;1W#2983cIz?quMORP&x6V8-e&e99efm@2%%ubbf!E;1SijXW)Ktu7= z{>bvoiiNBx3)Myp6)#ipOPbOIKW<$-7g~uJXSlw1oS7 z&75?A4&2G~oJgU(P>Zau$Lvy?BGWn}(aS{9M9OPShH-1Nlb@=yk2!KkyrsZ-RdW7Mm2R5%rhSV+$PY&0qDs`>ms2A~8z zl_{M3$sF~BEPcN~{ZbwcQzk^zMeWMn8w%&lhDhaze82^0h*gfzg%_<%pP0^CjZ*KF zOZu$IPK7Ci%!*G)Px6GwE)~>v15EitQvhYtH1&y3Pyhr)M|yifO0ZRpU`K%dEKr+x zK}4+6)I_adWq?Vz(lc}b5lsbA9Z>ZIQ=)`JRc%yOJ-)9DOK#1GUSNQ4tyGo(ie3cR zmG}h)s6$`1Q*+hS)|{zPFjJT!g<(wvW{ovMZM=GY)O+PVH4TYe*j8{oQt|s$bEQj7 z1kyou))j=--|JZWlU9|021?*hJmt5NXN zynI~9ja1G3Rd6?wqV;8VcZqq*X3aCb6)`d-=bwGj|c2H_DV;>0E4Zqwit2IB7(;v%NtA%@~7{^0sm-)Cjw`*q?YHe%uB z;?zar?zQ5T#o__h;x3lrEk@%rred)b7_TuwZ<2knDa#P|1MBzP_<2q*J zCE!;~IwJ8DP8gUiUhVmFjW~Au~pK30jYfhi#{?IPSTjo#!uGAwgLh`K(BIgY< z=chtv=%fq}TIa}UXLLphaP~ZLW)yC2J8x!Y=o%sFdS+|htbUGWYzF9m&gS~Lk9*#_ zd=3@G>gKiz55p1+GHRk}u8E0`qKb}*i>{)KhKY^NqK;;XkCv;DUWt*mtCCiUlg5dL zZoJ2WB&|w1vHGc$-UzH3pqkc*n?9hN&WN2}qeP;kp2mou#-pI-qoKZtqW&$HlIfmW zDX5NWsh(=8u4=2kYOKy`t=?*`?rN|8YOoG#u^wx(E^D(sYqU;lwO(tsZfm!GYq*YU zxt?pfu4}u#YrM{Dz20lS?rXpPYrqa{!5(b>!Y*vXK5WEJY{gz|#%^rKer(8&Y{{N% z%C2n7zHH3SY|Rd-n7+B0#*wLVp{hD+LQ3ifIqjqxZ9mGYriR06`|L+*>ArjE<%sCN zSZTj9ZJ#bI-9~NSzAD}xBB_vV*G@Ou)}e$>x`ob*-uCItDrkTHZR!4P8iH<@Nbcee zw&fO+dEUHw9x8PX@97@z--hS@!HMq9Zg%_bCc$pyRxa!kXzLy=@~-a(v7hGFX`FCx z^=`H8#t~zNJY>#`jio>PKJZaay8!R+*FIiYb7lBi-q}TP3Www}WAOGxz~DB41)7pJW1GWJhLlD`(zNd-6Vx@=u=f1h4Wd4|C-W zJ1x&;4G-U5{&61{b2b-_%Aph=F7q05@K%HHc$4MWmGCwPaa@6OPnPp8qjOHP^XP=- z2;Xx=XD>s)^B4v6I%nm!wc%Qx@kDR)J~tYfbo4kA^h_gk^@6uT$MZ_B?@LFTOxN^4 zhjiqXbTFs%Q4jM{SDH9S^$1h-2WRyZNAXt&@>p+)Nu>2uKl2Pn@?l=%U9a?B=M7v2 zb|U5SEGBkM4)J48^kjz!e*R;29OHCE^K?ZQ^;ibFX`k+Dck^Y(_Nf$h68G{B=h$#R z_HlQPQ#W@A)AmB+c6M2>dk6J)U-!e4_h5JSGKO|eHuilN^LHnYM)&t@xAjL)a|=)M zg17O5XNYT8_(Ns*LC1A==l6&|@QH_za<};PY!cVDcXz?}lh^l-FZOT~`8mhAv}2$8b^@1+@jUqu=zZPt*d(`m7gvWuNuU>px1sgmx8sbT43mm-c}-dp<{d zYv20*c1Q*2(}oB5{y3g{f~R}CS8=T;`r?kzzPHAVk9!@*51QZj!e8>k5BZ5x{GI&! z9Y?JaoGGI`N}aq~r+mmwtx>G4{H0I%rk{KzPquU;g;2QC#=?BYk9o(}sZm$}1t8Vl zQ~*xk1R-63Xv72sm;_BY!v^^Jlok9tW_i{R`ZvdP%jd3X?8b(rEZW!nd2OvABng?) zgawExQdodXNCgHhf0!Btn;cPxC*?JN{awN%;CQpj&xDh4GmM%}K z)cA5H&6+g+?`dk#AXdL=4nXPT+0R&|1(bq)#N}YYC3#65Fu>&0Ce^A|`^EHlbt}uP z$S#5nD|YNfP?i`dU^t2_*-Z@;IM~E?F5R(S?`Ew#7Lg)8?sbGwe8XKYUKQUimE1uIxETmdCgsTx?49u~S*-dlH@ zzluIRdy=?FgPf+o+DA~D`qBINj6uIm_e1*k(Jl_OS0G92890+~;xR~3C`AzmN`t8+ z7uWuT7n1kfh2R-<$pUMoqRC;Nbb<*3i(Pl&L>VS%6M`+a^dgMr#X^Y#xb(CDNU?mj z3ndLK)z2leh%}H+I?ZUHj7gTXpo-#|HQWM~NH}4I%RMPwhK^0>i2`4OiOE3;DU^u< zq&yT+mMk(E<7I7j^(LIW;nUA93uGf7G#_=62|WzNR*a6DY$DPop3GU`l8JugWR}O7 zg%(_y5L&6FmtvafrPL|+sFqvaHQ_^?kjjYz)rCl=L1vQj2~!G|!|jg+|c6jSkNT!}FaN5=4+-o86mxNm`(vdSy7-15qlbW$>K@sfPp zU$drS3IpMZ2xbG7fJos|C*myL!3!&_t;itTBr(&8F5PC$GVe9emkm%diPl?l-L=cYT{P!qw%Qnx_jJ@R^%C2*Nk4s+({)Qtw^h0PQrXmNUlfYfMtMSt;fEuh zxZ;Z|t|s7Qp&irXW*@Dz-c-pm+{Ynbj(1IWdp_gaE%gGI-)T=i)+lFX{x``dj;F46 z(u^Rmy*(e$3)o@?qFFFr2SlhO;3zku$H~gasFEEjf0Ct3cB5are6@|bF8pITz zxCA9G5egKpDS{G&VRPm;lltM$e#OvW_(-_H5dzVCKg`?mXs8fUjG|yhoRAD>xWwPs z5NbnYQVD}-MeqrbY3F+)7n#$sVJmy78(ki- zh_)1EEr*#3T$&M>Cgi0ro2ejWw#Sdg>|!y8iA+Z_6L-*bCM#cw#g0sqn3J65H8Z(Q zHlCB4i}WTBV;Rm!R@0W{Y!N%TQcraf@Sf^<{Kq7}vGMSuP&OpU&gqvEur78BY>myQ&O zC8f$jQTjlYhSHs?7I*l&W8uTwRuHOV^Br)ux8g)N|D?b%kvCJ?TJ1nf)EnoG}4HjQ?5 z(^oN@S;orKu_1-5twtN#WP%o(?lkRNQ43JjLY1|6jqPiL=vr4^mbTZ^EFd|H$ja`I zx4j+VZ($N#;WF=wu$U$+jN4P>?o+wT%_nv-8vc{%Lid5yZDK5@8H)_v17!E`N_rc% z-mJ8DyPSM)Oya98`l_V7;Z5Lqo4AW^F!MIt#9*vAl(7f~sGxCTINbvp zc(F0Ba=hakk9dSWz6+0YHDs^An8huo@fS6+i&%hnkg$lwg=uCDAh+lq62{Aw6QyPH zbUDaC{4#XHjN>ie<;hW2GS#MB9&T^hJo$GApJL5Uedfqdi`|RgG13J)x9yFl~ zZRkTII?;+=G@~2s=to03(vqGur7Lae{!3#z)0*Bir#tQGPlGztq8>G=OKs{?qdL{9 zUNx&*?dn&s#YG*Sg*{uY2w5UjsYX!X7rUi*4*G+zx(a)e*-+=0v|ZR3vTd(BRt^>UpT`X?(m00JmM0cIK?Y&@rz?T;~L*M z$2;!vkApnqA|E-)OK$R$qdes*UpdQL?(&zzJmxZ=In8Ts^PA&5=Q`gx&wK9kp94MU zLLWNOeJ$prBR%O#Upmv9?)0brLp|zJpE}j6ZuP5UJ?mQEI@i1I^{<0H>|!4~*~@PB zv!gxjYF|6s+wS(a!#(bDpF7>_Zuh(6J@0zoJKy{6_rC)^@PZ#a;bS@j8O$K@ieEhA z8}E3>BVO^5PyFO1F9R9Gpz0zh~EO?KVSJFXub%ful(v` zANbZEfe1#xeG_;e``#x3_px7n6O@1i>fgWyBrt&uOke^MfdBmG-~Rh=fCTwhKmSQk zf)k*?3akJMpaAv_;0gYmANcj3`gH&YIA8}fpaXJ12Y|o`03Y`mUj`Z<1a9E*JsBM+j=%|=fC*%w32-46Zea;%p%;pw7!n{B z5?~6Tz!q{L6@uXxf*}`9VHalM7^Yzw(jfuXp&jC33h-ec`k^1=aF9Ol^*G-p6R__47eWa)!ys9-t4`A z3oK(ZGNbLiKnt`0?=_?DQRDB0fD1I=@GT!ViXaRmUj_mnHJ0P>WnlGbpZS@9_Jx4> zQQ;bLpZATQ`H6rPuAlx%fcx>|KFVMH;otu4U;q7I00!U+ARq!FWC7yi`bi)JN}vR0 zVEBzd267+>T%_?W-|{(O2Fe}?Xut=YAPc4-3%(!?65$c%pi2HA4-Vl67~f0EWJ z>LCgs{^C~hAtBl!ReEJuawQ^GVjn8vA|@hQUg9I7rCDMkD8gl2%B3aJr6;byDVCxD z3gGIkVk)*GEixYB*&<*z-Y#|?<|*D`ex5I8-r;4QFa~4ksov=!W9=E^3mD@wUL!Qt zUT5Z>>{X*R?p|mHpGJaUX<}ptjDQTlKt-CSH%=c28lO78qX~$>3RE9%3ZVIg9|=?+ zJ&r*BaX|U~CUEi}`_W(h?c;JTCvrNcb4uYEe&rbA=J@sB1Y+j~M5F_5AOw165@w|F zeIR&xfJe3f33|W^mZS=*pbKU|deWc_uB1%{p-ZylOycJa>R^20U<|?}2$bh*qUKKi z&Zc$#WcY#K8V+R`${|u3<%23^QF37$s^L+Vz=d8YQ3fI!Lg<4Y;#l^fAbRK_hNV^_ z;tFi#TVi5cs%TlVr6|^AjLzkZ&Zs6j;$7b8jS3(O@F;*b6)VanoQS{~(5UN2r= z3^*p@9p+;uX_7Xn=|$#at{!A^p6#)KWxAg2wE$r>8QQUc(zDyxE4DEeV& zhB{~-mf>_7rL}@6B9`HZhUkW(;Z~w3S%xBvnx$LH=vj(liqdGix~q;>qF$DwD)Oi} z5+jgu-Yo(qkrHMuJ}Hv^YrrZdWB#HsS}8H6B4#Gz3$TD+YNqaqsbyv+#QL5Kgl5Hl zplmYXPO2uTYAg#(pc8g1ZMI`>-XjPCCq0s%6q27k_NjF$YWx|h{LyUu{bT;&>_ARo zv!-Df+M@`Np8_(f{=uJiYUc!Qs-|9~2vXpu%I4B`Kn$MXNU|peQ2xLLTtIum=X*ki_;cDU{;wU4A zuITFJj*6ozsvZk$o{+{O>mF$=!eV0rEb0ZUz>Z#(vfeNnY{Fiq?Io;dLadn5-ZGBq z#r~efR;J5(Vtm3LnJ}}tcf_?D=ELuA{8%QZ}KiL^Ko$X zb|m-3zzFPVYBKF`elPZ7pPde?ael7{gWu0~U-}Vka?C* zBI&^5Vi;Q~Wmc(_l5y<$?v^U=8VfHQXDsq|X)~H*28WW})_)UnL7Fayp;}Wb#99D$;6j z^?vFIcBiSHDh3?z)n@H_GBwwV@~X0A*Vg{3tM;cXPxUL;a)1)3P6B8LimWfE>>A!9 zF)w8?&+RdfaNRy=Q%)<~4l?~3D}+un&tfGZ9-tv|>sRVE-fCfqX6|2)GhKq{xI!{l z(&!S;C1Ovamuy}v}EqCloIsnxgHDP zUhqP+@viY`zHw_?Y@C8;cRH^{cJ&7&Z3PN71TG+tLLn5|@ye1f%X%;vp5HwdD;NeU z{KcOlH@Ez;pZw_`LE0uBYM}^}fKC6TqTcV(YQWLj?*n?L1~lOQHf={Pt*NG<2T%Y8 zWNmvdHB*-)1Gk_J*7tncWL4*&3;t3y1=I4Z>hcD6V+PA09``a>zpeO6>r`&xf}Y=6 zBeMxJC!3t}DCb%~y#;a+7iV{0C6c;;p^V3TDJXRbN7t71o@DLOXkwxTMo zVqZdbDmJW;M&2%7c42zMZhA-=t0`cBA?Gtu&(czc7i(0K z^)X|3RoZY}Z@7ndYZ<0>LRMvokEODk__%_z4}++RyQ^YrqB}dbjQc3Pk}-}a-Y;5l zVcz2G-mdCF>6AjI7!!FiQf4wDER;w28i(eS`(8Od`SNz-Pb;B`k~_vxR_`r|)RyaZ%73bY?g&)=kqfI*(L%ep#u+w2CM zApODL2@X1W8#<|WFbc?k2~;#Mcd8LiEvmXV)?%%Ex1dR8x&XgtR@2}rXSxj1x6niI zOX_zlQ?;xLcsC~gAq_U+sv|h}_Gw!$xU_yB_buqHLulU8G#v6eQdZxui|B?2I{@Y| z;U+T{9&@sHv$*2*x4ykL&wW}R?z0=Vw5vEJ>LnzWt_t|2D`tCS)3aX+W{zX_6*p!T zUoquPG36F~Z)uYd*#5-s@H4#bzV#W#jCb1QKHCZPp} z00hG1%3m}d@9zXoFGOxY1)6{qfwS zw5QLnG6Vjj{%9ki#qVS30gin+}g$`v&6h#W9 zDUkkzc|yd=r$d|mWUBOMQmji?EcN;otO~GWy{a&K7VX&-Y1yJ((U$F7w{KU}wOf}3 zi@Pggz*qqzFATwh0r!P51F?)5iV-hvyqNK0$&({HmT_4|jLer~bk^M0^JmY3I}h&r zqBM*bs|T}SP56c2)h=4NuwA?M?cBC+)6U&ucZd+Wffo<4P!u|XbO4Q#l!MpiJ zs;GpbqB>B7o6rLgzzsBTFu(CM&>+7FExb;;iAI=6qUk!Ej>8TF%78=?F~H!03o^Li z#1vaR5ylfs%;19(Yb5bTgASsRARc=xh(r$x8WMydhdjtgBoQJAAt67A2%>|aWXL%X zzRL(pEKAz5q?tl`iKd-+@{*&cZgS}(FQ0M>g%ysP3Z|^E%E~F2qJopEIDMMaDzNrU zp)Rw?T1tkl1|>_-rQlkW(MIJuD^R@hnv~MNR;ct+76=opGQ~ViOtQ)*3zag={y57_ zGt5Bi4As#*LoGGaR5L7w*kn6RQy74A?FHam=#@6!it`OOVufqr*btB{&N$(YqY^|A zq`MBg5TAQ)yA86#c0BIV!*V-{&V$Zd^v)x>}<5)1vw4!*4%$mmN&Wgu)4U|z z^e|InuxwPwFax!3zY{}sGgDg~?eNS zWqozQS!5Rqk;;U(&2EC{MreVA>>ix2b&Sljhy&Ykzx~SZOb~%+l-&G%y^8AdFJAkO zXK(`vydxn%60FuY=zh_Y0APXt<)Fd|D4>AC3l*l&T7{)Mh&dgFteC`%QM@=s7FU#! zehg;x82=zgB-zH2SvK-W2>~FDUKT)+5$Q?Dafm{0)}iX?Y-c|s2~N@^5-j~}XeMDA zPikT&j_m6uzq1Jk@l>X(1%)LmVABcV^t7XBO)F(9+t|qRHL(7nZ3b&YTU+Qd7rjVI zZYii6VBnT3!mz+_p1Mq9Ol6rR29Ak-I~A)=#hJ#XDm1imT&y-_E6BxWHDR2MZ!-4+ zVKEDhxN%nLLYEv6fbLl!;?Rf2M=c9wOFScx!3$caFy=ugK<5$xcu0`D?bxd#wmTO_ zK4PbiB*=EiJKiLZ_dIt!4|*f13kndlf~fS%g8quoe+)(e?|n~T2>ZZ%O45Ju*Pf|VqxYa9qaC?Iy6B`Pd(CE!GGT3MqH!3;r z%F1zIoZM`P=RD3aDpI{;P2ZhBg-9y_O2Ff;s@8`BlvJMc+~uvHv`1g(l21jrM^>_$6_se^ z?{&n-R)xWJLLPW!Tt}wMiNz>>d5zzWH+Ex*4N0&$>XH2fTcUyZD6vdRG60pNz9zNo zvCf=nb|y<%2x3!91mY}~uL-m;rE@0!Jj>Dt$26wY77c2%l`RTd@J^_}$!bP%q1Kr4 zr$OcOExHX0+WZ-pvk5d(dl7V9i1-)51g14zTn%Jq;F(4@H=>#0TNI<1M8r7sa8wM9 z7f-XQ?rvASVpPp+#>ksq`RdeZR4M6(^Ep;a`8dK^jT<}QEC+Uoz^t6Bg(Sk_2?;d@ zB3Q6@oHK$AWCUAB6|ucANdlTANGCj@X1o3~$qQ4JL8DBhIZM0Q0}r@e&>PQ*&x&HR zS_phCwkeD+#Mm0!Z%%Oc@Onjn3sm&9GR1<+~+k_w(W<`Z< zqAhCybrn5-MNqa?n{U~Y!$7HEpui38T?`txA}SYhs(B*es5rRIG#zlEQsUpNo9WPe zdW(cPP2^59Ue<`Q)WI5-O4A6OHp0<#_+8`cPWQ%Gw_U-|>94{}2|k;ePXkirfCi-1 zEu)@C1cgjCbP!p1XMYk*ECDO@0Hk3`-X~!H`Hu8FsSy!;`(MreY4%P@?sHEl-7I#F zljT~|5lM{R^wzPwckCkeVZcd54)TvGX1^WD&364 zxl80oFx&CVP7r9=6#nOFIqv)rswtjSo64N)$v zL*?AD5s-Jo-WdGr7$)x>f#;}4o0nhje97>t!@fn2n^X4%ZOoKAU^;G-B4@-BEZ}b21Bl81$7My4dTXb zOvmVr_4LX`FoK-a{%I#f%lXO)`?9ZvUJfeg#H(DWtH$pn%+KV^FDdM-=4{TMxMjFRYoJ}9OsL|D00l`>%i_; zO0A?=KO2t;T2XGK9d$r8{CUthUV~Qi5oR zhuUc8!glc5OiV!TX2%+ael8-|64&6Y{+&)iyqR={Q3SngI-F%F%TCeqb3yS&JZV88_w>K9FlyuglEgs}z4 zYZ!fHbU?@KY9rQ;V>*rl8auG`gATYm&G@mf^s71y^Z+un>3iIs> z$W2`LaHg*vG{K+I`kvMQXWCvl4@Fme63 z!Y<^~hQwk~`pi*yNH7jc287E}h=@QH3NRp0atz}IDry!*qlx~8>L#rKRYexLOF?f@ z(bn?oc9B<9;}&U>jpzbHQQpFdLN6@=QKh>$Dx^NDE5&Op zYhyJu)HcRQL{kk}-LmXjN)8upAw=LX=&J*u5wh|!1U)1}1mZa)q)IPDN&!Y&z?D13 zrAIY{JDLqWgepkkV_y)AU)rTIcQ6O-72D)x+tA~8N+4iNP(o5kdqVFCq0l<25MjU+ zHjRvyaEwKC%uN5$HeCP`Di#u4psvoaP4$N%JLU}IG-ir(B9$W<{xdQ=tgP@riTS$h zBPA#!Ac?g8kjr!jGG)S14RQP2sV-0=FI-Mveil7*77<^rQ-`uXMKx40@t*QbQ1+Al zbm;zqD{2XCZsx|&j);g5jdCmpykvtaTM<>jmZM&=6{SduB#omMFhMH^az50&c+reB z)L4_X1$c#7SYV|@$2gW{jpFb)F!e66b>ZenFXiZ_5@tID6ZCkBT&E*kF^OD$>fyR2 z9osb>BVimO!4Kh;k>*t-n#b{Uus-k=Nzsu&qz7G$E$`sPU>J7^Yt$aIl-;QCLOwu7 z!gOSCi3`p2mh|ebHm0u}VI10_9mZjJi`NlsHzD!I40ZGVAqOt7j*Le__LmR~PiKlb zPc|{RG2)g=OQ!Rh%xSaWqXf#qc+VGo(>Hy|VFj?yv~ZR@Wlkpbg_F7pXn|I>Vs0mY zLVy1xx4MD_ZVPGe^M5_HE7Zbm`pH!7Z_s{jFTl%HwYDo2?N%`D>Ocd#WRWVVPJ^fD z>RtnkhIQ0O=~b1TDli1O}Jv=QSPHOl#?leHTU`K^@e=5itH%d0oH}>KGFGZFzY!n3jaD0FEK& z6gbuAdhgWuUR1#zj(ca8Bqq*J$81pbB@)_!5i(hmH(8S-!IM9E92nsyLoUwj1h!tN zeQBhy%S)crEuvr_$(HB>FsU?1UZBQsqFY5 z;)Z4Cj1NX&MRQ2QDGC7O#XK)3-KzBUBrGGp&cB73}eI*+My8ud1H-i zvDU{;38+a98IhIK?VJfYxAkOE7Ll5C2D#WHWp*=v782UwB>Tl9m@kw+XeCd1C5a-H z^J0}9v6b)SX44Zmv`>CvC@75ZaLM8tT*F_7}U30x{>*D93X!XIEGNG1v@^Ht<9tf&=f8W|U<)S0^uNSaxJ= z8Us^8AcU0e8F!2-wB=(yFjpKHVFWIj5rEK~dZ!yNNy8Lcbg#IfIm~&s5sA46KTwIM z6jxwL6Sy_{H3`Cp!&Enki~=Sm{tNdCO#u?GSfmle;RSMuVA5lEc@W4kW2ZviZ1}y-OgJNsEI*ZY5K$JUyv6?1q)I z`hL@MXW@xx-%qUXBA2fs(7xuEflh2twSfh#RpX{WO;I(ujZ05y$GD*`Zt! z0ZXG*Hp*9fv4pjGn~gOs>%xS25jbFAs~Q_FUn*O7x&@36bVi_WwKW>01w^Q2FY9nM z(aNj@2B^dsKgd<6l24z#Wj;h8pvPeayhF9U*90anlDF}ot4g+IJHsLXNwMmlON;`X zutFdtt!xyyQddU;qESh;O_438X$Ne zxP;&o?oznBySqz*YY1)uf)gM~y*pp`?tjoH{fuj!t}*92T;sW~+mYeBsPsXg=PEKY z16)d``^7%&RRLqp=s@Zz%y>vs=bE^-{>1lkqC|KR05sG_zW1jb8nrzl2;B1oY}^s`xd{kS=s-x!Op z`R51&>d3BZCQ7&NkPnVG$DY^^mGO}g8p~ha;{?rQ^YPLgEhhkpdfS@#Qz#{l3FOi zz<;r#-8-ADpymbaK%rP`3|Nz`%b>hn-{ECCWevea)%EFK4`gwAymwp-Sl}=#wi#M@ zc++i?FZ?nz2 z`LsUYuI9RT&<&}1QRpj?MeeY7ytuiq=~4L$P)V0JK+~yo3}{h?>A9SYu&H10=opOrPkdkKqVDJf?A-^CMXVzvOp5&HE$%J)i~^GFuUldoR#!Idg_U z{T%{GB~7Uo@D8a~-ofJZ(MiEp^US|-^1(G={P*-tdZ?O@DTB=U%Suj#>p(4U`?fT= z7@tNd9V}!c7ZZ9&Ldh}JR1_1%?>S&YDdKp8CvtUV4V2x+8a9Tw@zl#-~ZOU$}u zP+|#LY)XV6|H`0pxjkDp;3dp)1T?yrd~g|g9747bI`bYNt5Sug`p>)>pu%b~ua!f2 zP5Xrg36DjSpR~c{N{d}@nE7wIsQ6BvgBh4=XT!H1&z+w96yi5#J)hn=sFM>-U=wqJ zm=)O9#vu36*u- zpi~(}3ndpo2epW*WlM#IMPX7hI3NWFbw%t_2)NKd{&spnHw0l;D{f}-m+Q)MPLmkD zFHqF^T4o;e9xu$BL&a=KOW>#9x6ET%7Un&k&*Ql36dnL4@E%GFsSyR*IANAm7^zlB zs0%KcF94O83r34Z?ByUGO=U4e3uEy4*9l8$Q*;nZ+ID7x#%8fMCB#@EWE1vM z%5UKS{Y^)eO|p2f)lrH9(e%4i@yru|v({6W>4zp||LqSKc5pjsbWS<2>>0lvnBfY> zS|Npk8-YlcVQ^=)m&eyGgD8;t^PMU(S=;NVvYVr57qUzB#dR>*=T{J2~oRH%P5ka72`i7+6-@ts2-Aw^vu&_ZJzMhHf5b;_zblteds13GZ_3Anb`WIVwg=#o1)J88XU z$v@~VDg1Oh8X(#ZpA_$M>m5}`%J&}RB+mCwuA&Dq{B(7{M#GOcw8*7*;SS5ZR7d}g zcB@>pi}E0^X6f;Aj(#(WG%Co0iZM}Z6;5DKRUCC0#nA%eHc1{vCFI*^fw2Z-c*eX9 zM=XFa7#gZt6NP&gG%)zl`di~jxZ$Bm!XV6d$;txrrRb_M^YrO@is#bZ$6Er|0qD#@ zH`2h!n0#qu2*-&ZeRlHGmQ}$zlMklrX0p5^a=@YnMFtomPkcq1iopqwSds;KJU|p+ zPq;#RpWn=esWA+XIacNZSC_Fe!&g{wn1mUtvDh8#QuTwKMF^Bi4H%vD2NI88jYgSj zovPm@IFaCd-X~kf2?7wU*LR;3)czby<2S;#rIjSLn-x{~-JB}U)ZdydJh9onWMG|YD%#TIC8Kc-ae=v56o{LK zP*}A>!PD`wf;EeNDs8+(sOP||5V-{>K0aEzJtc9hl4KW>GHNbNWi=a}v>F9|c57V0 z`>m}20v{^wlzLU`18BfRsQ@p}m>Bwn$+s?hruODW8^a(3BmLqCneo7D{M z1$!HYjyZb*^jSVJBk%2x`}%aR)~KQOTk*d!)(y3@P4OF?8hDIn##NIRO+ zk^tVzwZh#J6!-^>vp)QY;P9i;#|5U!1j>tqmBq=xyrX#+@O3*Y`<%gwg4^-Ayq+0Sy zY;!s%ixF8;PfQILR;?n@CE5s;*SD;WwUUCf?|C0{ITyzvSUobbhU$)ea`|vLRJ}<^ zXinayY+`bzwF9U4*m-*%)*KYLxxn0+&9&B-N;J8%GgO`?Lt=*A_Tl6^$rs2JNW;AE zmU+-gnWZ0dD+eFm=i|EQQhryf3>@hO+;M>EQGPRt5NA^-xN6xDwq~RJDJ{g+Stz7Y zTaZdIrNyk!DuR9k&q>Ic6K5(F^WsAwl0&>dYgkHn=8R(_6!<9ZR+P9I=)Q`u@zdBp zION;m{<84o{~vcj`@hUe%V_&OM_I*tc3t9r3<2&8no1E$C6bE@Xwvfo9bxmfHY)Zc zA6kaH_ix8NIi&EEHYCQt9&&wcZo>H#zhtBO8Uw^H6lB6F8ZWEAu?&X3nJr`r+_s_S ziKM)2hx1t6-m5d$QHp(Z*a}lZ4dxe4lVam)Xqj^|a~iSbq;p13**(+h%7c|g<7D>% z$F*z9;iH2n`%$guuOT1o>2qHpXZcrQ>*GirTmG&?pRZ`5G4B+IR#W#vHb|$udQJ-V zYdS1%INU_HtEsUY(()l8Qf2fTZ-M>(g`g2WPxCdIGXt8U&2p|PW|7gDFxY$ckzzS@ zN(*v+FC}R{9e>UlK86VqCoSY*^z01==7L!j!&x#ft8nhDHNH4&nOtJ)tz@ngq~T?4 ze9bJZDpA_@5B{-c#3}Ti~V+X8|RU3vX0F;%A_Hb!#U`D zBf(iUJA2jcxnngHFBvYJr@ousHaGaaX|rvj+A{YTliNk+J&+t0F+dTjk=Obj7((RL z_Oe~@w~Y7S#%-G@?{ndQP53~qtcQ=erRVA&Ub~@x_^OcEc(prwWCcb^VW1lG^kF4= z3FMsW*4YKRyR(vG^Xq`m5e!wE;$`w!Hu#DrmVM~If9jbyHhVi!CD!fHAR7pTV*a@d z?e=on;i4dmA;ZV~eO1MN-qFcRf#4cHU;MWIy|j5v{h&t5|2vaG^AF8Vk=iOyUAXe< zRXp)}+lIyDfK7&l9$dxzalF3o&7Jv+`WnnoIFN%S(~2|EXvqo>p1`>4Eb`O%D@JP& z-L;tW(xm;{(}_=KTbJQv5nq=l?!)Tpzj%Bb&G#6RDuB`eu++3n6|_9MK3ot7;v`5% z+s&P;2=aiAq+Yct?jhdfo;1G+%*T18XYIU=ng6*Mz0E3R%mjV---42wWLNZMNx12q z1uaC6w7k~oO{H zFiDqN^IH466WFls>#9wG5eM`(M9tP43VIW5ZfWl#Z%_1VD{Y+qStNmh87sm+lYK}%^t>DnH|>p>N?WCLY(TTmEfGUwVDnf|j~ z5iRiWqy4b8{ly`9!J=-`Ggs9rMJ3_;+cH2cBc%%wrO+gRog0Kc#?8o$%#P%h7)^;^ zB=t|ydM_7(ROK~E$dfqXMIcA5Z3uweNZ&4*ao)!v>wDu)IYN{|OPI6>m3$cPFn&n! z(w&9=XbPppkd@)}m9h=vw4vY9mt&s_Q~s#aSL~~yW2u{}?SC4kweoQxG~DW50C`Op zEmYvmG1DxXVD&RXKwpmg?3P*F+uDoHngb%l+zes6mA7E9(eo2rU*o($gHG6p=(e*a z$Qe~EyD?6%He{ukT8mgs0Tm4lvTa4np@FvYfsHn{@=Ri~OokY~wn7s`bp#x59X&KV zq76DoJC9Tg0mirOpH`VoLeHWP@a>1oVChrFi5swxE@N^Ua;h7i1hW%3kdU`1XR+0Aanen>k-8equlp4u&jk7_vl^WLljH3X!=;Hl0a&e4N>HH&>m?) z(XjYry3qyiCpEs9^zz)DQjc$jZ|x_Hi;s=9P$=LqO}J3TrOcZEiKcM^@W-;G-F;JQLTD z6Z;)dm>`VaNIOLt&P`TIi3)c&^z|in_M0S=mSa4Ek&BuXvX2AmSTh}L1ghXUh6E7^ zS&^jOC)f95R%yh!%HFxN6$08lkTZoyCR)xMWIH3ml+w<~u@`+Sp?pTiC2SA`YX5r5f ziFp2)&P97Be9sjI&!^=#qt@?lfygCO7^t#TM#Ar5nHmWdMcA=%scRaSWkuk_%nz*I zbnl8u0*V7;{$+UoN8#FAlQr4pO}&J1um>z<;(J2_O1SanPzjS@aHf#={rXz>#tD96 z#BkXP*J%5AMB+00pcW=rhA9A4%*pu@WmTpu(D0JeKAohak{moDKoUjP4M&vwgy|_o zdgMq8&vtS&p$HM5yO}LUKBEQJ=%(UKDu+v__UkCed63vXM)?p{4iOtV-HOUEu{jvA zrD{j(F%_)Sdt`WXZXmam?E@ppK828&%oC{5yOW9YlaYIHUCNkTf8=jjG@52mcSGYj z5%h#Ryg@3BdGz#rIKnt60@>Pp#%_!KvGN%aT61?Rl_t=x5={;Aj7uY`1%pF-S)^-K z9L;_^LZ%%1Q~-Ui#nTvdQ$}Stk~+=+fP}5A6cqkO1kPI%mc`0{ z>Q}G1Rw0Dw&hsN@R$Wg3Xl*e6@r%%ZR zVA^m(K6VqNG!vv4*(s&+#Xf%d@*!{sd(QSV7_lAW@j7A zjl#^eeFqVbM)jz6j)wYre9a{dp7MBzDGJO)4B6ieSmHDl(Mde8Qpie=>p#_ zfKtGtDMJ{1W}^Z@qd(k}E~m;gHXsd-LP-9ug^Rk>ClEybsczXUlsf7YZFCQHU_h{~ zhfPij$!4SlB>LYMXjV)exJ&J>W&5nJTuIP3#@mc77*vxU=qFE@vN+)yuPUg_nS0x8 zg~oZjNtR#CHSg6DS7n#I%DJNhjGIw)R;c#qpuoIKKZPe|2vPJp1m7NUyRKEK$Iz50 zn>`S4@5p(MG6GN`pGgmkDz{7%45X7Q1}oyJjmRBMu)RSWAw94m{G6e-_#xBTV(dEa zuljYwdw?XG*d4$e^N0^o(6CB)nENTc7Crp!Yl%#RGsl^)@kyAI0hi>K?>Chg4hjcr zUC`mp{2s-Z1Bx$4O~7rjB+=uDc2Y%yfO3UA1X;|6?zdj(#;=IX$4Qc3V?)y%e}eu6 zhLvZlMJ$afeoc&&PN;+F;`pHXMr+wVGNGvnP_}Q60aV@XqUz%@bD_ zn_Sl6@8c99^mm^ZKa_LcifVSrV~0>SLLVGA1rgHUdgp z;BB)U>pPt@4~XQShI6c3WwWojs$Y*0yggJq{`9|_Ls9G!mzA0>A`P{BtsIDqDWbY+ zCmh5`h|GyVpNQ8<`_gT<%r5ghVbOEC9CamH1mmQ|_}5oi5@@m);yRWndE zh6RuKxazE`Wev=K29P%_r##fQQ>T?NKdmL3_o?oVC=z_C;T$VRu7fCNrd1RnokpwO z81ba9agd``%%C9)*Ii@Z4yu+Rg!&qb$sB$=ubtw$x40Z=wNvsVd^Lys%~TluIQfTP zRqreK??<{K=W|m38FqL#;^z1Dx4wMRDUgkalA$xggbH9)959lC7q$w07f}HFA!b~~ zaiwhZ4>lN>{?Kgx zNgwvu-*wuULOYPcXwW;doF{73cVc3ZKDfo%R7*dQ6(-{u0%k=TC2D)v#Ohnn_5!yr zNCHJs0}oBKRsKd*jD``7+yPOd^SP9_y|z*&KL$4519#yU0okfY!b^i!KXwj1Gz^BR zF+F|o$UtE4;$wASH^#O0?V6a!e=r6FgKm4`<0BARy=Gb=%Cd152_mwx!54IPf_IW$ z&Wm%td{e%k{-hUJ%yo?4$Et4>ySc#XyQ_t*aIMD}KwpWQ?Y?Vp z(rZV)_I>4+P_Cw5XgVC_Lk?GUf5{}Xeh|781KU^RP*-s@2a`) zZ8TSC)b~)kdD%FsyRl0j)mH6!7r2T|Jss*jFHGm{#d&^k`dtj;*P|}PqorkwpM42c z5s31Orh;dw06Et~Y))1!k_HCC5a^ zMKAQ~60?)d2`iOko)zi#K>pt!N)rk`Kdt={Fsf+;27qpCG=_lLARa@ebOJ^x67t-o z{Z1*FM!ev1D0Fl>fki!xfyZWS5|@(i+X{E+2nsGiz(L=p^(ZdJKHH@Cd;8bVP3TPeDTkSxlP_EoO0E7G@r;G zQI|<2f*j1ZMxF86UDpxry`#?H_P{`z&0&Yd+#yY%IF{bAN)ns0*k=owp1Ev#rSxQB zpy<=(POGdXm4zMp*>Pc@Vx#ycU&z&ttP7qtBIwuc>F(eM2>nVLA(6qgkAw;}8 zb038;2DwY4{>RQ!j4-P@D~ggjOOm91>HUBLj-RVyNKwF=F3mEs`B}!IjaA(PmuO+F z%=fyRX05DJ0kNbHeN&#r=&6fkEvOlB0)pI@RM=aV@~kvEe(=?DiZ46Oa<(yLvupJL z8C~AUK9b>ZcfOje@Qgn6s5XyNrPYPa(6tiq%y4WIv|$^x&gp6^j&ty@=*))j>6r#{ zc5J%!atazLl1+D+q=e?Y_G5-)h%gH+?I>dH zwqKSZ;_>cMXw&M3LqrxV9>o;6KOjnU$GS>WaX-^A%Howu^p%;L)8Ce-2isMbfn>nL zN-3TPOS6T^;hXE}$?Uqw?LGlDU-@1T%WC0QKlO~~ zMUjov0|`5gKm5jJ7xRvWH`5yMc=N>8l~l-Y-fBBI?s`LZO#X{-7*W zFH{^Ynut6_BgIJj|9ohuaiRT@5F;grhZmE*%s)xp{7XkEC4AM>rB#3Y48cmzEY;O* z9CNd8JP7fba~Xza)G-dzd5>Mx^+Ht^%39Ke7N;F7wR4IxeTXDe?2v7XkygIZ5rYow zv{KksRzdtEy$mzj@y%oyokS$+DY$Pr^3+g;2y0r+ncO@|P3^hTMm0apxRpoUTlGN%@*86jmSmh+!tGv))6c01kit;=6}zaUJptK?CtVv!X}^QzHx0OJXJY z#Rq8*r7|na(p^e^txb`|vE`01Yqa*cEDe6fAD|ugpr;RkO>C`??FmiWULz0Z?sckU zD`DDekQQlLoJba^X|qD5>}DUbhTq(Bs0%O7plp??6>~1L2aPPF@Kz0%@!&dsxGlms zJ|K3bQqgAMqqTyLW;fPr=_EK7+gZUnD1UOhdiE0F?NrG6JDunSdL}p-Ww04jLflpA z5)?y5XPEL)ViC?}|AC#xj|td6rt#vn42;U(yN940u)dR%jGo|2q>*s)qCZa^`bk(W4ey^Y<378WWExuz1=HeMscj0etBm146AocC*6T$jRWff4-(e!v zDT=zOq5+4JjF-)bAl#3XKDuCL%IwWN38$#crIb%82$VnDRoiv*!}F7^7hKs9ZDjBnzGoasN^h|YH3Yz>MpVW`o+3j z>cf-zb8L;zNYq_bTr)CGw?(i`7GM(v6(g07TC0Ma&k1cv{E7I6tXgBF?>#WR^EjMM zx6_dfjUcOua;!ad>~24cZ73SlejqPZ`(W34GMJAK9COS6K5gaXKk|MgVslW_vO+@y4iy5qF{w9Delc$EZaGZven2p75e2%wtU93LN zm(iY$aot=pVOqjXwPO6%8{5-_-RaE^{q5GLOOGV&_N$GD`L>2seM!_BhL6aT0@PrT zMhJc@D^sK`>u|j{1(rgzg@38>6NN&v-!@Doz4V=iIc2l=Ny0+&fRjBhH6^LJHnYI_t5DJX>{pzsz%~6xmMD}#xy5o%fz?4 z?ac3(@Qpc4ZS)QQ?Pm0;{0iX*&lW^)1($v~jz}48J>ni`78_=)D=aCmp;=(V(PKhS z>{u65_Y4cUYB&A2G}yykgBXv(>S!XKRj;v214fy5#9L-pf8Dyt=Sj!e@d{$4T5r`W z^TtK9y3ZM&ohbY-4|jiF-JMC%qyFTHF;w zUqA82Vz=nWf%BAY@$={+lvKC!@?5_%y^rzBqti=09#F=n3Wn*Y+$ID{l`0lH`b>Rr zET9&e+0TXAXsv7?ebtsW9G0CE`r4Fh9EU`aj$4Cmji1}+hwU-L)Z^Dnf=&L>MxcAN zx38DSx1@u#hM9UBfkUgC5d>G{sbgi@cd;6fvf0GO94WXc}N^Mu=iVpCyN1 zo7DM+v@eU=RGTM%IC={dJ0pz`2FxytQBlCZ(1(73E70J`gori> z$uu0v^#37A;v! zf~o2#Nqp?ja1IrafyFGORBk23fGLTxLj{1Ccks4{6#7i0_WXNcDYeAX3&Mzx6Gm)_ zM^lAd+Jk?!o6_{K_#LNlM3`!q;ixk)CHtwRx7_%(6+?7VT^K|E$qrdNF;(jSY!4w4)#zLPX z)HwMDj^PYgtR(9m1;?J0(J^nzbGkLiQmex7AbtSSsqA{X!r##8upexqdW94I3UD*_ z1EJV5KTc)2+6wOW>@szO+>n7PWy~|oeC~?;ML71BNb?P}unr&iDyM}aZ!^MFp%-6@ zQjBkdquZuoRF`gFT4$23LUB((warskM_#X{`K7CpMzm#=eZo#nY)eVHRZe=}YB;<` zeZz^uEvSk58{IVv0KZCsoMZ5K0qf0g1@>h+_>CYvZNpnpt|2w`DjTkm6$I~;*PP#j zBI{gr_6%3>pZw{dvi;izOxgi1jsfD7&|*4bckR&=8%2_20FhDu>TTvra!efe2$nvz zi7<8YiUgyypqc+5(gB~Ke_knmMOp3iQ)%q4Qmi~>k*)*D*LS3u`!S-6a=CnD5Ny%m zks{5@FC#)K6GP=5GPFw8y6;R?6svh!7vpc!JMPMuZ`;Ou&S`tBHHYt2=u|m}auZfs zaMM}z2=r$E+R9De6SDo5p7vPaHX$lS&Y2HYC67LDg zVwam+XCKXv6~eWX3F6V7Ua1a=7?HoD4_ir2?w!M)R*PVOx}G!qM1;aZl?M3fF#b3s zDb`Mf!(mIvGM1F+52?w0VfJk*5c&lb8Oz*8g!2>Jx+bJB zL{0@oE@Y0167rge+$MC^c3Yx`nwSspxP6p$1R(A7ef8T+E^PuDTR?}K^E`09RY7RmYCH}#RYW|LcKz6(l9hVGhF znSM}m4D~8Z+^bOYU24W&M)`I^d)U%%>sl>Lr}z=M*c?VW)dF>O-ze^QdS7V!Y2Ql8 zmlz34k3bS_8FrRjcTSYdmHsB4{=3FK>1G54Psz?ITURo)y1XZoLZP*ua9-kd2j_8< zj!T=~K%a@=yYVX5#AS6Ltr8bXjRZE>qP_8U6Az+=!FhtmAGVmhG?lIezuXfB!$xVu zq0Gf=C8p3&o3X8krHBK*ydk95jIpk;>7FonS?M+oSvwzXPWcqS8b>qx6?ct(PjXM(EH2z#$Pm{F3nTf;Lzlz zM1dcAH>+$JB!C7Qykfu97tF-lWX^2sp3G*qNW_wT13 z&g#MUC6aa~WK#avXMeVnqK=dd>h!)<{Cr@t6*U`oD6Zu&GVW`xdLUSo(xkeOUlhvF z2HCBWl;rz-U6TSa@a~fs%o;_(X=CBNchaT<#}6CF3b+mcXBJRXA_S=G~(jn;*17La*0`7|CX@M^ER`r(f|1Rav#mEsX z=5NrdfVZ95zA~CSD_14g#tT#!|63US!wxv9tq3)YN5o=(#Flzt=f)MqBWuQ-VM^#4(xWzdji)R=ABl4sLh?l#=ezPon*c>m|`-@k~zi2pOc|NMD*ef`I; z=a;8n&yP<}508%z4-fbE|37#44|n&ExA#xi_rEUhpUxj1PadC+o_-xZJ?%d|tv@{W z+&`CIJ;#3g71H|{PJ@RZW|QaJQdH~p)B<@xLGud}PCtDDE$+lRZmyZisw=HHqB z_uT%kxw*NyzW&Gc&!5*iqoj?0>lWzs>)8?b*fY*~Rhc z`Qho=-qF$blar0pXpW#^95K ziBtWs$^MvuzQnfP%G%EVO;v5@|DmI@rlYE+y{^8kwyveNuBp1Fp}exLsH8eKzce)s z9u*xQ5ct`})!o979>)8wUskVjz&TG2~KgiloDtL3C=_ z2N9#uV0;ldNOQ?}9G<$BmxIi^i3AGCg0rdSQiU{#cn*tos$5JKll6?*OH0Lku7Gma z7`!#&OQDD&1|yGN)nchq8k@P39*Pb`t5hXlrJZdBY*1-~JKSCiYq09~LFLKhFlup- zt}>tPsNe2%Kb*1q4H%2=^}7$)nC<*vi9>>TrJNIVx5kSCup8uA^X%ay)2kMUb<3jT zX7W0JpEKq?0;N!rGpXg=*en!^)+%rsKUgj{k-lG$B5$>uBh?yJpdgpE-O3Ym*pTY$ zx;>mq`>;3E*L{DwP^wz^MY`BK47FZX52K~`*EOReqCkvvfI%hgY`m0uFj#yxm(T7l z@3SZK-z=$cD#n?%!O#C`pkl0I7!x`W8tC{xt{R#~9v6jEyA$q*+s)fqn|kjY8${8V zxfh%JN3z&B26rpixFkHTk=t>oWNx}-Z>|};4w)+)y4IDS8O6X-x(sdNLo49%LQ6)u z$!*dTMlOA4N}4GuIjK7z*?maYYJm+sv15-oS)(aE^;kI+Gk# zXtZ{olSzb*-_ar~Ro+$gx<%p7afaPb5kxA~TJ+#?>d*i2Z&`-O&^qjup}Mux7-GLw zvJTJHsWQNDTz%X(D+zO`sUr4cF|;6w6)JH=uwiu=r45)@m%4DiX6D#wf3L7h$b=}C zHjPrj%QE_JPu|5Oo#&8e4f$wMWK2e(WuqC6D3m8mFvYlbXgm4CvyKuSPrA_)zP-r zkIKRv{u&dqOsDlp=WY|j8p_VCnkm|V8$hen&!>0Rn-oK0C$=km@c8wvHwZJ5-{iBs zzy*r_0{c?8DRC(*hb2;^(mp+{W)&iWaenouk3v*&fcmLWi*tQq<^fidqSV*sDk{(T zw?`E=Q@6)yr9nm=k|L}R3p^J;F6Yy4u?}6t6nlABbad?x(&UIK8NQB4U+}uEMS)B+ zSGHg-9p6ELk68_$fZHogmcQ(gh;fAUNJFB{~rHEF?F`lRvAkc4YKy zttJZKeKWZDC^)n+4N`$On|yH@BU_J0v+qrVUX-CUI4djo9ocAj42{Vgb#wb$#_f9_ zv_oR`uIaW$4gELX3I5zsWk#I5SQH(s6@(^SYdxN0zOG~qG@>+o(&9@FJ36Il)mw}; zqs{nxHz^PK+ZbowS9BVtz;8yG{I>oO$w6U?bgzmhoIa0c*-RiC?-j$agA~+UB%rt> ztsJ)UuOK3xua9uxCfPQ%m~Lk*Kjxde1tD!rzl@CXg%~fEQ*vnQu{i^38O@Fqyu5Z*NzSWWzchHEQi;$m6S@e8cCk|SN zYjy(o?Lr35PK1|vlo!v#lR*!c-$c|&03JCH~win>AyY;YV$go zm@?o$LgNcBj%s%9x8(|qGiwP0D%?v1=7QQ@yeT;i@IJP4WkD^5eu=cO#k>l~s%myF z##0}i+CAp@8*fRm3S2+rAmIay?98C> zd8UDF#T^!i(E2lDG8-Q$B@1z7H(e)FFs#1p+AyW>_i4F{0VsLnb7d&;z z1)|w z({C9^xAJRARhea~>;DC}`?Y^~MU@iX6DDsmXc?2a1T@ErA+bl(KbrcI?$lOCtXqYqp*zpc5L{bBHX z)~)FB6w;eF_BYWuqu1WG@$0ue)nZ|32RH7f$s8d}O(8D$;f=Wv&bMKgKZkQCHj@Zx z5*z2WRi*xey;#h7DaYztV-LB9qPTMrkynhdGE!!g@&363to8VSzr0H;{cgnnQcliJ zchcOV%=12tyZ@OCW8Eo#{TzAyL#YqXQT0XBj9Fz}jbcH2EO;R%iC_0RZr5ejX*Mp2 z?T~WP-_n4|_j~5Vmlc;bA?Cw+7CV~Iy0n)}z3%{S^WL&BygN+8AH!~noyG&!-BgqP z^voH3xf=$5&WoPP>4`r%zjgUlISc?bhN@TJwf(|!;(mNS0S~ZM0dPftiDXC9u58)E zIC?Z=HKvpj4-g^f@3>X&Q?kn+qcgfKE$*yr7+2VjPED*|d?xHX-jO!;c78y7-=7Th zEh~HpbP5rBfb;TppQ8Qe;v~VITRf05~4bK&WLhfBAl;Xxr-czzgUF^!%AsPQ`nswT} zsghBIaHr@OAcdf;-zmEE(umm(tk-{8Tv(7mfg4=bCZGTf?lL#-5)JOTS4u48G}rpS+Av1bKVBo^i(aXcBU(k5%^^>uniq zKEZFxdHoqOCkYb9Bi+L69lsHY>Vabqj7VHDQ9r~0DECnG+!OVcPN=8KbjtCN;^l70QNzAk2(l!BvRdJs5#Z!eU{5zN0Ay|t*p zTm)mg0q=6-f^JioZ(ssi$dKU_CSzq5de@4UHiA_+z&gX*OEJ@zMBi9Fzg1m5mAreH zy^1GON`OnRi+851V4yXa&ReR#)c>f1!%rFYLpSkn;jB{(5?vZpvZ2CDA}%SaI|9J;!pt23(9wHFfS6SfE6-) zI#~b-b&I+Nf+&6_cIGg~ zL1_mHTaFuLhoFoCfBnL3`-DR##pVNIM8ZDck1*MYZ52{aBBfSwf(Yu7oGueLI6X7d z_POZ4DUk;l#idd)kqO+VyBK8}P)tUNj1_=B3|y9q z(dqhcuT%_vmQ1iTW+P{|s;~*)AWUQ{%*r5}n)DoCy!{XRcwI?mdfz8>*8^cA?$LJ# ztbD&;D|V;f?N>K)dKYko6>y`|-zziJYKyXUxef{D^kHpef3XP^Rt()pHwk+CMuC)~4-d-ykX&cBN z$chxZxR;D&U220Y4)jPC;KtpfNv)kOtH+FCFb?=mgUc3DM=hNy&7NgR9;-wacBWm= zB%S6UicJ6fp^rF@w;RevgYVOd{{i3GkJq{NN%Ie(y*Zmbu!F^FE66D-{NALidyHtb zi#BOFUwnd|lh8F+x2Y8(HdJ;g)kECT`VM4RA8g1&XeFmKJx-i(l6MbMcQbCJt~; zdrdTu2N_D5Vm(_Th%kY;y+z)o!6om?5u3@$XDv&ZYCj$p$2W>q{?~;mSnk-{!PiX1 zb`$!6zTphw+yF~6=_xmjb^cmCXpSBpYeUdo6}N&Z9~C&{k=f;@^aEL0UPQQM0V@p0#Hi&9=3?0<~yT>!x$qXmDkJfREysNuGQ87izWEA^b71m%k@!x?)`@RJax=WEogIJ;P8t z2Lqhr0>k4F=C9tDHQc6*K4BL@E>S~~wM0}!L)c;&S?}K=1rEQMG(qyriRLOKvxdpy zNj?(=7sM5okNOtp7HnrX5#^E~&QVB{dpN(*dn=>v8Kt(wi?FFuw9UG*ikU%Cikr7T zPcM!x(9SJEYIKptC~ii?YQgMHp}<9W4?60uyT#YKc6t3Ye#g@IBe1-4inJ55)a$rj zAdpvT+*U023bjrH3ABuaT8Hk>mTz0OB(!}Cuiv@GDB?^?#7vZU~xnk&@k?E-{3ogjUP1&h^1g|Hj9MuoAI}t?5VoY0`|qW_#(~`tl7#gdPWNO^8)FuIA5LmaI(x{ z2GZZsb>u~oCE0D9yb5%OA{FFuk5NJehvyDlFGhXK(nq4(6mQ}$P#wW#lgSGUxNl;C zZ;N2;+~CW2i~JW9lfaac39mEple*0MTk-XWKi|>1fUe)KT)$j>r;=bB0(!)iE3`q; z56c%w^8-M8pDgT^;d?HXdq%dO)=!04->DyXF$PVX@w@Do>XKH@ZjxG@Cwut6`Kewt zY?$XEQ}UCv3*d0!uZH}&Th6nY7LC45RQJ7ut|Mu0s~d#}38k73f>K)@T<92}%>QBO z%Ns59b^C^TzM-q_pH~9ZgL|M;;iRx{5+-QA3rIi1euBcS4Xr>s;r9(w(25~^&WwOX z^Y2I3R?lZUs~o(tycligG3Dxro=@~q`$=w6y-Vk-Rb>7s!N%D$slAO$az-Q(RHEoT zRE?jbN&odV+|4gKTGBhI{&HIaSw0`dAf+W!del>DpF~OiJPN-56Th>=<^9J+A1RC4 zzqa8@;^BJ0#NZZSz$2uzyFqdo=eGFp+ta%3&WujsQJDV`@Ii`>>8U>Hm8h=U_dz?m zZc$@n|CG6KKz0dB&qiea_5TBJK#;!%OPs|i0|tTxF$g3$P~gIa1`{%bh!9~xg$El#>=02QLJu81egqlP z!v_x-J~~86(4)$dEi{zm8&2m7I7DWoRZQZ_w+x7(9xoJ<_#hVvJUcP<( z-ZfzYaNxitP7p?%Sn*;NjU7LRyaIA$$tx=~!C3t3 z#lr%d5wRKxyK%9=8rx9?6F37>Gs-O6Y%|P=6!J0BKw~mB*I+B{HP&F8t;*PJGi?Og zbmP*u+l~v)IO3F>&bZ^CLo-b^o6|0Y>fGEePVT@X{^`E<=DRabJ@ zuDbe4OUArpg>f()6U*_|AAg%GFTQ^2)5YEcr@X))ta1g%FnE9R!V5EY^_V* ze!I4|FoENZ+v1S>_RKZOylz}Jr@JmYIHki*PIu`H@6z|kn^&WHGvYJf_7?mJUwj9m z&(c8qt5ib&1lA8D18wRzBbt0_DkG-;1^7V$BTV$c1~0TKr;3wOFw>t#_3%`aNmMoE zR_98ARafQGt5%r-v(-jj74wl-ohLK4*kODAHWo6^j*K$3Wnm+&N-C$F*4o{I(-zw> zzYRBBbJr{vyLQ0KszZ{u;(%0APo_L9l`mh>RTJ;peCAnU6zoS`b1jUq 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%0D!ZVaPJ8OA+Y^-HzcoMXQe!+SRi+k9e-$PLh3n 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 ??4P7=KU4D^i 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 Qf zU{eSK4$wBe(Tu|&cAMrLXJQkiSjD3AF${t%gB)X!bwF0K^u#A+Cu3O%Rpzqu-0WsG zvzdT&Hi(f8h-Ci(nso$mv;YwZX$tZK)GE|NraetWR1=ZX{vaZ(S%$&S6usz$ z#SD8G8|lRMk+Xf|NogBWnWQ8ozER5zQbJairsOs(VJUBFgu~y|!oN9Ksc>dWT$((0 zrh;g0PG6K#XhfqHKK03R-3wHa*uXY697G_5LWAcN$&iJRZ4Gzp!$Zb~DTho24M(vF z?p$(`F2tk@{&pKQ~G2msw9d}e1()f81Hz!OJ1&C=_{&K#d*23iu7vq%j%io z4c8-PTe63ixp)srXmJ+%>f#vBj889j`D0<&Cpd831u&1XAO7MOnR&5`U-cRdUjWBH z(MYC#^AnhB2A06qBw`S>fu{nG^FRqgP&vkV7zCX|LF+sx5f?y4RMG- z+|UzCRH79z(L_&dQH?J0B87P5B9I!}877GaGx*^RmsE)1+VG<&$;C=zR2CoOcBQ?o z(G7F{v7B8-Lzq0wnA>sLx_GhjDiy^U! z__&OO>_J(4DH_7~oQFU1(N7^fYBQScCqM=A*$jhb(gr!`5JUR|b|9p*rEv(tOZ5KG zOjC4~o#J#wRyh$?^gt<%>^a+=~6P(I@UujD1>2m^iUv;N@05e1De^m@K^kj{}{)ht`!{3@=yxz5N z8rEwHmUlY?MelisUHO6@dxqI*D6`}1&=ImH+V`C(M(?w26}s?09QBXUNai2{7sx?? zC^ym=4AXN@?cD7Sk%dn52Mx#DiBI%{ApY=SBsOu-FdCBD7Q!fgf25IafIb@#L5M3^ z5sYxiL*AONwlpqT$TXfq9bhf4w`dD3b6nF|)vzXxCs|7RvKJs3lO!dF{BWLYIm=nT z*Sz94L&1^Kfrw4IIY%Lbq1ZV$`#HxNr8NV(IFmD0DmvU*C7^H>JZn17q7_`46+d$x z5$q)!`4Oy9BDIf?=42alFQJJn`BmiII+hnmmjtAk0fP4Jt!# z`xyI*8JKwwXVWi;iYWSOHkhe4jXDo&I}idRkO9k~0n?$QQIJ1W5D6Q^C32c}>!GUg zgAzF+CrXhfvI?!a3O!H|uE7YN3X8Lm5=dbPPDBGWSO`n$M246XL6CzYiLoh3mNpP0 z=_{%+avRKP8!IucFDbvfSU)*2ld~d}v%(`H(;SMslV)NJ!il&zX&XoCzyDK%EKmcI zc*dI}n-VKCk$|LGL4!{T12upwH*>6?V>2)C0#W`t6~#gcq$`Tsu?bXJC87hKs2CpP zVI@7gC8z@y7BQ{SnhK0imb;moS3EgpS;4q+mg~Vm-q?4O$QUfVO5UJ!^YIr#zYVkVBXWu$hTH0-KKk z!^55-8U^_oqVY;WoRAEeFhe{<6~V9-X`-95IvCM|o9cr&P`(;*BDY*VCqc2BBMFwn zk!j>a&2b2j`=T*2#VSGrO$-zje>-d9(x{f)V!xJH;%f^A)E^ zPNsVmr^`oOaw6z#o!0rjSCmqTD+^}nI_=rc?F1kC8!o{a)ll8e^XUt~fF@|#rc|TP z^_x#lC1W@JZt_jko;lL;aoftzX1dma#1w{l8 zS}!s@wnLaG_aIReingTwl*;;o%5Iez09zscpuO085Op~{Gcg>!v5QA@D^uK@x{;E*;v6i~tG#klm`zQhn$yu)2u{hy zZFDm>V~N`g+EP-iE(im}`prZ|GsQv`%2L$gj0#yoPUUpRNd>{t8o^=76ipd1gXPpt z#n@z`7G`-!WQwh3;+A{~AF@qVhFhj>fxB@*yYn23j~J3+*qKiAwaa z!xf^+8-mwAAekF_uLnWhl>(91h1b_*(Q}I$dNm>nJE9>Pz7FFl5|NRpJCaD$8m-}j z7n#eUik=tQN75NFFLMK>p+3E=*}mepQ3RbOMV27lR5eN?@4d0Dt1UXn9?L1lvTDCB z?NY-MRGYe)v}V{H^Qo3Fta%>ySbbw36v-mHS@W~@;L+! zx}k+Eb(9^VJEe0>&ZRh>Rw@dnxTWFoGhopQshge>e2BHdx`;*0PHio>eHKr}*eYcU zE>YW2&HmUHBnwhSLba$DX!1ewLC?N*vb&`NM5xtSrN52jm%jzvFC57vCP~VZj$bRh zcjC{+o#N?WFY7>{?Z}SGeNbbwT$A!3(bKQ}zz;RFFEgGm(N#**^(g)*nn1820r5(e za#z`%V+gt9b6Y77xm`r0usqPPe7(^d)dQ<@3*ya#dLzMK`jHqh13nPpnac>$F_Jz& zo9Bz!yn4QmYaC6~L_<5dD6QBkffDU$COC*A%rPV{71@zRE08mbt{O?|M1z}_Hkt{kR?^VGa`&6;jo)t#bG8H>y63-SC$a9&r8?Llgoiy`QE+X!qk;L1t zdaKdklYA~U`m7)PbV&;mJi)6V$-7U2=}#)2Vvorn>yXx=6t)d&uq`GT_qdMuun*7O zR%oLSi2^-obISg@wyPx91X<~IZCwiSA>0EI2{9rDgD`sa5T%)^v<&1I8Qwj}gObSu ztAhhQ;3?Gl3L&wiRwM(1gW3BPz_bZwG%zEFyBj&F*g~2UhNH3C@+~SIobW3$R-Q~> zL@O*2E368QIA{X^#AURxU%ld-ENI3otJ%D)SuYFVnP7-dfr(EsiBe&+2n@&m$71Hl z>H`uOfe|2qK2S$fapu=Kx^{$$q;p50U``JVK@Sd=t>}t<45qF{%!pG#DZ|c18{4)R z+wff5u)Q8Nnu~BTuFrT?Bm6Waw7b4-G9Rv-J(--h;*)zhr+|)6BVNKUj1FH_;wCPj zlXT+0tC+(juL*+O=~xc!kk*ai81*8<4T{hO`yg=RXz*aeXX_8qgSMLq*Nz%GXkAt$v-L0zbheuV<3U-2|L@G79Kla^rimHE=`=YQlmG} z1F(~W&9NiCf;mpyUo30W)Z{WRbH;`6G80RKLVXFo{t4OK#@Q5=*;xrcHD*Btfoc#3 zaj1qWzj6>DgQSh%;EZ6(PDg9TW~0?$;o;y)HLcFp3K9EJ@JnTK-nu9m9Af&^yg8;E z46?WqhGXb+KmT(;2XsWprfivKeJM|iJB{erms_PAN5>0CryS=3$@ugi%OJ^LC7_Yq zbd-d`gNBYzf9{8dXyTv_$qPedd#^HFu!SNTV>3z*>aY9~(f&9+n~9HVlMneaWAsMv z5rw^VmE9d;unK`1nCc;8pJ|v{un56}7472+D-i%E5hyy5Nd9!5ef;bXE0N_5Digej zhdAD_P>4-zO%qe3M#8y)@S=a@a5|YIc#o4gI0h>h1}Jf~@~xITr!vGDYmtRO#QqHMf=v&kLt?M6u#x*#RgV;F&27@182ndG2V~)T-?bF)?l@Xu@Y5;-8)=euM^uaimPckrn<<3 zydVK_5C*1idZ%al4Eo!uJ#|A6LJ)*@Ln55g5UijP1J4Ssi4hs8 zk>w4G)CVeXMwYKwUWmvdOO82)5FJd$<(Si>FDk|;&A*TXfoz}#VOaXDnk~x_NVZTC zGTAtPCu@KQ#yyhpD=B!-sRCSf>NVZvH!ad?6bL8EGIKP?FtF=15Cc+yK#c#!KJ5ZO zHI?NDfntUU5D*6tn80by9e@BMFiaRR1`iq}NDz!df(a2q93xR8nTllg?5T)x<3=)N zK7y=x#tcc4XU@2B^X5&;mMT}qfg?vwoSJa{ZoauGM<&ggK4;DeIwwya65@K!tf@37 zOgK5=924d5-mCl?xb*@&eb4TnQJZACuNt+hYS)y*=zQse8j@heh{hU2p z7SEl&e(xkglxVQvz<}=*7HlUlB1C-?*@--O@M6i66DgXU`7-CphCF{hBziPy(S{5i zIxQN}=s$;Cr#=)&kRa88OcNTUThQ)7ynXB5O?yzG;JORtCR7Oda^!?^8~06{Hz7f@ z17Qc09lLex+W~8>X{?ckh8U`mVHy`|m|=!(keHGgEV-0oN+r5M zLN(b41BX#D!Z8O>EWJ?^Oe?)XB8hBN0VI%B5J}{aK?cbN8$Y(Oq8n|XxJDIgQ0d`^ z8eS-3h-#>jMwcLdY2k)xNYrJQ8lH)UKm)C*1{hy-@r4&(z)2^aaeC2(7klp6MV!K9 zQ^K2euF24wCBRtd7XmHHP(xv?=@3K-DdcEFViYv#L1TzPkwu>h*pWvVUE~oN4n{bk zN-6Q!QciKak(5(B#BrSYw1023TQ?LAF?D?|#muFE|EBgFyb782$VCrk!!GW;0WtYPN~%7lWi!e zWRX=^vGU(>SD9E^m5_`_+KL!9UYCt?q?m~x^ch>9I2hB1^_$gY!}k)cOq zB?}MCT4qE*kViZ;TVj3kz=tRDfhbShS$zidM4t5_4*?R|75Si_{yeBblT+GANCGtn znbATOqFRXlvXF%kQEh8isuJN=;v-kxtx0VFK{lu{f)%x4Mmds$jc9T{?4<+_gVS4) zj#MN!8VPWC8(bT{hBr1yDGO7gQi!VLAy0b9YLWBOg)|pAGr38WR@;Iqx#TB5-RYI1 zE1eg_Kn)NOicW80ouS?Y0&38SmUCJiq;RJxO!=-+k&@IgH${et5D$5zx(KNd6p}Jn zWJ1kb$*Q>7s+V{Zdon2>O_22yIT+=fxQa=!(q}AO`2<<+iyv3;AcwQi0esnV%UReW zF8}Q_4}{bwTmYH}{`KXb<3bEW86&}Vooik7Qdb4vg~88+ri7yzL?Zmfn$;}qG$Mr! zX^j3Tn%e||g(IxZ4VMF)-b_b^52H?Wa>JX7x%8#NiK%yHa|l6%2RkSmV#!hpv-PwL zsp|0q&HMm}B{H=>`+*{Xcs3x6^g%ya)B}LNI8{9mWs4q(nwTtA=J1MVs*Gr4njtY2bH}PQmwfYj(i0o{g7qq;@I+VWJjzd~r~ae! znePqjLtj$l8I-TYk5}^>iX8UYPk-ViTmcm*A%_CMxE$1<3e}5W9D|5Itcx)4dg#3d zgBZ?O^fIUEXh%6%!bA{4V5O0;YDj9r6CMIQso_pc4?&!U9VcQFd#S`=Si|VJbcPc< zO;1Bc#6J|ZWF|DvQkA-%^VFEBYGG;~r216?_2-FL4cZq6R3M>kl~fTbgNByoWTrWd zj3!}g9534;HiF2L7P{MtP(mWQwZUv?BLPe9*rLDUQ6_N^EMoI`NxeDpkwmgW-qw(} z5`D-=M?xGYtCYAdVOF!F9g~;7An4J0&Q5V!G@ZB*OFYrC8X(vcYrn9N{!0%E1l6E) z=_DmEjsCFY~vb#0=~?Wz-3 zOd%Fi*0(+K&P0Ax`PNVnm{0pwrJx0@RzJO#!fgk?hhg1Q`flSd=K~W!g93RNR z7iAS#X^|G?%t!E?g~*&4r3!<9MB{u&XKhWNjR}ZwnHx;blOTd$NrjsUP9ULKH{}T3 zphzB-S(D^VBQ;jvP@N{hnPj~gW9<#%h*oGJ;n#^0Xtk1Rp%&V`5-X*aYN-~dQCb%m zg`N<~n{eSW1)eyNfZuuA77~P|jT&!(nirzlF) zD2&22OmmQ!Z)8mU%~T<r7nL*EJRaUiE6iHEntkH*%)rBYsf{z4wY?>^^u>-fMky*4Dx%_QU?2AJi$vw32WgZ@iN*=p8^Fkh zcNh_Oqy~Ac&}=YFP6bDV0f$Hp$8;bJZ+s@mz))v)rgU&e`B?{JmJE#HAH_u`j?q|- zMHPJn2!BAJ9uQg3m;r+Lj8+j@&)6mvWl>al5g$+<2Tn-RK+SG08Ov1&(r{oL`QzeT z4jZMxBBl{M8**McY^pC84JdN>-fl&D6P3-)!BTO(Y|QBo>6- zCRI%5cERT?8l!1pOSWX(b-_&5g7mF%neztlUDi)QgCH> zVVAMo8g=DJth8RTFk*YDmp!=!0O95G#aCV&li!gM7y|tvqi7=I(Za?b)P}u@hotHcY?^IUapP=;qmXe`(9q#k(IJs} z)qVs`7WJ6MWsw|A5jIUtt8UF1Weplh2y)J<&LxiHv=x<*$kz0&uLjc472P7~Q5%TE z2bA9392TzdF!kiQ`I_MavH2 z1nL3t{vlBDS>l$0V$G^W1Q~*Qw9J>1>3=m}DYl!wgjBl`Eil>}YCP?Aq+c-RX-^@H z`Vm}c>QvSm2Wi&Eq9&?n!k@t8Vup#wrPfEpoo&s;Fmdk8&g92`m;vSO!4n}*gy1Gf zKnNdr98qM^eAtKos_3jT+0;M{(g-nvFi&z~3FNfymw*yLZrRkN!D5|FHI#sz;msS| z!5mQT2iVOUEJ?7q*?0bke3~xkwr8}`SrAgIlDL&cs_yFkAZKNWC~1Kkg`FB0p-6^Z zfhwV&jO!L;0orMSf-a~^2I#uR-MV^#q}diM#fj+9iKc;0FwxQ{2h-ch>!lQ4F;N=+ z7Yd#!2UqkWW#fHH8$OeTjDZ?KXN#Uh_l6Cutjaz4!Nh`|ubi)q&W%c-9{ci0jmAV; zHX`ux1y`8t>*3FP=@%yIK~Lzx>iNX|cqt)OqLWq&H|nea=B$@Ou$MmY&PH&+wD1H2 zqhi|P(^^Nuom5ac?ZIG&#YpW8^&3lxFh9Q^OQrB<`jjochIq(k4a=~l#>ahlQC4}; zM*IiDlEDq{2N`%A&6z*^;2aA-G_VumKzp0wSF(Lo6(LhQmet|$8i4+87GNtM z^BHw^>sw_(AR~?z46+)0H6a&rw+^Tll(i(IYigl&OH#7BzLxQ7VTX#&Ev=S?&d!C> zj-`-V;k^lL5hZYKiYqrI!6Fw^!WwbaG8#N5;YKAQ-dgk&i;$M3O^ACu+yUUqH{4K>ySRFZath z)c~gLr0y7e&(_Zf_L(6b3S>SxAA{*4SvC9MuMBTMa2{&tsoqUsxH5~}$fZT{^k zd8cht#Yfui7!m`*eDp9BAu-YXN5@IiuOkl{okSeerUhQ06yfGe+q8g-33U35(rjIn>D!-yq?gmkSpjG5P7=Rema>#5gkE2olv6nx2CVeXAuN}uM{MBBC1+z_-j6!Ttdy@Xzd2^B@0>%Itz@h@ zwU1Ct#rI^(eyKKE3L-phbNyn4m0scjeyMJwvurN@{qjMun#SVKR=Q%!TXDZLYD6Q+ zNcX3Y`U`#L)_NwPcGy6N=Dfk!_$3h%Ema?UBdx=S{n+*r;qZGDr^XoweM|9@{jd;Y zQ%UH|7J-!oHc?Fwh(KORgEPCzM~E3ECvOttA*&?7oAoR4IKV@4fF3-N z3xAMz0icusfZCQWA&M|ue1(E?C_`v5f!gz43dplg;X#C?xbmkgm-oY(!fxO^P6*gs z-kc|Mu(2z&AkhNkD_i#|lquAb#9WNnmGUW}FtLAe(#lIR z$l%FPXkut7vO+yiEd}M(mLw%&F+>@0YvxP1&{@&#H5fE2=`HI1K29BIH{y^z=WZc3 z=!Sk8i#pN7zb5Ytdd_fjm~hXWc;XI;GA{T^#N69Luzs=>bUE#4F zh~gxk@xCo`tM69%&TF^fcsf8ApEp?~oc+v_`)E65yV&9OEebuxaZNVn&t2a;^P*|H zCG^`n+Vo&7K-WyOQW5_|FXK~d7^%PK(ds5?Gt@lt74KTF#Yi1$tnzq!H085hW;N%> zdeE7p`(r2`|LNjn?&DYZ&%taaeVzyAL#WW9mr+#kIEYdL`f`Ptz>bDnB?&V~m?D8Z z*aIFzW+VkCa16!Vjd4J5EygiM1k}fI$Idy>u;pm5WH~KyEfR>QC}8EdW~Vu)$Yvy9 z<+^D|9@u8}gr&J?KFwXB3w(Elouw~*pB?fyL{MX3kH>~9vGo4Mo)_46eMq#3NL^86 z`X=wOz&UlSfgx~`Vu2BQm|(Fe__UVJF^cEmaij81>!iYHRZ_dS{cxT1Iif(QVf#4NY};SCq{?*VM`F zi&9F-qQg7X#+`>@4s5;O2bI~l-z~P7Vii%V_BLCFR~9d2CITz zK?G)mAL+w1^^ZQ+v3kb`6_GC$>5GC$CxKr@UM!zJ%AR#Rafl+V!hRG!v*am_BD7+l zR6@^_*Nhc`_gak+;KkF{`h-Wmlct5DP^qtL%v53Ib>g*IkzlOoe^HzKTx*3W`Mvf6 zy*HND7T(WJv*B$EKSg}}7fOBP=-abK%O1NDX7ls3F01!k%?B3I@4x1_oNMC;F3pJs zUz#xk)o{%YDZt(%pb%S%1q-S%jHVOJ9To=(di3{E#A`Ijt zNf^F}1axQ9@Er3Ok__lSIxD(%)wvWL?i}MYL7wm=uLh68LMM9Ll$+=40A1mhM7K3^v7VEHs0LpL^kW17C$<7=p{ zer?w4a2mTuBy>W}gi;q~Ic?ax7CtoS?%iKmmd#ZIZvx8D-M{o=7kw$E^H>@iT--;9 zJc%?fDkU7bp~~%jsYGu`oktY(=)la94J-6B^P=e^{PuH_mp*dAMUQFh`?+i+J+&&9 zrZ;KwGuT?JAQxQUf^huuWGy0Wjy*-qL-*`xr&d6PpZDDHwl638He>Gp_ox`Pce&1F z3l>?H0|wi(Q3~!dEOMW43U$WKiQYUlPQGHQd(aEQYkrjg#FlfGl%@#H8Uk2?L^4pP zbceJw>e7fF{s`n&Gpbcn_&L2%UOtc1#PFiy4tmX^G>(8eO)~`Enn*S^byvL%7S!^- z(BlWFW@WpUJ*O9IJ7nSnCU|lY$-^{%{Oyeyjrj91E;)}PoQ5kNS-d4iw zQ$nPu4jztfXiuC2Hi11&d|!U94~9IuigZ$p?)k}^&h-$)rjrm|o|r^6Xm zNhvTwgkfW1EB(W^M`(gbbwM_PwETuAW@($zb9AhbdMKw>g$C23CWick zo5p0CBZ>o!(IPHFLmJsofSH%E)eQkBe4A8n)P$|IF=F-f*iuo`L_erLPEc5MJ-!$ere>|X29M_%)B99jyOCfdR#)v<)#k0Q{G5G)Z!^ShrT;f}s zU;@Lmv+>Gr99ZjOxuUioCFskGsL5f(r`LK15g4T+CG5e&Y0E&E5~zH=Q|29LyFgmD z7G1mWGRQj27d;bPe@$BSmc1*O@fB3{q*`(xh`i-V6qe{O3%Xgod-6RH{{sba1#_q# z|6@6ywg`IANA%oiOMKtcPkxvc*Rtx4V{md=JxVZGv+DnbByWcQ_-*f@{7YDXd{Zqq z{pyqTe9(-Nd(k__pdf#Y)>yfb2G<;Q-9~FvH8_sAgBjiUooE0FJ{p7VB^AXIITm6z z%;l-}Kf_WooLJ#VWpn=Ig_n*C!zA1~Q{%BxKlDd*y#@pS7sA2ijf|51B)0;G@MzkF zn3!hcuMPd@eZ+^Z?4pBzIK9(`O#wSfyFa;H`WFGUUXfii__cV@ecA}xo6nHD0>vZI z=j=Y+sg~tj&(GwabZ4FzsgosVZ}##xaq@7dVM&(fg!AX$=T*kv*@ZN!rpU_Qe=d?c zC{7-?2&jFnxlw&?2pvi?LQu)K@+sCi?LLkfTCNsd=xCB zt`5BXW8zp7f^abT(e|fwoP9!VnDt@Fv|Zb|RFC}h!x2F(%5k0j`|AKYYI{5#_g{*- z)Fl!`D+!RPm=&Ob>_y4^MM^$LXntav_qOEvE+rRy6UJaIPkdSW0E0n%rMMRX$M5=8 z1gwl7uZUmO0&@kUewY4~3M+hdrG9tyHWIUIJTV-Fu{@Sz``z46xWKW z85~*!RTWQ_J2t(txdaohD{PenmX)I8n=RcBfDP{pb+x&y;CF1cDNKA+j95#w+JbY@ z9cfW2)x#Y7xQt7&H|cm0=lF;QdyN~y83ZEEisM<7+2d)>Gx<{kj5)Dm;@>r=U2e|K zs-Rm%xx+A0Ol!{BYx(nr#RN9kBfw+7LFpJE9~*c5xm+q>r;^d6ba$+(p{A^5lcmU< zY2ZpBhl#N{$}(I=c^r+sU3rK<9``>L4V$xN`Q>V+&Dofo;sOS#ih!nQy z=7p`7g`rfB`kO@hSufBIwji#~Xbv12k%m27A|qbeJ%v03w=I}Fmx%wHV*ehtH_ggE zOTit-#SO&lNPI=(Q8O#U9<6E{rs3gTYT&`KVCJWe5UJS>cERp#<1rmGCAQ$#vaXoN zX1!0W-r)LUDO=t4H5y@YV)*0VEQ?r6N4uiwxDA(oD;5Op@^yU-;#HR%1QpX7s?vOL zM3o3!M>WS8xWuh!GQ{K3Ri2H9RZc>WrxG|WzRsk&)TufanDh5iIN`2&#|wHmDmpm) zN5iR4;7GOUi!!*y0UACZ9OY9>^&u$R5=@#vX5;duouCKD!=9#)7l+UnHFW}QX2*rT zntB>36`i;_;ny2K7Ce9d2}YRafPzt)_-NE`ntf1HElh2#5j8{q%AlV3&-hYa(~s~gz46#+bH1qdtL=7;;oL)++vK}jy~Qhvx<}=2BgesHb&cL!qa_gUolzfTVvGm zN!%PLql77Cevt?=(Z;B$gl}&O_J3drP7B#9W5-7^VT1jJgv<5}C}2~Qai62%U!v=M z_Oqn*=npw|t*l=1Q`s$h#>j%-O-1ecrcExbr68>-N;hMyZo%e(Pr|8Qse zlQM0zfM>hnC7e`awE20CiyLa7?CKP8Y*ybWTmRxg=?S-E7mt0k}ZC})r z)B8uJNnuoc7j#%WO_os9St|JV4EAc>&s$EC^akQphb1~L?L{uwlq4>k)3%J+#RPw% z7CB-L`C;XNf0Jh$*XE2Zr3emW_xBc?_b>-oD%);~^J}R^aBe#pR>lffZ^v|I)jI79 z#%=b{5Le}d0^kd~PMDMvwUid_56 z7w^=YU)8VUw#C|t2$-QHrZQ}R2R~2*t$|s0n3qp$3;(_&gWHUsC=B( zGjW@aMXkqm%Ze%y#JX^4mAYwHb!kCx=>&H!O%LWH88Dka-Bn{$^CQT3 z_5i-CwaiCP4j@hawA*MtUI3N#bKI)YbN0`^$n0wYG~&#%Z>JvpJTw`ux)Pf0Yk zD#!|~;a)N{N>1>N250HEnHex`|iHMGR(Qsi0XuM~~OdzagLNDhFq+ zSZ`z`ZljI&WZ1XhcP?diSh9E{EWw}0Qvg{r(zs}%D$c4lF$|&7Mq(VY24>`J16oHY zkJRia$Imha`*BC>a=|yDsF){#5p5E_p}%lP$$nqCU7lic zCJJFU!}N_;{LkAua_(ak{F6K_>F4~!H5Bg08fmFxMH0TIg10o*+!WdLbR0X2@(4wI zht?)b%Tx?FvMUM1=oYHK4gB zsS^cgc~zn+N#!xTXyoEg(!U6MQR$do`=d19MbSv6=2>o@yDzyQ63n(a)xW+mVA%OAE0;fijGSWDf( zWkcbmfT@k-!>UWW@50l*2GBSj@hr{;8k%F`)lWFv3b6)$L^{KU7|z3htiiZhH;>C9 z70;A97a@l-o&nZZPUab(z~u}jtt{n|B)A_u=V&&nyT?H|s7g;AA5S+~o;R&;YsVMv z#y$LkT{oI?2b#Gf>7%xrn;lv{XXPobfAb5>fOV~e9c`ayqia$(p}IZ+J$mZ*>Dus1=H8QOc7GZlTyqeoLeb6d6j z{XbPEt%Ygoewt!!dJIRS z`izR;+cE zDj$ua!c=v!Tx~WfUnmrnu+F77ld){y$&}Y@x*DiL?d_=7V)`{h&|@+&pWkJ#FA|o2 zkwn1r;BEM_g3l=^KT@7b0!j zEfrz@y0DQpv@NwsSJCmDz(-`QNRbTo=Xo~~m~^Dd6M3~pR&pmEFU!$6p`;No#(J)* z2wdQ%E0kYW*nbq8fYTyW38i#UlMe!AHY$x=YBiY!%B<@cm__1+QI|!^He032;3wL$ zDp|xklF<$XO(b(h*r_>ObFD7Tl}n zzGpd1PuY}sRpmJ}gZ7An+b?7boz@mkNnF1;=^DCC9ZVLuhs5X>crTL8=X+x-ITpH4 z7t$m7{YX?c@jZ*RnWminH}X9&=I=q#{Pi-FuXz6XWaP((G7#0SLkJ7QZhtW38IjUm zZ}K1v!9Ay>Wi+o0ll@pdeQjUx3R{gTP}3Hc4%x ztgE*@yy0qV>z@P?4H>LAw5@g9{`_U$x~^liPvxCW8Xx+D(Ac+EozRf8%WN>-IrYy* zr{A{|f|p>ct4+(_Rb9DZY5GykcGXbIF}vqZ_EjK395Ewt5?`Qj_Z{51d!gr^B`tZX zoDxc~rUx(cOeS69XcTx)h7tbfl%T zM}UTWA$eP5v@%4!3^h|;imNYapn{Ixukg~u24}ZX(Yr%>{o3+(TG>+){QznlQ@YK- z@yw;~w9wyoV)^h@rn z-ksl#-Fp*x+vd8Th|8nDsGa85EfbR&qcT;V0Wgp3mqg<~t0#Xc>+ew>SlkoX%Yg_WrQU zanAdAITyqQk??Syw$s4DkEo#Qq-r`rE5^zK_ae-HqGQxI_rNmP8Z9Heu%!^&S;pU% zE&q^+9;g0vLFre4Kw4XhqL#Okv4ynGEE%ihg0@PwZYejNTB~5?u1Q|nHzlppM5(tW zRk)}q7)=;K5vh>@l|&hxj%Iezq@ z+Jt`!gkcY}6%sONYN;pc;~Y^YoVQt)wkEoP3KI-E>^bbj+1&Mvgbwas4HMN*`)Yn6 zaOZpsU`NURRmIr&+pIqL*U_8>xh8SIg(G(wR-*My<>G3^YA;l%#MW~9L-E98U-vz| z=pR8&)YHd)yzwnKZdo-jMwun0@-332KpW1EW1nwM_Gi79CTS5Z@!tpA_NP|G(;ZbI z&8gw!T`)+X+!0KN5k)1eHAMbEB!BinaHPQ-Wl_;a6YtHI)+on7a z__zX_ghp{w-hNEg!d>c?xWXn%`Cnr@cY|aJ%9)>W;EG4lj#Fm?|D^G~KfmP_Es?)W z&JuQAwP=H%Zs33W#idRew)c&cn7ljDmS>c9C>kmDL;6v$zmzatbHMB51J_wnjk}n^ zsRqwb7MbSS9DjN?*zY;CG<_496Us6gDK9Ly($1|;{N~gN-D{N}G!>Lh`tI{4;Wp?7 z*OQ;w1PqBZEUCrYs0e%IWu9qtMT2gpu@$al--LuXK7(kB>MN+tB z5$KV&kX++s?fxZ9EZV$kVIhvc&zRByF|bxFnodjS2WY;f#L);Mr2-7au(*_*tBOxh1T& z>LITmMUdrTP-;KMjN@nlPuog8hp0&@Ze|RH~W>7#nX)ZU#CnoVHl^F>#(QD303@t?Lt_{ zsfCKxZ+z`~H$>x7=Oe`13g0lLW#X&(mCMC`izdl} zUxinzyINLf!X>C())9$L?IggbLtsSC)kP*Sz&tSaScjlG5G`6K4O^&mj9#V+9M%R7 z!B!xnWZdr#%ApAkf!CwhRQNE3lMBNn7#hs%qd2%4T+72;Pa~4=C1MKLWKHOQa`O<- zRT`E;FmuEGW23oQE_%Acx}lXYF)fD_Vw6ou6ik7rK#!;@U@IRZPKr&Leum$5Vv4nb@L^O# zBL+`;)7jM4;N!TN*db)LOw5Ct&maTdzQr7+X_Nw$B(@r# zRkNl-94}K2974S&b~c=1J(B*_Z?`&#{>ZAk%z zDd2fzPP3xN+Hqn4dJ)^saEgx-HO5JdY>jX+g=pi1!krT)LA!n5xV?YGBnm~4mPE1F zQ--Zdax|urG<1b+nSI>)C9zv62|f1y3*ih6Ngk?oI6KKdi$vlKNAjT{a^pb6I&lp6 z9qt=~^fedJg9Gv5m!l^|iYo{ES}&_B1>!iP(L3YKpThLYo%f)Z&98*OITdk9D}+?P zsL0Nc*&QKJI%+us;gTAko{sOe3xOq;Mm1AV#f#b!kCrJHL3;(k`RP58LypIr*27Z! z^J6-O0j<4;fZ@6}Y_vt{YH9eiHknW+hK*ZvOr{H-rLwo6Qde0ljhp?17K~ezD}4H5 zwXRzyV{9j%{l1>vbgZ!{b!=p|aGZj~efbwyk547#zD*Sf&6c^@v4&LG5cWtzL?jt= z>L?o;T60d7iz6{Wo^|S+HRF^paapWqU5v+^mN*LGI$g|N-EOzS^J<0dIM>VIH=91a z{kz*SKrL0TTs0eu<8P@{*@zT|3~8?^%e9zktmr(8d#J{Qo>sqHL&^< zSiT0n-T;f&!2C~`xhr7i3YfYCCNF@gb71BSm^lTePJoGHVEh;~as&+RgL=OK-8-Q6 zEl~3ss9_nXTLNkpfyxD-bQUO@28zc)r30YiE>M0OkTV2ISOrC|gTmK9AuB-eG7z{7 z@?QdcRspYfEdkz(fX@QpI}iBG!1zo7z7v4&DBwE`1oZ=H6+m7AP?!spm=YZ4Yr2Q15sMseEVWA!SD;clv8iRJbb?s`U^HzmIx%K5*opz&rVO$k6 zalOe{T%i>H0&cVAYMpU@R-7S|=J(k`rEa#2UbQ@l?LQUGKfZ*({`NXNj!maiEnzW( zp+!ERQ_SKqTd8<3r&Z3NSuTK!J^NZB9gh$MHUBbDr-uT>r^41N+}(& zk5Bc!Ui*D8^zZ&bc{Jt+@el^Y!+yD2in(&>O%Np78fi4&5XCJQn3g za`LtOi+Xrez;EvFbH$j&Lw}!nALutFMFl-h2StD9yTD<;6o8kPO{D{#*ZIf7G5fMV z1uwJu7=y)smKa9~d-h0s2_1)o#~e*ijKy-45K5zS=2VYius;lsVTer&P=6MTiIGNQ ztwI_@V-=Z(L1jg=J5H6S>K#o}=IaeZQLUq>%wVi||4+bJqDG5i8j{pdi*YgeIk|Fov*DDpmX(6#DZuleNVwV`L7>xFOFko6uF4OJi4-fZwzZ{2Lv z5^>u!4hQMvm=0lE6XGb7j*Mf=D)SLpjkA&DVlPp(!Z|c){~@;DBFDJH{JOJU1MBwFTdy3GJk8b|jr|S{Hd*Zl#~}u{|1?`a)np4-GF$)B z=;kMSM(;G$EGNEnU7gzJ9b;>vs$GMy*rh$h%$aC1EY|TQs3dA>ZHg3z{#rDdKcr&$ zfGh}-CKvpkds!?-%hY@1PtiwT8lP7oR~*guwt5;x_m-|6amuMhp57#>_0gx|M(8r1 zuk)fxOP%(z#=t96wr(K*vaY_a>#fd6lY{fhxP$IXcH@9lDRaxxf7&@X3tW<-=9#R* z+a0-9Q4lQomJOn=jU;>$`=cs^yzVlqtD&yL9XfGm_~)hY#FwL6LpKpPQ5P@9e%&PZ zjJ6Drvb_YM`Y@7gOJ**jy@D)PR_>RmO-NBGI%GpB&cO=o=mztzrNT_<+5hd>=MO-Yo$k7t*`JjjBD{KKYhk(EU>b`LQT zqsSjCfoxQKqHgyS8TF0c`g5dS=v;p8yy_XlgTV6?Ph<}*;pYbHTQ`UBijIrW1#Da3w`a9P*x+Rc zZEBqT89q_jj#%Z{W=XVL+*a`}!wmY#0)yooo}a#r6tD0EjxzV>x?5wmdLpLy3`56J zJJC{#%9T8Vl2wK{X==?Ev^}9g6aHI-!5Tclz9ryWhL1IG1DV%dvX5w^=)mO{rGRnK z*^dCP|I=>&9}%= zm+LGe(2|$8CYWTV=|vlDgcoGGAiWy?cnQ%NR2at$WY{zO71J|TO4A$(p~)h9-JH6P zbz_m#IsqGQN#g0W6)LkpY4AuG`4Fu=-k=_cHUfP?};?$>C`Y!%taO46HhBQb7jYpWXxB~TI&gZ-~J}F`FNh7N~@0+SnOc4^U&0cTn671)XR=hc&dA56HYT!>a8j)=c4v@afZGV%aEIvC3|^SP5HU_ zQsANOWfk{6BpK*;d#lv_3tB@}8fCbv>E-PMniwVz)xCX$NK_5hgCYrX? ziQX#%IUB9IP;}2CTpQv3DD4M*pLfuzwxTe;WHT*_B1L@ZXJkW}+sm8;gn7>5sa<*g z^xQ8C%Fp=e7hN`eJ*oHe?jw=kG;DN(OEEg#o0Tp#n$y>sH=4YoLnuEH-0%Lk>g6lI zCxNwXIymla+xpdl1D0D@oH-`>3;*ZVT*+N4ZoQHDkO<9xLaa7dg2`(kWaZF*!-5f0 z3z!jV1^63K0hS2$4aeb6&8>fS*p8Y<8h3cB~Cfsb!- z@_#-kro~Orr+Z?Tdthg4G30CERy|r*hkIhg*ksAr$kT`BSSc!1Kkcen$qrAw!eM(8x`Q7bp6 zgcEeFOHvHR{2WW_yOoQKg|Fhc$#JUIe6^M`53fu_Gztv|7aT0F7L5hBtQeoHr53GT zS{&MDkk(<4J`DdMfsWIYEU_;CxsOgjxn+olrGE!qw1uu0m%J{%6%!&ungtFMD8#~A zFe_bDgbt-6bVKla zc*3q3nCWA}#>T_G9EQzQ820jp^V){Tq}pXJdpr6VO&x}B(D<~48msErcbP?~<@l7* zvE6yVDKVth>X7ia7~k;tGU93uSxfu{LDpKS`M?nIF%uL^SQINqFeGYP$B!-zs%|&! z=gPoY;_Jj#;_TM*>FpN}Sj&_P97VySLEJ{Us7^Y$EcJFA-4z`mpAL%(6U}=ZK++*C zfRh36^L)25mx@fIEz|n5E-hLfD;t?6WNtx97iW$`i@vF?BSq_iY>CBByMIQzPY~Z` z>*kVS>G7!J3IX>{2NT|dt-0vG*a`#;(-C4Nc$VoV&Ct`f3QlcdM?dI>!7F6)B!;#L z3Tz5WNeU&pD>wuCDKZRco{S<`q3LP*GPS4oI&>a>ir_NyTyX1^Qg-K@~r4oGP zd82h=kV=2G@-Ow3d_8eNo8|V3@i(h6ks;z@JJF!)ka{PbbWOqj!HE&ym*AJq{30j$ zF`ZjGLWbVL<@wS0IxNr-SLVY6k40>BBBB%{A2}~9A98e1RZWm9QMTPtoaaTHw_xxm zDgJXgekbkt{+f721bXca#4H?n#|P}^Xl!PXkUol@xEVIzlzX~XVgXM`+=)V}Ic`oy zNCmf$i>#0z5Sm$**Tx-s>|5O|C>+Sg)U{nrg_InLPhjvnANu72KQb>YrYkHSfu#qJ zFtw|Id#eDXAi7>2K7~y*jz^L|LWFeTMPmot9f`{2(>IbhYWf`o7OgZi&7yl##u&IBmHP`S=w`Y_Ud8YZMo9%Mp>Sjl4 zTnWQqI`GMBz)Mia=}0!HHygpt?e;ev(jOgvC`V3sF4j(fZWu(@IFBJM!^#35o6{#D zOH*$yMlioa&_@kXNKPS7P$88!G4;VZ#T=2{2G`kC$kiLs$J@peznZl_@7Oo=AwtEt`-MMCJq$1On3`Z7=KRYl~2s(uw$1c zq4iN$8)pBkxg#Ak#kPCAY^gG`>p`$VFO~s|W-g}>8ccYTWK6CD)lOyoW_14K6qe2` zJJIw}5cPG)jy0zuo(6KKjNuv;_pv&Zzaooy7^cFP*5Dz?zMaNltoaXd#qYP~_Gy0D zx$J=6VB~nLAk7?jPAs*J7HY&+x@-oorO(k%?x_l`$IKzs(t7Ed47j_xmE|FY7Yq&t zU(jl*ay&z59I(*{tHE0yMLdjvW3@uIervj-y@ZFoYkTt=f`%zxZ*DvG9uqcc$2)&d zqF%(JYeg_yXM%prG?Y0RiTb%=CIahvY(?!ZGIe(;q4ub*3Mm(-87JJJ z61-mNSDIFl%8nUmmK$u2{yXj1K9CZqlQ9t7p_enbHRFP(t67(mh>ZO`AN$p3HkwB; zyo>>kL9Z}eFhU#G65$Kgl|sVkmu}@ed!fx?7Fqe8-=9$zv7O)b+#=+QvufogN)7sStuMkUC+YvmhEo- z`h@+qe;!CBt|jR?=rTjy{WHJwr(oxm#rJn0N%t}-J01_is)NK*B+^1LN~05MJ2zHh z&y2DEl{XB!g|x~#H@)}vme;3P%IS_4W(jK`L%Y?2yyve&`)4vvxNpjM(_7mVZ zSQ=|{4`q!*%5jMWUZeCTQCy86ksrfMYl;v3Nk92&Vy34__CZC>j<9qoM!`0`GfTpQ zHf1^v*azM+pXvFr@x&6;vxefwHaRI%MqDK!`0CB|^r$;%D{Wk(2 z0ka2S9Dp(QhtX-kfXi?Q+Dk~p3JyliX4zBT^nhYFju&!5yE?&w=v5M3PrI1I!nQKO zP)AK9r}zA8&8Xi=SLAz_b;7x2xU66#++*k3-MKa@*5)==7evy~s6n@|<6Jbxj^^N6 zG}ir1^_g@RO4q2-gFwp4!`|5^aXC`Yn&!+q48sCLS(#me8)2b^X3FgfQ%3K^hVxCd z_LJy1H~1}GL<;uhzMh=boI28hzO$4@52eLOmKltytD>VhUFYJ0Z#Y+@2sC zQGR?dHM^1cPc3nC1miDn*Y#z-P8~r+^cVL7)?;(Mp+4 zr!3-cgw0ifoko++ppb^GpqMG2G{B<)IaSVu#Gz4gLC#c*MBU!j7$LTprNXhKGWMDm z^A#$|&p!_=rk83Y!;oG_ETS=*1YEaX?8l-K2s!NwIyu894T!l+2MRf*ql}2SjP{(C zr4Zu#*&e=U?wU{j_!4|OBqO3b8Q+#TH(Em?J*nSjGq=Ivupx_1!s&ht9WJ%FN+J_c z{&TlnK9#cG5PRyGm{({2K}hVX$E}<@0iVsc+jM!id6$si^_arRptDGFp)-w+)gRHe zxz}RA6b-ij$M-D@&#qEKpKXFdi-8l2f{8c0>)m>_RH>oAFHCCl$>RS7$NhaeDF-+t zKpfk1zzM0-+Z9zVZUA7=pJktBInA z1F#s_huf# z>srfd+9=wFUcB0j)`?+p2DQWQo*#!q7|Mt|3VDj;64P@k3j(1oy;u(W8f2S%c!dgD zMGbR<3^k$HN}81Y4cZ)gCK$#-)BM@G`Uvc>>J4wjY+mxR%aJ{bz!t@rdROf3TGvz* zf**x3*iyWq*PST5Yhf>?h-ASpAfCnV#7bO5wrW=_(-fM_O+62J4lQ^+u&?}sPi@TX zNdfUnoW%AN^{wqDQG#4k_A#j3Gkn5VQM(YFg=n%eC|3?c*(9wLFHTqM6kLhAu+YVY zE5itRKnLeGT!7*WDkq89oFp@Oj)SV{xorMo*X8_JQp=6ea8m2!4jbmp_XmUI!DrPN zgZzKTV*!`1(4&u$Rn=ml5;z^H{vu!3pj~n;<0zOB`Lh#vYe=E0+$?pvQeuq_KxR@5+%+* zE==tGR`st;wWO;`A}dBXe}u3*!vh5Fk$?i$-w;g|Kvpe%K@`@sP)Q6l7>@pWW}_9X zNbh8U&il0aSyP$&7cTIPqK>CyM629BydJtV%%sJ6r(N^DGeyC`Y;et_+ufJh7>LIb zDnN;>=Bp!{wGPHsJf@<7WFawXNYM+->3=W_>!``ZPPcV1WE(k9N&=?`^IFkAv?*$> zRpP9dFqjhA#d7(vE$HK2GcAw(>^_b4z+Wo6?vcl(GE(;!qxIZ10lH7i~^ z>I7F6XJRdj=*2+}ntT+&h@&zG@AMp+-bPO5NCSccXZ!*&Y-6 zKz@PT^$}z5yoMaVW6EA*b@E3rRIu|8Zo8Pyt}HUR8+}Nj5l+2b?tt{H2TtJz(@hOb z2Bqi|uw^54D+xanJ3~Y*tbv?CY(AKDAUZ`*7hKYS_&v4Cch=>}b^(plo>E#W^b4Q= zI>u7rz*Y2&F8-z~u*FZqVqU}4q_Bj9E~Ibo|u8&adPqpl$d_t z*&rVzfd5c(NObvY@N+$G<@2Vv^0JnuGtzn$njTY8l^IF{F&-@5%difXHcGFMeN#r> zh{-F89=sW)mJ)*$zU(*^V}v|*-ukHZAUH}1m_btsW6g3^ind9N)u<4_qorzStid82 zPVj|<-vefk51_H9JSg7kK)ms-fv)PJj4rc5s+sYgIoLOZxRJrp&geoJ-BgXcQ?0?m zv0~2UPKrR<+ndc-J=eruHvAUOoi!NJXtgLkE!9_sUHcZhq%78koI!e6Fd4e&@jQP# z%W40}7Pk12EG?55WFli8uy|#WrJ3%#QsaYknLr0aP%h9+kb~bQtp~)tnhE5gjTnp@ z25>x#ZwQ&2RQ^Ky+pMfEX|SuC7vQDdqx3Fz5c8N9@a6@h_t@F<^B(!(4~Hv%M??hSCVl9j~t25yi5O7YxYjR7S90odWj z0(irX*Oc@_-9b;}!^5CPu;e!7*y?W>0g^G=rZhD9 zc4cDOT4)%idn*dkaHFOJ+E6kaCQvTt60gH}ix@~Hu9z<6gSV%ljvHW%djmLI z%8Pnqt@C)me*?I>=_P`*5B}f}V)~l`fe(vAocKC{^lBPus<_9&I0fm05ugJBbFdZR z9CgAH7D*jHaJg{UFm=k15(zL5X}UP5u$!YDI0!O6;E_2HFdzXEA>o}Fbf_7`oi4Hd z5*m9FJ*WdHc@j23x+*E3>`5Q(Nt8sfLNs}UuN#yAfS*9AIwjMS03Z~v`#P42A32G; z`gyV`t2-*olr_kyPaz;TK%h1t#7jtD)GAPFQOi6yY18zQtFLINY$p|lE$9$=V-$%?(QqUNKGymBkzD?Ur3 zzr~urFIqKLVl+~Nm%2iYMv9J1V@6Vl5XaJKKLH}R4{;cy!ZL<~4u5A`4~ZCC*nSb@JuI1lU({^+Fn z7$%CFrp6JF7DN!q(YTYNy71u!9Rz^U5gjTF2N_YFbSe=6;1M329U0-U8Q~Eu*)Sf- z5g)k&6Z;)JIFbOMo-E`-GEp8fc@rz)6Xt;vt)m02s{`ygI<|WsucHGvcoR5a!!-0s zm4b(+8!|ZwfHP@BmU=rU%R`uwvYC>p|JjrRDj>ZpAW-osRdFCzVMGaXl}D77!<$4& zlsq--6-yk54tf?Aq6kjZ#IEAJ&I3iz3%!mAi9V|qRMeK0=$0EQwEi6mmvmtmAaKne z;0nD;zP_TDAXv1$n!n_arK*(omR@L%e^BN zLY#sw3%tQ(#KbGASxJ?{qZP(v)HI8{rfM^(+NwLt#1;BP%k0e06U99Xy*@(%BAAxa zJ$PX(1At6PFnmT+7vb4GY!3R&1CE=(m=*9DviAojag-wM$#+%Oh(*; z&Dp9xub9Qp-~kwfYzcIKHGFn_zO0Tfi;@JEWn7haV)lABermzjPqm* z=jtpydKvHl3;63AcuS4jyT|&wPk~u1`)Zoqx`FWif>8Bn0RU|dQyLor-N)J>4X!Z` z8*rO`yNiiLx3(%8F7GI4~4IX_Go|6C(S{Iv5lZ$hxn+gRzBEJyBaXFhe|))3}oq zDvK#BIn*V|3ga3$ylzdPx_d(1F1!7puU|&)^Jo9X9k!$B7x&={?8ije&4I zE%cL%$||JHa2cE7jPHOy90<-;ii&wP7;N)4NeiVN*oJUWrlbjr#{f8h9R$XB&*&(P zxPmvXIh%kyHwFbbkbxtU(LjoI5BN|4zfoXinvac@xcxwyzd;%jB@h$ExXsZfZwfLJ z;R9=8Fm({&5fN*sBvK+ZS|kkz-664m0uq7J1Ih_9th`F91QV`{ zD2nRRF(l#u*xEZtLpkxFME<$1rGq-ylO=&uBz6-!a054W+qcz2DBH`s!_)rB zJ1#RIEbCL8(mOx}Gr%>}z)iftoy0gEh+YAfhLBXwtjs1z0*;v6uHs`7YFth22(OBv z&lJtkJjHBjiEb%X)hmKjE!|m+WWCaX@K7vhD?Ys%*j9SohMA6rslG`TjfUx&WTY*v z;9dU($lNdv*^=Z&yO(qcf)=m=dzp&jtrxdywea8!U<)>y;nqF^*Krls^P?CT7`AdP zM`GS1$3QmBKnt;G7#vtEgNE*<{joqLl`(>N!$lv`{z^(9K zakh@^5a59XxOvt<7C>MH{)P{N3!Dm;FN(`h6qv690a*i4$pOJQ1o5wyMGyc`5f&K$ zAY70jlmj`4gNd$aoBcr(smazE0Ul9d+UWxrcETV@(%<I?SlAn@g{QJGi5tMtLbn$)8G@ zYAX}tz9eG`yRL2D?$PLBMb*$7+4wG zF1E@-Ej=Qw$7mU7=8Si=ffg7IX8jp#Rtfq0|v84i@XL_z@1n$U!Be?ZGf%syt@_MFcS{x9CrV+K^76b$Vn*%vmT5;fp zI3NHAX^}a2*`?Kx452!f1Hu>a!J(!>5}<>i+%N$U$_jhJBqb6W{t=ai2PR3nFA)vUmuGtb+qBWiq6$;-;n_I*n?)l-s-0 zOF*pKzwG|IK-Jq*A=IsAW5PSUH%99!m&|7=h{uHjBw&I`t!qKnRA>psF}LeYt=v9i z0zX>FcNaNNGAg}@DbiLmc3Tm@WBf90}B_b?xO+YX1Kf=bB(T!e)8SKODl~Icm z@MUft$8k(`ilG^@s7SLwPt{r^>uRKXyuIe$BzoZiZIB24^MM>d8u;aNv$>A4Z~^UB zH@iq@ULPCTf+dAj*zGW2;25R4iO>V)$OMiLiuK6;Kml7qcfF}Eq)9Ie-VgmAff3m6 z0sb2Rj7yPkk{kp-r=R2o1J^+l;ZYM&Ck%IRAE~f`k73;z5)#{;4{ws{p^_B);S{?l zu*B&V&$_G)+l}A&nVkcfor4<-sgMeQnKe5(p#uTn=^t+?E`Dl2)LTl?J1N`Sx~=)X zgRAwlDzAg~QZ!Y-~^n9?PUhKYe<9rQsLbU`2V>9Fp&m#w&u4naQ- zomu7T80Q*b0kO~x>WD{Jme#pa{M23|bMc}apn>bVfke8^)SYH{JR3>}<{DT5{^}*R zVa~o5IA+O$43;U^?u9>7nyrEDMMztk!h%)VGf>cw4ErsNerpV!Iau1I-Q8bhGRpQ{ z3Xb3~;CeQGyIF4qPX52ikNaqTch@idK2bW5{y*5@1>u7^SP;+o_wIjLfJgZ7uepLJ z_@W(>CkztbVakV}o+b&C<*5>nidyZtTC2_4Ina2H|4N$e%8&neGXaQj@#2MpBZm&1 zH+AkXtOKWx9fk}eN|fk^A)AbMGIHeTrenr6Y}T}Cv*sj8lPXuLQPU=knlvR_zMNt+ zO`0iEZ1U_WWhc*{LWM?=66Gk;q*0b2h0+8H6edxbIAOx1i4!MHu3D}Bx+F=HtzpMr z)k@at)vai)E?K+eEnK)t=Fa_^B#9CvN%SJ=d*tsCBSwl883N=7jvF}=C%%CLM-Cm5 zcj(Ar8OIOHnm2ETe3^5O9iShR_H0?P=f{_Cux`xy#)=a*VkFMdTJnz{L4-&aGDHaQ z;KGFmDPDZY4bOFVDX5SFkSL@e zBBc-+ybLju%MhX9fy zbZH%zA~Xl5aB%vm0NijBfTwdH^hQK>Ks3=E6jfvqMj**Lt4JS_gc7bPr9_iUZj@9K zPC(hT(@#C=bgZ$&{#4YmQ5ex|Qb{xgl~YbQ71k0}nPpX2b0NXiSY&~v7FuC3(bigQ z#TD0GZ_%a1U3kUY7rjLU7MNg!1p!24Ib`=*cB*w&BK~NLNw}E72N!%`2d6tGiX;?WyvKs9n2gn=W=rWZkGdm;ej_^ zdE<>&LwYpSKpu1R)hAzjtZh6Q5B>Fb;D81q=mQT87RaF03XX`wefGfs!-^ZK_(F;p zD{UEnp^=!dYbl1!VvH}!T_fEr+=wHOJL+g8-#!kBJ_r;s2!V6n&}>y(qZbQ zxaYpKlqGG`k(cV^k3v64@~;9B+Um{*tV1jFc<&Cb?7+NxuF%(@Z+aBy3Q| z9t+e^%NnH=`bR;PRaRRep#)dyZiOzm^E06Y{cgp@mRopzwM1S3_%3+eg@An73lab$ zm?IFT2tt?{eolmg=47XWn$g(VI3uvfv?f2MDN(~1!$E@$>@fj@jAK}11C>?qH59|l zbc9ec;SAw7LHJE@isQf^fb1~2sm{zS12g65AUQ!u&c|#}oWpQzF&1M^cxDi^@`#5# zLi-MUipHMyFvkY9+1Q96w4eh0M?h7x8XD86waO%BHg3bv*i_UZ59tR&Xd4m3STn~J zxqwA=lTqC0b~hf~O-FkJ(vOUUq#qIfX>g8AQk3fOq(2xgN{Pdg;;ICuE?KFQU$WAd z$|SisQ4UUTx*VC{G$%aOsZVsOkm>4BsL}p8)BOBQWNZ#-fY_j1avkFN{OoA(MhBKVoyIx6#B@~~i zQ(5ZN$xzaVJ}5+iT2#S`x#E|u{Dmu@>C#_Y)+Lws(d8}o8z2Gkl28Qx#Rv^$U}5%k zm=;#Bg^uy!Vie<;hGn!h_;HO0B~+UHq;R7l>}W|TroxJKD1!K@&Vqbk9Fc`=H$S+6 z3}py2AkIu?Fw2b(b+a9bN|gR%5><|Ka%M#<(txQ=70-Ke76U1=hd%#$n25sI9|jR9 zjb6>#fA(`3H-7DFFDR=Ez7_)**vAH(!Q)6vY6BJZ5k`Nk+aPm`JOF^S15RY{YK+oUJQ#HKU#0hOYhEGY?vCp+=Ub9m6@=k~-WLix!;n~R8} zDm1A)Oo|S8*p#M%dAr_~YPQBaW~q$Hsbg{~A#-@cGo?upJ4~}9vEqnGDB_WCa%6kt zT#0j|TN3RFMGfzC=dh6V6KTb>o=Sm&w~|7wuvFzK|2%K~$VD#xp(UW|a#s=rh`)lu zi!Sk!*L@L~z=uNgf&M^fBYrCQ9szf7qZw-qX#$opiIJwj3-)M9P5R)*py)pB>5vMu z6PW`YXoe!&jc{~;QyT&y2)Oa-5T|1t-RNeC58M~YWGK<aUWjN@@4xu%z>$&iU?x;Z%sgSNNx~m`uSx7^2Igv$T}N-p2jYIVm#xiIZ*^x| zIV4lJbMTZw;t+>p%0U1Ik;9}Jt?4)@6C!qS194SV+>VS|BOCFitlVHL?S+%o)BP1X zqw6c}?&McR{t3!Z;7OEXrOznzq}H^y^_2Dg6EFHi@3{;r(74psfA4bF02Mlyz1+nw z3j7OUhOk7$;HQi3>0)zm&_VzQOrZge|%r5OfT1RpH#`^@ITJuX^vZjhP% z6i7EY%qfU-no}ZxY-B#1PIO94GMUPd#Vp>9M2FA=f#XnylBpmS$upkxQ_VVwMTy| z5|IKIW+jceu#+@1nlXu3GCdZQj|-)mDyJsPX7-e=#M3EJN6S0x3D0_V-RK-;XhSO+ zwzv!a=BG3*cSc7V4w9DiZW$d1gOm!mp02~AOC4(BV&o#sjh^((c@pU|{(3I?NgLcy ztTq@$*X6r>chRSWdQ$7xP*ICm+;U!GvzJ@TKK=jRg%^SXP`=Zi_Fn$7Uwj#X2uC1- zM7jOMidM8aKL%J0Zm=E|(z|Q%PIrgU(_{8j_+J1^_iS9c!(>lDHij!=` zLEyn}Cf|Y^vGh!_XC0S8S!KW>`4}H&XW)@>b}Tn-J&37xdks?bvDSO}gO3Tvebp{WW&JjCw!juGCL zrsZ9xZQ2szoupyf-j#~*0M|1KkEdZ%s{q&X+(7`m0XH$1^fVXajiL5L7v!~pbxFam zU>@cjg;AW3Jar!Db>6j*Oa7e8v56k)xl8LE6ucM#LdA>fDO7${8@FaLHOG0J+w#p3CeobpCEq2s6^eXfCax7*A6H2LOT{!*$5GW5v4{(x$CG&tb7WAEi4lZQ4gQg>+<>^8 z)8L#Q*?=*^Kp)B6F``=tbt8qTh=#mKIN}us?p4usSzq}L2reCy0Ky28py8OHnx!Bn zm5G{(2|jj-D4CL(m{QisAm+G9=kS53iJcCb9iUmr9rRMD=>cs0Qg0O#r6JSY=^YbF zn%z+v6wck=6%(XE+M_|57OF}eutD*_!4?J&9Wa+SwWO_x(->|~88RN^)nxft-sK^M z5fnxG{F--p9#s6(9k!R~Sw*|-Ve6%yydYGwEoC9ou(-Y-SM3>NmHb(iXFf~0DNH>b`yT4n)F~#Oh#URmPD?tQ~B^@v;4&7z2Q93 zAst46RLBKd)Wurh4<1?tyd+yvGTU1u!4bgEe5oD*E!0!~>emtY#R5^K5y+SiB~?~} zrF}4md&oe&HAhpms1~6|G0J6H;h!kV9R6velbw}XdJWlNV~>`m0}`owR1j%sW`8iv z4>0Cl#^MmkVvG$Y#FflU2|*83oGZ#u4Uu1QFdPpc(F7?K4Q!DNv;bADX=IXIYDz|E zG>r~C<7al&0G<(q49ME35PM*wSpg|FlFe)|m^XTeihzw>Wf=zUjcxvjqxOiGA(9Ft z$vTFa2>Rxjd5K{u)+aH}V}VJTY*OQ3Rw~I^=6GFnl9p+$>gYg39pJ(2Xy@DAPDNT| z6GGv6Mq#Ag9j@Np-sx(3s%LIBPw*(pZ}FY;bcFslNl&tZ#D7NKOg<|c<|MQv1su|o z`Y7leavp{9kNvP$KtU){;!k|h#X-rJAQq6i-j`lbo3%|P5=f;Y^2<#<(V4E*6wL>E z3=MpIn|H8>&joBYqLnuG=#dhv1I}f@+Ni+BC66Xel&KA6oZN}Y3}3zs5e3!yRViU+ zX>e5BF8aoA_<(Ns0C4;Of&jsoRt6LaW17Z|#-WE4<>-YupVCMM0EUqOItZQeY}RZ| zV)U3c%AAw2+edk0#&k%AxTd0>qtSU8mjy}R>?R~(>IoiJA57Ajanc`fQgM3fn=R)* zS`OxkJpH`ciD|&TKW>Mf$4T&i<{hDoS_$D&0n599SAgHjmw&${a*fu|7l{ zpxSbEL>O)l8}z5DF|Kn>tN9G5Jk6nkLIveUg?uqV5WG*awU>m3D~HwvvnhcQdhx>{*@vH z3CzYwtXAcvR|%lYHH{N3;Al3PX%Z?2>5+YqO=|{HjR@Ta8XayXQlx?z)mkkHX6=_q zT_4CJmx$`8lBxxlEh|OmXi4Xu{;bYtagKJzR@~`U5<+2j_NuR~GW%4#~g|41o^} zK@rRlC2Jdq9T8uiNX|5sjJ#}`>K`BXk!4CEWAqD?#xMQS?|{s*oR)|sCSO^#K%jz+ z^3K(S1?_#1O$7>Y&~4fNqaO2+98zuKW+Sm7){&a8B5jj_QzPp!AXmn@TdNXWZVc3cD~o-)%e#z^~eE6ndl_09W%|XAZLgaOLOX zmPA1N%1jb84@+0HmP8Z)sIt6a=1r~=*Ao+DtLHUn5G+L$y9(a|zjHv9rYY|Xo?B)yZ@k@31OO4Gy`JQr);h)b*5e&pJF`fq<-*KV}H6Y1N zi_icIq-nrv$Wq@i&7z1&wQ^&$0KbrkV%UI)Rfi2Qa&E%k2QPZ~zPduePu}$FSWF5AkG# zs+nZ6E~^hWZV(srK?CvQMjqrkG#tjEcU`VeD(LIh1^&o|eDUGug7ioiREBmj81IE( z(2HM)u}UL>y z&<(^0zy7$@DT>=wms=xWEXE#25QH^ge((DM!N|Cxichl0y5bGpkW8VhP&p=!8Fd}! z@ihWjDpm%O8Q?6d9AZZ!WpswPflZ%Y<72x`MbU-=j!g{6@c?5smvJ^{>y@J#iI-7o zXg|_3n>Lh~wlrHU)TQ=fwYD~g>f~@UKc>ck9NUe((2S7)DTuTT&HG{4;w`Vgd(SYp)GyG9`zp zi2>CLMW#5~xPeo6ZQwvwZDuSF;8%g>o}OD<8l#bx)f|1I8ws-m-f@)Ujo#!tL(M(kcDPX9Ws&%BrIw;ig^Wa@Vb&4>t@W zH%4M4au0x|DYredaGv`eeL54UMK?B07aTBN5F@k?|7RIOE<|sh5?5~JZuEJ>#i(1T zNO!1*!i(v`UVJAIeXI0JQ@!jd5Ume}A_A3dw2_PUX)*qKAMN$;MmW%=J+Tx1HTtf* z%w7>x-@pr~48OW4SklLe>Nv|ZGPOJ7nEEBep}2oR+{b!5$QnLd2LTOe+r()b{2h^H zSfdotO@zCERlU@Z+tJfdO`ZPumV#B&;L!!K#=Q@0^3Gg}tfm|>8I%{Zl@lFbU3q6u zZNj5K0o*?B=f3XmKJWLw@BcpV2fy$SKk*m8@gG0(C%^J9Kl3-g^FKfIN5Aw>KlN9? z^Xnfd>~poOp5L$B`#jzMOe;=LP|QQzwGpfNtQPXV-p| zTQ~3D!G9kh?_aoqBh>x-M_r+adGF!Jmp@=owN&8fDDypB{g#GD0QQ>jp^; z^>dP&ECsS|9`)wI@gM+3NK?%<*;I2(Dy@ujyAj~=4*&q-0kb-B)C&Q<{lGEvpduYC zbV@l9wQm3#|FI{%7|+yiKXIHK)KEj=OjJ|m+ZVkKF=kCr02XGjVFl^oX3K)!bdjJ1>A5)L zl~v;yQio{#I3WP+vC|-0LnuguaUo{eXVhF)m!X(N^srJ|?Gbcm^}reV=ch*t`XQnj z0-)D__Q_cw5uB}8pb(q|$7HC<2F+z~LQPxkUS(d$I`ycNw!iN7>t^h-@#f6sj`wSu zq3#Memp^f?Rxj(k5%&y$Y#EP8?s_K%z(bY(6R%t|G!+^E+J^L{RUYalE?|Ul?Y7+X z%;=nF^BMOE6e7WyHZ%0VX$|Mt({YC^*ni}?ed`0AR*2XAJ|}2)(QE#P+Te3 z34Zt98+ts(+m9FhQQk$k+xhSL8bJK<#}CkU@+JT0o)O3=pCAOd!O*|WvoFB9uH(58 z{QdVDm2X3xcC~qw3pxin$Oza)Cg1UofpGEP{~YAB5!CBgiz8fzn1&Dpz^-Qv^dMYD zBrp+{D0sd@0Im2#x$1O79;^G{3nv2(d0=QB;t*Owyaz)a?vRH)^x+SI7(^isk%&b! z;t`RUL?tefiA{9k6QLMIDNd1!RkZ%%6|tB_EpCyEUG(A?!5Bs{j**OIG~*f3m_{|O zk&SJ1;~U`^M>)=sj&-!-9r2h)J?@c@ee~lW0U1a^4w8_CG~^)>naI>YkdcjaUBto%G}j*^t6H03E#nMzfzl9jD=Xz4YZTff-C;4wIP0H0CjpnM`FalbOwQ<};xgO=(V(n$@)CHL;mZZElmB z-Sp-+!5L0*j+30_H0L?dnND@Clb!8!=R4sUPkGLhp7pfnJ@J`OeeRQ={q*NQ0UA(& z4wRq;HRwSRnoxx9_?8c~T(l%f^2=tVJ_QH^etqaF3=M?o4=k&cw4B{k_u zQJPYfu9T%Mb?HlC8dI6hl%_Sc=}mE(Q=RUVr#>Q%9tRjqE7t6lZ#SHT)qv5u9jWi{(r(VAAZu9dBAb?aN<8dtf_ zm9BNQ>s|4hSH13)uYL9FUjZ9f!48(Ng*EJ95t~@WE|#&4b?jpy8(GOtma>(#>}4^V zSa;TvE1&X>MOrN=zvA&+>hgTMXt?|%UtU;z)9zy&t&ff1Zw z1uvMv4R-K@Ask@|Png0Lw(x~9oM8=b_`&hW?>xpu&-?C|!zDKHiBX(l6|b1ZEq3vX zVH{%##{K(2aKVqai)#co?~xc#ia?F`a2mJK4_Kq{pT~ z9codJ8pa{!W}r!(YE`eA)ecVdHW}S&SY-KN-*;wwhHIv@uv5^@m*|t=bPXCp7p-{9dLn%8sGyr_`w}raD*?M;e1wj!yz7V zH$PnB6}LE-DSmN{Z`{cl=lI7#?qiSpR~iBq2RH&O4i1#Vzu@oy%31u4Zyea=;|Tf9 zr#=4i{z`)!8-RI#L7;&Ed*cHBCC3FWU;&%|_Zt(K00l7ca{zmT>Q%S8H>CdG4P1cb z1Qv${IDm7pGh65UEjb4;P!4Z6eF74I0NXLJ4smoK0~Y8&2f$H|4Pc<>7+89L#X)rt zSil1VrohuFK!LX>UhyIDuQ+5ba}YoP1d;y+IsPk-3qU{uY27Y7AC zP!4gd{sS3Uy*O+xjt@|P10VRnH!^Smajb(J8n{5#`@4Y*7~UKGwLtOtdjZGy*Bfv5 zyyqbxb#Nfv^52;J21K8IS(Cox>-YxBE#P#wvmFHd9Y+Lq9}Ws+paP7)fCnNl^Zx&u zqy6R(Fa?mmj^p=N`TlLb$)m5ozM%pjfCDg(zrX?N4p93Tkkm+T8mf->$YBD5ZUQIJ z{=5MLY|k7(K=ocv9L&KRx~}CUAOe7ozbK#rkZ$u-5a}Xd`S|PqQZ4}3q4_vq05M?q z)=mTdt^s`z)E>|R5>Nl0&-03}_B^2QG7tkWpz3Tdz&wBhHsAy9uLG)%0<4hgDgXv+ z5CQ-Y=EPz7#6bhVVFMt*14i%%)iBezuLdc={66sY>`(u4@BKi)1H{1tLI4D8j|wwy z0<^{117)%xxiADkufX!q0w4ea7_S_k zE*Q~~(1ww}Gyw4!PZ`ax3@?BK?hqV002=*}zr>*e3Xi|c0Ru8%0oTDCDDMhApz5~J zzgo}0#9;$MU>boB6Vq`b`)n9bt{9Io8EtMFBY*-f00cmw0x)0;`7j#g?gBC(4b^W0 zMlcz#QU45)3pFso#K94nFB2&;C+F-EBQfaQG4bGW9P*AC`EVWnJ|F~G&kw=D0xqBj z5peykQ6dY`_+T&@e-Rv`uN<^;E2UB=z4Fc4@B=7M6J3!U#$g%-k|;l5?vSz}sSq3{ zAO{6(DJx+2GN1$e>-Yli8zcbv%)$5O@W5(v90`*!aq=q>)6Cis9OSPUpE3fl&%e}C z11bOQR7^zj1nPcR_>>%gHkTN4BhGcjee%SaEv z%povQ>;wf2H)pdq)sdTgGdM45VvzGdbH0IhC_H$&ERkGdj5qI;FEZa}GGI zGdtalI<>Pqg^fGCGdybzJjJs-S&cl+Gd)KQJ=L>4HI4o~-7`KRt(&qgz?V55eK^+v+el45o^Fb+e(DHMe4zxlwRL~X_ zn;LXOL6pxTR6j$sMDwgbt!dFrbVc86(!?o4Su{qytV6jeKxOnspA1Dw6i0bf%5-#_ zY_vy(l*fLwMu+rBgRDrq3CWPONppjohr3cMYX}8RGl_; zR8dvHlypZ^wN)2vRj=t(U3FIL%$#JER&fMzcvpeRWs~%tgWJR*7|1 zb+ws3G+CYXzq<6Ac=cJG6(cvRhp1>Tt{_Tlj&U1 zwNupuI}zG@Aj_moHFn}k?;hp`3iGw$Fcavq3xWH4>@3NIRN#T z_TV4@WSg%vH!o^I)@lQcI8QJ2Ua$3DFZO1y_HHltcCYt-Pr!sPZ7JaOz<~qe5Eg5& z0{TnsmhKSmHsCTqYF&2oAm9RIu4Ne^GOre973}+n5N^rO{LpV5)Q|n#5B{u{{wRPq z`Rf}t0QS5=9GGzRT<-?^%LDLIA0glx0r7L2mJuKz9Guo0L^pN4FKRV+b-^vc#vuZa zu>vg+12ymiIPhmzF9Zc~9l)Xf1a%V};?E1o;RC#(0y^LuUXuRuFBw^m9H`NG`|Sc; zmcORAdi$|uhi|}0Zz+c`{EE=&j_?DRaS5A{>P%8Hr7$1;>o4)n3+GM(Lckn8Km+D* z8a?0%r7|3B(tqa-1Ok|L*I|IAwh{U(Z(T8PSr@^iavb9Dd}FZ=J>U-W5Fb4g5a&02 z=lA5!Z~}a89V+u9`O6G5Km)vRekm9NLSSiC*xeeT5yGK&GZBUvLH@#FixK#S4@@dI z@%iAf20>92L9rA|5`+0G6<4tpZSxzvAp;-)1LV&ozu_$-Kmxwc3qxQ9kxnGDnBJnc zi<=Q-K>&dDR%%@_9H9QUjJH?8(AXF)P$MO?@SHINgjgE;*9~7%?l2$%GGOpH@9?PB z|2!ZwlQF<(Hj(9xdcDy5s#kO)fO_RGZvmITh!c%}Qt_5fD7TItU+x~``0@C$zy2{G z{ZAZ-HXOX+<#rGD;1HITvHD~$>}XluHUMP1*l%-rmuWX|Ro8|uIl-(E958Z|;gKUf z5+p^EBv0`)Q_{ayG7X82`LcH%HXt>%`5VfS0ziNR`th6JEp!{<8$2MFb$K1oxxj+C zC)=^0gK{W6nF^0GDG`tHnTG`uZF?F7OM_5r7`mQ3mht70w6Pev0B~2 zL61du95+CETezmP3Bqo3uhr9ODcXz?dqZ0`Hvfxb8(TReK!yn$n? zd%7uY{z=RGKC!#E)7w48yP3Yby@T_;ohiQMTQ=$Yne6+%y)wU{DOCB}IZJh&q%^>r z^HaSPzztkBGqs)?HM$qv2PL(;7q!AI{K7Fj!!>-vIlRL?{KG*!#6^6>NxZ~O{KQc_ z#Z`R8S-izv{Ka8B#$|lQX}rd5{Kj!S$8~(id0el=K^wB+8mfUBra>B_0UD4z$(4M` znY_uJ{K=s_%B6hDsl3Xq{K~OB%e8#VxxCB0{L8^S%*A}n$-K4 zK^qc?qUJ#xu7MiP{Lb+_&-HxI`Ml5l{LcYB&;@K{m~)* zJ<=t8(kZ>tE&b7@!5XxIq2?hQ?EKO}J=8^g)JeV6P5sohoEowr(eWu8rUBJqJ=SG? z)@i-gZ5_*}AsY%x8$SKkef`&gJ=leP*!7$mHXWeC!5WBt*_plBo&DK~-5LsKpR%FR zq5ayiJ=?W?+Xr15bbX($f!oD>+{wM%&ArO6A)myd8qU4l-TmF+-Px-l&gBUldOhCp zJ>T_x-$R`m=p~-O;nn$l;0eCq4Svt3;osdU;19mx9sc1V-pUgmp2XqaBmUwsKI03X z8t7e}*j?j6KIBE--K)W!!hPgXKIK&&+S7fVvSH<6KIUcq*1sK{!ok{SKIi^*e&;P+ z8m7IRl%3~=e&~rF(5(TTw4vyge(9N>%#XdCEWYWbe(I_I$*IAdUcTzJe(Sfs=EG?o z1fJ`~e(Z~W8dzPLvYzbKe(iJK>%S@L**@;&UgNJmoRWU-L!KIN9vb!@@2URjy(#GZ z{^F&5A5I<`u0b3Qzsjef@g4v1As_Mw-{6n_o93bKCm-I!p&mHD^F2Qts9{W!-q_W{ z9^f9zsk>0XA@d1d8qU6%?w<^tGSdkss%!f&NDJA?O(e90VU5 z;(_XR<`{TXtxk()0|J|>_K)~VSzdiP?VM!_;8UUgiw}1caRfC2wp+beysyTcJ zF`_ks;1*iEh%uwajT}3A{0K6n$dM#VnmqYY9Kn?=Te^G+Gp5X$G;7M#hBBwlojiN` z{0THCHEjg#UBgCkn!;=pv&|zY?%GFcHd$5-iZ!d&tz5hEBw97B*s)}7X7h?Rt=hG0 zQDVFIZ{NOu<)|%`HgKiAY)Yq&z1lXg;K78uGA)ZZvErIi3p;)cIkHD<^j6ZVhdFb- zd6oasYYbAFwb7(Yo1XX&u;kUOTMNFnIJWHA2VL8~jT@*n{+0j4fqj`R9Kn0pqye2q zF}L#N%tuz64Ly2TyUnXxuRe5cYHHQ6dH?>s+O%#f#bGn9@mjX^?AyC-6i} zrYb$ZewTgi`~NQ(HQCrh&_2a^lubS5S)S?_s=}kVWf>_E@C#>iBU8>ZW)`8Sbk}xcnBRSe>BhI|fcpw_J=(yvU9ZwMhhMJNzBKE!+Ddk0Sj2*~-Zi`xRSrwq2)b>$t37vZyDWjG zZoH0lTh+H83A9o-@zBL8n&`?4@L;gHOYm6%AKcb73SR@K!VW8JjW*Oc?3^~*ts@nb z&@f6-wg`W`)nNp;YcI$qV|C527D@A~#~M|mO=oZRr7<+H5;RXXyPnMRPY#Zpt2jLm z9n>`4VzUrfC2KSkv*0k8P|eU(L$5vBxJ>?Z)+qt)?#^0&O;R=cD(WFP|8n%3d4ftq zpwJ0PGvG@5aN{-Dc4Jg6*Ve*&ci$F?oLJooS+mbxeW40YHuv4Q zk=qS8VuCA#&8}>>R5Hx>@O^pYKU3c6Jdl_EwKd?q4twn1f!a|w_RvGmIubL@I_uIr zg}Sv+_fCBA#uJ8G@VQ!keDlsfuhZ$u1G+i%)?bf(MtM)~slnNQ4}SQWa}Ve|w1X;kCq3y%oxEhH0V3 zxLjy0aGZ~ZJnUi7=!L^;>ClHnETT`07Q~T(BZfw7q7(53#3Z&WPfx6(6){qc8%mL2 zAiSa%iCDrd0_{LwEMpJhCdS}}wn^4Pze zF|m(?be@3P2gv?u!x|7Qq$5iw8UiNLe)G`AH3s>}O!kZ#3`683gXo)VT%#HjlZKZx ziOP6ILmJcIj(W7A#ZSs|mb9#;EpLg-Tz`uDs`z!g#ZYQ3e~9Q5~)nBs#Rm^RHN|r1YaI9s+T7k)GcC#^|z-2#sRSIx+w4C)UXiv*j(UNwxiM;@7 zU%S)`uy(d|Y0^sv_Lu0WBi-SAeFx!x^rKQSQQ^imW9=4~%N=OI}2rk4?(bgzBg>00@! zSGM=1XazsF*jNr{(f!YCY$auyw{wj@c{9>_Mpu{}BCWo)e-+y=jz!uHy zKfb}#5wrf}tMw&_1n^qn9!vR|;BYGdcR+~0Bc4i;9KW?&PgW{P_aTok1CPm`39~$a z*JZbsb;@iurfuK zn0*$jmYoWMTk)iAxhF>Q*j+oxB~b-CoB>u(Um8@ZkfIWoTST<r zkX^XRx0qimdmuidKE%X(I$+tPT&zJpxy@Y&?7UV$9;V%}&o?aRa{S!qEoFq6V`OIF z%_GdsN;=NMJoB)c`sP$GV9p;+QEStB!W=MV+u(Zwc35 zdZciG{SeFk2f2}baJSYx?R*bj!*%|FuX5l6gfBd=3t#xFw^Sw19yY;a{&sJ>wd8%T zyx#DQSB+~Mqb~=loR3Xx@_K;mh)%TSPtUcxyA=W-`t3zKPjQ0WJ@f>@x8&POZ`A8P zhyH`*E_$i`@1=@ z_vVWqP%XEr1_**`-~$|}E8o21war}z-(IXy9>4uB0v6NLeYhj@o)frK}56lG+pr(lCte5!YT|B!#C_kbrT z9gQbe-C|>8(R~@U2rS45-rxZp5G()C2sR}Fh6MuNFlNe!fpgPi?9fCwi4^`d|*|7Ldb<>p?Frs2o;c06t!n%Xoh8&g%q^`{_?O7 zUj+hBArIcr2oj(Y`Q?LP_6-|oRcF_QeOML87GjLBgmhO?iy#4Mm{&>Yhl@xPL>OYX zwS|l*i7|0tkEmTAIEk4k6Vzvkw-s}m2#PPUcAa=zdl!nQ2w$WaT+w%mt+*1$r;4z( zeXdB0ju?xvMvJ-lcDD#x+?9*8IEcL1Sk(24zi5lXcvX>DjG^dT$VgbjwT#6WfzHTQ z2^WpIIEvJ0Ri=22u4r1?2v(}qjm!9r;FwzD*o~ECj!R`^=y;8Pw~jqUdF~jEffbK1 zWmxp+j&^mAEwxwrsE=yZk1{on0Ev!XHINiVRtCwCcBhBJm{koakyHi#ju9!57nvG7 z#fw6PksZkrDYa6MI8!y{ktO*O3)N5$6;a96Q6CjjBW02?DU&lvlQn6RH;I!usgpa& zlRfE^KM9mUDU?G=ltpQjM~Re4sgz5}luhZBPYIP#DV0-6l~rk#SBaHbsg+yFm0jtT zUkR3BDVAeNmSt&{XNi_+sg`TWmTl>lZwZ%iDVK9emvw2EcZrvIsh4}nmwoA%e+ig@ zDVT#vn1yMWhl!YpshEq&n2qU}j|rKPDVdW=nU!gomx-B~shOL}nVspGp9z|wDVn26 znx$!)r-_=WshX?Fnyu-YuL+y6DVwuNo3&}1w~3p%shhjWo4x+&o4*O1!6}@>Nu0%L zoX3fr$*G*n$(+sUoX-iJ(J7tNNuAYco!5z-*{Pk|$(`Nlo!<$b;VGWuNuK3tp67|4 z>8YOU$)4@$p6>~t@hPA4NuTv;pZAHM`Kh1#$)Ek{pZ^J<0V<#aN}vU5pa+Ve396tA z%AgJEpbrY65h|e*N}&~Mp%;pw8LFWh%ApZWfBr*SH$ zb4sUmYNvOKr+KQUd&;MM>ZgASsDUb|gG#7{YN&^bsEMkmi^`~t>Zp$jsgWwFlS-+T zYN?lsshO&&o64!3>ZzX!s-Y^Xqe`l!YO1G-s;R1~tIDda>Z-2_tFbDpvr4PAYOA-3 ztGTMHyUMG*>Z`vBtidX*!%D2hYOKeKtjVgZ%gU_H>a5QStaE`juHh=K<4UgOYOd#suIZ|->&mX}>aOn!ukk9c^GdJvYOnW-ulcI4`^vBV z>aYI_umLNu152<4Yp@54unDWM3(K$#>#z?C{;?4&u@g(N6>G5=9qX|l z3$h_AvLj2fC2O)Li?S)JvMbB7E$gx`3$rmRvolMxHEXjsi?cbavpdVPJ?pbS3$#Hi zv_ng@MQgN2i?m6rv`fphP3yEz3$;-zwNp#ARcp0Zi?vy+wOh-zUF)@93$|e^wqr}S zWox!)i?(U2wrk6_ZR@sg3%7AAw{uIkb!)eGi??~Jw|mRCee1V>3%G$RxPwc$g=@Hn zi@1raxQolUjqA9N3%QXixsyw|m20_|i@BMrxtq(mo$I-u3%a2zx}!_FrE9vUi@K?+ zx~t2&t?Rn43%ju^yR%EXwL7_1UdoC>O-%)@*N&fLtZpbD!%&8uL|SZvMM%nH`L%sK4B zq>#)wEX=3S!eD#~s6frhyv^9`&hHG*@Z1XX%nGb9&#h1f^PJE0T+gdu&+c5!t8mZU z+|BiD&LEX21#&?a&te&=Vce8(jt)&CwBk1|codBR$d^ zUD6)y(Px0t9G%fD-O&u4(PcmeGcD6IZPPX_24WBfVKCD7k*2}z3P1V$!1>JiES|GmQ%hlgYzF@7sV@gsXfF5 z$$?x8d`t^|tjoKs$MTyCzW@xJzzLf$48lMR#4rrR;K;%N4C@UHl&s2@{N9{A%d*VM z!BEPm{NDL3%Bj5Huq?`$e93fd%8sqU9Gu;}T*rZI3&70T#5@WpY|Nki&8N`JsgTa* z9Kson%+(yw0PW7oJmJv13g#@~=Pb<29MIJ43f;U4t`N_y@Zt*H3ijO4_iWJq%;N3* z&Ipa;1Z~eVUe7=d*6_>d^y}97%LQ?*zjQ6ve9ghNAjh|y*9nXZyTA*j za0Odn3bj1Il#SPm-Nv_I3MOpMk&OzG9oew(%Wymj=1dBlJqn;e#-otTmaW1nOvX*@ z!$e%fLyX$Uj@q993e3*z!rkn=?!vBc&(s{k)~*V$@Cw8{?7`g&pwJ7Q@a)ju2?@>% zp^(RNoX67r$+)n<13br|+zY$V?*CiJhr9{my~x7A$mz}A>8;^(uYk7_HWiRGqPUdQ!=0FX+ zZQkZ|Zq&v5yVaY!%X_^~O}$dx_t4AtPrc{PTfTda1zX^~=F8QJAJ*e*zF)AuUI6*; zs|D^G`Le*)W?lJ@?!WJ=zw*1km@dEy+}H$8`nQk^w-5?ofC{D%$c;_eu>R1-wXoQ@ z%<3iV!rCs`HhjZ5OzW)<#-)(!oE-|cz}XlM3pxDYry$0rEySRJ3C(^9mXPemehH-g z!_dy`XKV^Luk)^;&N810;w;(CPuiXk3dY?DodE64{t0Q^3w{m%xS+sy>wUw(@R9(ZSQiV!Ys#U5~tzx^%Rav!Sy@s88>Xg>0{&}yWT9pcITehxJ zxq1sYZQxa{SS@DEs+Ho$iW{?XmGmH6fwQL3k4tCVnPPF_<}(&zL;a_mQqTI z%BoRB2{S5DNHJxrS6(s2E~`QjC6rJ;`NR`XKDp!)Pb|SiPfRfJv zQch8&6;&!T>#S7Ld$)%TMiuR?EZnBo7oscpr zD4=-EWtUx&5?84vaS?NrsqD(iFDbNA%t}i$wc51{6@Kkfv@ERj%FC2B z#@bgfbBX~YK!bKxBBu*t%m+VV`VePA`VTm#zu?oxYlrMt&CP& zyDc@CU$bp8=!Wa<4C0E@S?A+cJ8e4aOnXeZpG_OXIi!;&<7nr!<4(H-!>|I2_UMc6 zy{oIX8a^w`>$>an_5*uB{}L3C!2Ghf!a*$}%wobX9L%D?4LQ`}!Vg3a22I@u0UdktRRQ^*>b&~UfcrnS;gA%%xB4K*{MH6I*Ax5HL z9|ES>VjW8(IFZ(~Qj(Er5fEAgoK^yLVUud<#8pWlQY~oVxuGBhToXjqxRzo&bfrr! z{PGLG=+Z9|vP*>qTU1}pq9_x(i-i0VSPkvMG0Y?kFb88;TOh^?GPHsW6_Z$GScWmS zsE~(&@z`d5_`}JBW--xu4bP5ankqu)G!ORAgQDBvU}5GLwOzcgX&-o(8<=}Av_x)brZ$GteYNfd+{#VOJ> zhPSA~E?9a6Ualt!L19x+py)(9*$Jw4g6~x2>qV?~(WF~6Wl2eyV61ZS3t&)$f5<3? zLI}FQVdyWR`vc%bGGdYcHBed(jn=X%Dp8d@@Fo%*7gB~&6blZiC*Rtj2ZI#CsjP`$ z{+gFpuA)M(D3L4&gH%gT7?yzL1*K+M(_QMdmdZG+hm8V^W-xX!$RIUinBiDj{^Ayr zflM@zkzy1_1{#P#XNtA{NtqVC`o+m$F^jpu85xTMGqEyvXf=^?-MO%{r4T!;d9ILV0;ayNop7i0ke;07eajb4a!QX%bqn*2 z$|+3}l3i2jIyj9&f9zza6; zF#boZVL?Ln7wW^-fb}6$Pn7?@E)0vV` zoZ@sByS(Dm6~>e-e(6e1(}fDER0YT{ebitG)5C@t=BP$RYEld17D$B?EKrRM$Qnac zl2sLo5X!Z zxRZrC))BFXMJ#>>TiB`*mXP)-n}E88AO)T63MXo0BquAk%{GV&nYQd^A4Iq>fVOX- z^{nDTIiu9df)=x=+^T0JIN6q%M?Ff)JY@y0a+S^`yAbd_S3F$&^1^p+8m*deCnRGc z({^qmQ~q?Lau+qxg(}_j9W?u732aZ(Ps4LBCI$tk=z5bdt}x3hMp50WI8#%Y5>%%= zwLMSRH&ngoM1Jx63xv=!7osYcQq1>H0!suKnixhgdPR(4Fqpv(en^CcWs{6l7$gr4 zAV(H>zztK&fFI_`iCr~Y&zX3n;0l+xMirG(=%vT2+e?mR*sl`K%f>78i)G-|FR@%D zm_Oc_ypY@$p(aLQ;|5J!9W(TWm1QuPA&XFrYSqb*#;RMs*cD|4n^p)d%Ojg&7|qHY zHosY{u?gDJs$(7Nh$d-bs4LROAfBgvhYWP=juryV$3qkPK8F0GVfzS3#Oh~iXhUS% z{^nLlE$GKU2D-FmHCwk2QIfM;sH2KPlu5~%T5u~0oF`*jBT=$?)wB?ts&6zTqR<+B zyZ{$|MO9Cye2bpEE|rj!1PW2`BAe)v#TL4Ps8Aq<*~T?4@CoH6Q;arJq_8gYqcW&E z`NRmpB?1E6U2!1YR z5BpTjJ|VzZ2>%_TkONaVh2kG#aJUG=2n_oO15`j^u{ey&xMZOgZ0We3zy%EYD3R+4 zUUQ!gLLV0U5`QtLbkPf((z$(sxpvtKnX9>c0gIV?F@lkbnCc655xSpan4xq23&Ic$ zE{Yx|Qo6&axmReEaTB_z^9&?{IadhJNNjjz#F_nTCBNoBn3$jNLxHVWE)R& z5W@Ko!qKb}X^;((g;49f#7V8qE49mOoYG<(p|GG;s}a$|AbcX1QK7x?DIcEjL{h;o zP$&gA!7puslYGJwt8kuC8K2)FzNk1pIAK2OAvdjXo>OQqI{6bo`IBi99#Q}&I{~-k z=_XW2nD6r@G)aZnnTlr;6z%H8=?k8CtFL+EFJW_qD>wyK>9tZBu223Puv_7Th1djQ zP>5ey#|7h`g=#p9fX8BCAPl28100r|IEez1r~WI>5w7^#vli3%z)TBE?7$c5EA zxnk-PGZ7(`3m8j5mou@Hn~NbGV;8kJ3loZ$dTAG{xSpv{K~*THn!CXsQpO`o3@OqK z!>Fm4E6H&?vV?&;$B-B#TnsCt!m4|W+F*_-WQ`~CjIJvVHEXjnID^y(8ZJDUpJB>5 zqqDQSGrF3ixXX^Y^N#SKJjyGy`^dYl5t~EP8mjrD`0(N=!=>z5Z6Spn~WT(}@Mz5-?t< zH~g}-{JYHXF_lmdl~FLCLAeELLzG+4CVB$}W9rOaD1~L)KB-6rQn-w+cm+!dg|3K3 zI>9#L>61&CCQ`tHF<3X;L(OhF1;Q9YcA*|1V@+^dr|IhiPx+Hu=z>e=1YD`Fc>10t ziG?q)1yT{PgAlM@xNmUqOb0TDbiwK!&=G?)w4UohDYKxLm*g;y8@leDfiNzLu)Hf`HY z;vt1Qp%X#@1>&?FQee^Ktgh=?wmP9kYWxJ~#1&4kPEJ_V@Eo7d?62I?EmaY)e*zZ* zqX_-^m4bWLghMz1j7NEdPx!PJhYN|5(1lz6;7^#q$BI*ljgp{#3eapR2v`~}^f4~I zXhnhvNu8S4sX!N;QWx>7F_;=5x=eu}pkj*^M2mSL zLZPb393|1ItE(gO7$drZAmXwdwJM*n4Wt~>uxl$KJ-Z`yJCw~c?P%HU2!kb^(!0uz zPpdpHO-n8HE4=fg`Vg!_3y}Ueyh3U`#ltkV34=-6kT7_gO7k(Q2I0x@V8K@0J-}_6*7#eyh40S;hiph6zu^}5Ftyqhh z(!r#2A(}c1B{M3hI?;tmlNQ`DB^tM;dYC3-1)O9IE4z-Q8ndj!0+z{Gqzajw>?$E8 z8lTaPlZ7*;d`h!xj=d71IC5DhrMvJz!niVuhqZ-B9**o-_!|K`h@DKJ_qy%X+ zMWQUYv^2VDkV1SLO5zZuh5p*YnUD;L+Ap|}&1;cN$|PDCEv>~<7=e)sQcR%`iddi= z#Y{}o!7a_9H`=>QVeN&v#RXXq1@WObIiZu2f(q7Lwq^sj+WDO?P83*pDYY0vP`!#b zp(gO+&Fb4OJP9v5`Gmv$HuhDzNXgJ$>{MgaTsrw4PXOJ8(1g$xAM4zNwk;p`^96ik zWd0&KTG54F5r$o<-C~$sc8u2cY|s9=*4&Lp_~Zx&RG^o*$BM#T$=Hfn!Z90-t!oUIF^;f9D=T2DlbtiAaU-{C8ts_72!!`Z1u{lexIV7CTkFn(0LF$jNgruP@B)2gTG)-Cw$uvuf;TR^I49So>0)ss* zEm9k;*kT+!?O`CcoY@l8BgPTWsYKI>mD^HedSgH9oUiB{g)88KVC|GZan)W}r(}yA zPW9qr!Y=Y7lS|c$7NpIJBn4AU9$&PC-c;)9%M|XRMLIq=a7vSAG&c}Zwm9h%YUBh@ zILBVm1kn9e`yyRM#<%d1pM-GafFeiv(c}dy24hf90W>g+Kq&tCWNXFNh*K70(a!~x zz-8g6BGH`wgcO%=1efv=W7gcMS*FN(1tF}c1dDWAseO?P8_Qmr`|PGW zjQG_-sA`y*)JW7uW}p+_prS&N2@Q+MIv~23(ReHU)mSc5jB@swpfO;l1hXPVS*0n` zcAlf`h}oy9=RgCrDXpWL#hL(_nzJ;tNh9bwoI~nXEHr(r61J?jVLV3)M2CK8h%Uqp zx#0}CVLR1mKmDwY##2+G#Mnw=5<_Cd^eB^VB}b*FcIt2UyUtH>w=9?iT(J{X*d9Pm zr#G<$Q%p^8gGJvdzGMppg1L%vQaTbMYEzu!Y8;-WR_Z`8KkdmTLn+Di0@X?B)a|n! zP$2%EUd)6|FvngQ23tYvv_@+JY%qkoWb}Mi{Sg+s_GE{H$M@80 zfIOfEw6IVHY-Zu8ZXuG68Z2}?2uGfL-9qY;LSys8qUcs^m3tNuYp4uHA z(^t@jse>8VB-25K35=PfRhgo>JztoGQCP`v!u%Z?BNC0ZsyhEY^vE!oAAPekGT;MN zV3chRIcm};eVUlXN(#1My9+eRo6->$;V&g}oXtFJ>OFUx7sT`0)Vq2Jny8$WLvW0a8HqCrgvHk|| z@bQIA00qy5&M~NhZE`1Aj0#u?6LZOSScTQ!iR!61rZrIoaJmZ`BL%;xa7~$$Xu6Y4 zpeEw6zDqb&bq|HXIPpkPlVJ;Zx%CrFfbnzG1cx8wO{j4kcfa!K1ccb}9{2HG2&jZ` z$G0{HB40<5Z%228NBT6tCXdhEh4O~N-BS+if%FL-;hc{0#BWUOSUk|@6&Mi8Y%pnF zo}y*3pqDuBNal@5kMu~-o^yK1mn8!9Xx2e!UKnJ43qRj;Jy*v3tt!}NnU2jm#Wj7MZn*thQq)?cOLEI5UC+Md3xy;6*d0RNu+N=@RcV{NjF zNC9R=F(+_?x8AI#H{O%&3NQ7;zMdj#Ho+2OI=(s{@m`$quXgx{H%Cq&WLufHUYMW# zL+kWs)_|&?Uudv|TgPJ{24etu^fU(d}dqW7jk3&}2fJ=}dZa8P%*eS4lmF44K)qZ{HrHo3@zSVt$JW6DBzE;bFE252Izv zmgQT(90zmdiWMtYv|zb{Wjl52)U#vBV!ir!^5my`M_+yV_AJ=3hj*{VIrHW8nKJc zl(L~syjX~mNxZPgODLWA;!7tm{_+ban{1*9C%^c@35-2<;>jhTcmg9YoqPgHCp?8R zN+_m;;!7_wf&xk}JN1MUmOSBfidLkErOGLPr6SappLimqC2O*2$t7=MatWHAe1Zv+ zrHGQsE2sp8)GM$!=}9P{U?~bHpUjwMCYfl0V~&hAdZVM9>=@&ez|@$jjWzDL<1RHW zRO2SakV*`x#T;Wysi(3kP(i{7M3F!aHFQxywJO9=MjwF`OhyO&x{*g7NmMLFBbkIt zN-N!xEKDQG^wNqp<;6j^|%zDToF1^4w<&QIN;z=fyZsKE%KF)}VC!6^4 z%a5K^2?{Sijna#fzA#z3>062dmQwXz{`D5NSbp-!C74)lNhOtBvL@}hyP2jZm{gf< zDz3ot6e^~m0!t~e)43BUp`_`HCq8n*sH2-yl4GMdQc7v&F@DcujGJcaDX7EzvJf)G zAY*E&?iZt~`=%B|O#Qlap-Zg<xAcP~sA{Ip^Qj(JV%|an+ z$+Ke8i(SwpgE~2#mOw`eZH22_A)E?Q#$}Z-y(KMR`PRCcQbI4O1ubO4$_(QIuzSfx zUwb(iUkU>lJqe751Z%|@{Gu<2O-5f2n+*~z!$gW{W;7oQS;tf}#g2`^3MMO=$7*vM zE)p#aD_dF1fa9{7;Y>JSOOAB@zT=+lV5ew5vkuXUcC@1{O*`z-V|=6*p7ux$Y+e8x ze)=;Y|Kx`YUQnZd00aiKscmhKY#W3e6gLT}ummR9^rkdfE_PZHi&DI@Oei7h6FR9aWv)iw>(q`o z^(jmVV-xAKpZ$u#&-ty&pZr`1F_0k)UBF5qw<732UnRhSJaktfk;q06c))`!Fd_~V z2}zO#BEUI|7tyi_D?|RFK`v=2TR7@qJY0^<(C@*`B zrCu~-i%{2s7snvRUqTd^UsMr9rV>mrJgm$r0)s@{5bYinvfHh)6f0lsO?sy&xesdOz}9FOuZB=W)qNh3chrwbWCw zbn6taIE9mVBL2HL(XLIi(_NZkcL_Q{R}@}Cic_32m{DLNNS~OJCwNiL?s0FOH`<;i zw%5JP?V?AWlBX|#(LM70;vhKs#U}puK4Pe%UD#akb;N`@%!@>9MZ*+h z7cX|EVsD1bWI~2kl;Jt89P>@geuD+xn6Zq(*#cb0rpCHDCk#x>j$*?zG@1WZhN^Ta@U{ zLtbJDE?_aZ3AQMMC*egcRLP6X(d2uexJ4|WS6t&(uSh}i9h#mQ%w7ztb3N&9>72(C zJn@u-eJTnnQtDmsRETxs>%>ui z`^$+&Wh#7`tLLWPiQojIFMT!Qr$CKi3}PIERiu(%KUc-i{_Ss|7x6GebtMdsTr}k- z)&)n5h2jS$3zW@L@rPWTtPCcbblBctmOALtrTk=tF2&YMy+Tv5Smns$ZWnvEbuFj< zh~+Bqs>+yFVP&h6<)?A6OJMjSm@ju(U|0!ry|!!^GAH$jWGHi*+5E({ul>!nsTjr9 zoSBSqQLTC2`^jcw#^eNtjAGD2&5Sb~xN`P6G-J+n07O{v>@hxioEl>Bc%H!mZ90tx zk9_6>HLKb6(}(O@fwmwE%bs452BPHY!SJ?8M#u}ZphYYkM4{B;jgznqvrvKQSYRJViq2~m`SOHyHSQc{-` z>4u_CZ<<}Yr)j%s@{V@yPLocYk`qxZlN6s&XPUa_3F%Ewad8i&KuUi_jywLzlRMGV zfNctjYifx*s*2OT{c)AUtfU7pVPm897bTLldu zRSkU{$IZ~yaimQoZ2{V_O{+Z?syWu_an{?gTI|hU?a9LJp%!Xo(*Ev6kV@b}VU)s$ zl!A!tP0dZoEqq9f;X)|L82Ipr_?S~C*vJ7kN|5*hn)KF;PzvXi4z{6*=NL+r#14~S z$)RvxHE2UM1Q}F($p=9NwqVP5!AbkMpZm>@kjP(oF`;@rohf_*C#;F%M5FH7B{ghHm)f8~WuKBu5tb;csYS zfS3(*Bu5&Bfzw#WA4$!82#w}V=B4qBdi>R;@zLh>hanx(BF)UIJrWmm0o)wO=^==L zAjql}2rL*TYC=eA*rKOHA`^vRxZs5j36g85?7Jv zQlel&?0C+gT%$HV&ogxnbUhC$WJ5+`gS8mNc7e`OU<_mot@dhS|?Gh{H83)CrPY$t46zvfzhWl!Wm#8eD!R8eH` zot*-v;Pu(z0qWtkj35@CWYsMsLT08>X3#)Q9aUmw+R1| zj*!R+dj?bbIZq~7!lEpSJ`xvx;aB8D4ngA5!WASih%fkRO8N{$jcCFz6x91r7^^fW zsiX=qU;{W%LqlDd2vP$${#*mY{u9Z8r~zH<$X%4iP81AM&?oU)$a<7W#h7nl+YX}6 zDBuZuy$((c<+b3f2m$R_3TdC5UsLQT&-#SVev6l6#n8q}m~82nN)=%+?H2wCS!$`C zVCmSw3zp_^mUFIhGbOCYrJ8{{289z;U30}AD&TiXu)sP z)!}KuBqb()6e55;2XinQWctz6NX?;Y8l=h5q(vI0squSE4W}WJA~h}^TWWzkNP)DC z>w#8ku8o3hfm6}KgUn`zq!!)CByWZ;i!941kS=bb2#6esZ}t}ANJ&lpqU*YD0w$wB zmTxA+ZnP1JbCr(%wpm}Zf&wZ~t2T@Qp%8B<5JeN#D4u{$jplCbgjY4)4kZ9{B~U^o zXm2I#&bx_IlE7P)aBn3D9KV4t^%z&=_}2k)3Z)p>?8Qk3stD=+^6x<83NcWFI9LP4_0vB=)WTNmLj;2XW9+V!XaVsGw7dia@y$%?77fPe zFiwe;G|2{a*H7TdDeR=q-k@814Qc833N)EneaNq1kL!Xz>RjWg>DAR@3|~WEO5E>d|9XBGH(2&n#+WUg8~l zW*3B7C!$(`KrY*;8fYbmUCZ7f&z|kk-mKwGEC@C%`c3D?0xaka;N)J2+#2$M&yU<- zP5fpC0T_>T&wN$_0d~Tom{X7Z8!F>OvTl&IeS$Set2JOB@q%Byl_N!C$tXA%D6AiP z{&KkDb~VW#d!F(qG^0CeHZk|#a81f^@uQ>sqdv(J_vlEZAouJVAaZNM1-1|TOc?zd z!!ZDZgf`U2d9w%-1BRZ8#YyD}1dRM7AykRD@$sor29W-L|~vP+W@&cSSe(R9O(McFj;q6Gj-mG?-=S z(_#hkR7KR1r57fK*+tc0z@=iiZJu^*QnPK}7N5#FLlp#~Np3C$%g$LNuoT+ek~`Sl?a zb}Zb@D2d1n-U2P`O=8d1O2ncqFzs!cgyH~e;&`$t(F7(Ro0Lorz1|M@IL@%%$i8&~ zv;G9U^^&2K7d2ocHlPB!hQcg!uzEekDv#4R(e|N~C-mO-?Px;uf|rmebLLdcr8A+n0L4%MozZoRkiyi@DH*xH zr_cUek--pLxUg2_aMo#;hzpEMgWZ>DxLFtv(#bT`c41;f6&V`L7`(z5=qYd5>2Cxk zZDc{itZi;Dmbh*P{U53a->(QjTr?g@Emof z-!rkFItDXtSHdK;+xkIgkuZ-h6Eiyb4y5Rp!5!d!GQK;F^Q;?S!4;f1^ZG+xpmo#l zF=)dzJlMy%vpe_GMXrj)IcPf*R0$q1tuTcBe11N^cL7n+ zz%EX9AL;-&ljx{Rk-Ltm3sKl?3*{_Go1-YWyGIk@QM53;P?;E(OO=5cOlv<7bNKNF zEe?m_nC3;-9fn=#Mq*6$nR=06;300MnzxO@TgC%PZK$^2;$wGM0XU{J^WqBd$a~7>wUt-Ow6)P64TDEG@x@GGYFQry% z-ST>?RxMm%ZNaj2)@vFhX1&|X7bn4jGYRg*DX`#8 zgfG#p3+hv-P@Ou3iY(b0w{X@#LH-2UvZrd|u!#yaYSbrEqD)J64LX#lPqQy!!er?- zrb@djQSv>hccx62h}*vO$&;r`o{(GOT`ALIPKyg`+WvIi`gQD@xNqWaJ^SKc)3<$PtRS5P4Z6;15o3%*15KsSLkA_wl|(BQgHSO<9hFov{!Arfj8;q?V+>Kl5Q7X+S3T8KQYj^s zRa<2hLkoq(2xFy{7E&mTFSba?Coq&X${>aeYSvhWwzy&=icS*A3M)Fw2%;=9$^s=V zs2!;!i8k^UqLkEyiJ&cv;vx*6jH=0tS?D#&r)LowDyX6A}~6U>uNlJl&y zx{L&6jBLco<`m03V=lDOu#wC()<_|HFX?SJ-zb@c65%MZ1nSx_ zVXn61Fqzsn-m)WavF|kDBs;a$*3P>A!OHs%nF#B95AXBb+grf=9^7v1pb%pnBq1xQiBN(ChAk-Tg2AE|N5(~xk7x^A-U8Q1s^yVxh45PE z@`$=r609&N%UH!Sh%9D-kbC}lVJQ3J7r%PqE*b)iDFUlkR1nq`TkryjQ{lx|zA_cC z@S-YLv4y~F!4|a;N-TWYMO=ZhBl1hH^PC4 z7zo0Ug0!(X#yReB1`1~8gi)f(C38f~++2q`2RawU$VNEQn2mPyBGs`DFJScI&1RRR zCB>!`P9h{~awjF-0sc>TU3#bUoFpZCjsi_dE7Q@O2Pf&t=@hSM6r9Ybr#gMlQ0-%1 zpvFf&^3CZLvKT|BP?4xZ6>6dGs~`Oah^zf|bX2+0l>kRYtXPriRm1|;0`~>Ml_-l? z1=-h1dUY&g8LL<05{bDy5)l@LYYXVgNJ_djk&&!0B|?RX0xh@&p@2aa?)m~3aL9$C z5G99B4GLEI1u&>c#fT7#SXR8U#3kaQtXHYUDAFRAc=2+3n+bRCX* zahDz0#bbu?PGO{zvX?1`IglwMbL@ymQ9$N6u=B;tNYk0fEGiVFFon|i*x5rmjX272 z4%K>-wW|SV{x?yx&Db)jNKQ)9lat_1B{U%%R<1H`r^Kx(-S!^$yz)Hsq0fEp(;xR3 z0~xjyoH2IUO9*|aLd&!qfr{zNTn=b(j)UAXorxjsDzif)I+5mD#G+q>4oIXMi&$pV z%@_6PN381@81q^r$aI1ik^x20(5WPLy3=`E5{EpAM^7{94xdA#U75@z3O9{!PI5AZ zonDa&Rb)?3i#i{o2-TDIB?`ji)9jlx9H=)XDh!ya@InP83sHsYe!6;v82o3zlG1p_ z_N&#Z!a#;AkU^zE{?(ARz)~F&>w&^L$U$sskQV~$fxt2sM?})WZF%ckC8<^jf0|Tq zWjS5`EQCq3nu-u$O%Nwvm>>^#xUUHU?1!_Eb5-05F{~i5bZABE#gy1Es@wu9Y$24K zF-8kpY>_f^p-d;jiQm5VRYyar%V9P_>FCsUFw=pVB{3x0YS508(0vPXfo%K^3 zU)-f<2rhvcU>GC>cO6`UySwY)8r(^6_rWc=yL*5c+#Lc*a0r$lA%rA+m$&wp-P+n) zr~iSz)zy7Jea>^JUvYVPl2R>ED!e~hG7l%odFSt1s92}UovWy{Ay-RMNkkm>StOr> zRI|Mbz!Oo_F|bj{q_XhDColVze^80@jI;?LBKw_zC5dS@*f&2zR#99lEMG>uO^W1? z=$eF4l5}~w=%fPHrbJqV9&INbL{{glKC3P2R5WQFqo8k?S#l;E8PulHeLEGW~Fi&~*@5Go7~Y;EPuPj_4MG_DfyoH|6!u6U*AIr4ia z&oeQ@CY668_9q|ptDl@g#5FvjQw1yVx%5ozlnsNK;F_Nb;EXsq28r6PELPKQZ(YB3 zhi|3>p9y*=Xr5xc{=0u|YPQ|8sqP;I)k`!r>GlMn{W>Z$?)83gE3;(h-)~Iv_Sb}% z!fjJ`iqGMf*S_svP4C7+;?esz8Rz`gr~HNwNwtuwRZ*&Fu4*Jd95b2KGY*xLs*V(r zg03o1U#d|ktV5nNB#HcJU(}I7lQw+sz(8$GbWvyXCFHOg>7`abWTiI*fLNuCOC?~w ze`)Zp(lAP`GNN)a>?r!3j0w*qmgQu`aEbZLGA!=6X~F&TB$aawx~M{)3!}*yxk=pg zmqrwE--_|^uQ29=WLP)n$5xYAP*P3rl&p@qSUE7Q7wOnN_Bd^$tmmg2Tq|zIBgmeM zAgqA!%%=#r2fD(s%*_xs_rv~DK&ir$OyMaSuP9J#*`AkX$qu%63m;cvQneql7i^KH z>ItV1{|=TLA=TO=MvdIX9SeIfr{q_4!W#wCB7a%1cd4lU5@#hY!xVClbaB)a7H0)V z5NOCmU9twwlFf2LDsGW-V{KBccFPc94gkNvwp8U|2_RkgX-*Wx^{$DP$ zvVp9+l?J3(aTw}R%)%vjqx@l=L1hO=^-IM;6_$?7yr#HDkf7@^K1K+NS#4BqPlLAT ziG)j)zmi!aX^exd$>0aR;t`8N^vOFr%u6g<53Nd_(bJ^)=rE5;=qYx8TCG)rMc*Q$ zK?Gi1!h2*+m*A|Pg zub4OXNhliA$d4rqXoP8+KC!A=k;Nn){zkHNiN}RTvMP0lj>D)UY78B{y$@9r^cajf zqCXBO#z=I){`mZiFY1`jqBMpTj|Z?ggGY~10Q|EP7Be+`Tc0T@d3?Vcgz>Q?(f_eWZ_f1qdm6$_Xm}7~UX@-Z%MUcl+@B*8vVGk@t3y}d5D@E#? z9i(xbr#Zer_}mJsH3}Ca5mtD=>c)kGCn4)0aeO|FMDpQAptJ4 zxY2Bhgy97N4lSL(LlNIR+pd(qObVEvb*`u23U(AS+j z3<9DsPCjV@61FvaTL%(xZAv{LLgSi3C!B;150QqxZsL;enEI=1{N5E|$Sl;UHzUlY ztYfYEKtl@+^zDvm6lt~3N^3XF;-g3xFh+!nOJ3Rdt!O;A;@E?BLZU(yYYAx-5q*kSJ zR<$`+eDhYSFnWOu8Nxc0g_kyke2KVTdm)w@w#OLP5$WGUMuKLfEsR-O-pM@a+2@HB zex(@faf-Q#O&O<3V030NZ5N-STl6e6PGPf0C&ohZ zu4nt6cJQ)mYLBpJ5tc(M%fYli!DHh*-02iOKvKmK{#M#nsc>TLPJK!J4K}CraZImz zd!ZO!gQb9uiYhW*T4EZf2kJc#4ef*6lYf?Ny$GW;c@I)3GaQ`JnYwoDlMdW0ZWqbp zBhPp);TAGB^*4S-B(wmjYW66C$s}ulR0G6_4{nkzq@F~~0f{-EV{-EOnZK}{e9r71 z{375h7i)vwW^>a%#8S>T;6L(mUb+%x*_pFXg|)HXi-$6V^ki)*rN3V-aDnarpho~+m^d)>7jZRBO6Y$iHhRAjPmVhE5_`)iHyAV z!;gAdwUy5Ox(tWpaoh2g`gPbti5$0o+Xe5dI@K_pYN*+Tb2^Ot*k@y-&X2p&U_)nO zd+q{rfB3$u$IZ6j0@5dZYYll)DNW$7OHkW`$n0Hn>Dx~$(Ol1P9j1|Croc$)Q<#Yp zmh5?04#2GXTwEaHroEH~AnBz5Y!|yN1u0D8v_awD=|zzIHZ?{0T*OCHs6;{7kA9P( zH09FhAzS-b90DBoJ*@yC9Qf17;hR|Dtx;s-Zv#ULGV-PZb(8cxXu~ySGmx}MpR$%< z=f@|pf0%!t6m}RYpk;Xf)I>64{R0j-WvA!lSg^kAxV#*UZwm!xry32F`7epmqY=K$ zNsZ0Hx}bdpmg?W|qgj;npD22#C_{MW|NK$Lei0(!p68arNhKeOfh%A@1SzW?71q*a zn?BxYB0N$okoHr^%6@uo_Ga<&vDJ1CQ&=zL>p6AJ4o{gc;)^?N+qN?w?O#ZtDZW$g zPhpV5rW1xb{%34Nf^C$5kME^ddR@tK*noF2hDV(rbF5(n6}>7mxXO%}-_)^MRr!9i z%*#tr^@=$DltjDK5k9@oULO?3$=Cf2l`I0%eq!kC~dfR?DrIh zbFru;kpge>KLH~88zQ~3#_0m-Z=BLeMVhL0o12%6EtM&K<0<=YA@_Yy=RMKuNq2Ng zM7x{Jc$Q4mQ%>f_%3tdKHwTTcZ4|lXA&Fu(Q$jKvYAGdh7sV@J_%-Hh7!lrKZehEJlpWJ%v~0@Ni@Zl&=zjs<+nPvyP4cpK?)Uc zSFC6fo?}P`lm|v&$Fq}!7OC-7k4uMXMKHX})kJI+`%WvwKJGEODj=sWoLJpWU?pC_ zyp!ySb1x%cDLHs-8Yu=>C59R|V&sWL zgPOWSQuPge9j4NA5KX@$o0fK-UtLsV(o`LLd>@`D&{5lU-k&NOML#6&ET&3rHhR6R zn4iE~NcCUXT2u5ZmDj`KewzMjFS2+$Ey?*R=iG^;4S4pQ`unZK_jX!*ak1QkFH&D? z)dk%(`Bkl3CuGf2y0{lPHX{hzD@epiR5$lS`PSdry}Gq|6P>kv03g|C-X-^qvWF+}>CHRvm8dJh-c@|Ji?P#j1Dv%VoY%cxc@l`?;f`j)|{ zMnoytA=g?~shZ2-_9?R#T&bMF5??5%W6PMD#bR*Qb7NbnoKB~lfX-^qkipEXtpm}i zfECdRgfrxEY%$nPr_t(XC)F}2%a=mrA4$mD%G4X#^grD}Va*ds@tpP-=dGq|%LeWG z4UMKYsH9f~l$m^opsWWp5OTO=-~3IrYN$-LL= z^3nIVSCd7K@3+yNM6%|Yp?8({S&um`>n+x?U{Ytn%TGPt8`O*mLbYFqBk`EWOjj>I zji;Vh6@{$Ue4Q^v$V8uY*Xpin7s1Bewk};jXirwy0HhM^nGyFfH%;*ynz> z7W}IPK9Z4T`JUrn%VGD|_kX6~yWwrmiRrMGxDm@p+;_C45kv`~m1Z`QYsUz=xoY~~$ShBF+2nNL1%2OWl=7xnK?G4(LO)6}@ zW=I>XV9Dr4j{U#B~M5C5d28rJ-S`6)5iHJ|mEv!lm& zhO>JW&cxNdyZj6Wcvzk(4mqo3cKisKX67Eu)JfpP9Mwr+=}z*(<1T6$kLNCQ&0u9N z^n1jsZfrd^lNs_^R<16xAC0f8_hKVr$_rSIXYN=(i|6ioc^A(NHjmI|CJJnGksDq9 zRNqV}eV8UcB|2&!*AO8>?ecnO}^ z7tZeh9TJw-i`t5oSK}RuL-7^nsDpR1WKPz6_9HA;E$@DP-~c@49KE-oGx96PqmJAA z?K7qRFU(!VmU@{7Mg!jm^Tx(o(VFqansx z^W{e-4CD_PG%A5Y@f0eod)XGY#z*h1f`Ck%tu4yOx&JPOR5?3Vm-~vm_l>JLjke>N zxrWcbF_%^TtF3k!d@!acE8o;f2&(*1_OqxYGw54YzF&}Yb#^xHG)vs`?$_13m&MoT z+0&&pbj_=I&ag8f!KMxEFYWHql?`g9qMKWm)E34_ZYLds^N*A#JpG6Z<3M%v<|ey^ zXO@fT91q1L$eWBK%R`DZvcY|kl&p>krNYabp~35bqs;90iV zaP-`D8tLIkJDV=jZr@|z56-2lI#(p@cF_@DC(BcpfxnJ=M3aYN<46A4hIrWaP_bSq zq`2%H&^c60>8E(f1yvqfkd%Qg)m5~Do-(-VeI{j>;p(0@5xLHW)t^SVTw9>J=bN(3 z7K=_A3x}_Y0Cp5AS(pK#Y!)|9dUMVS+yTo6(YaFB%o=*mx+e#E%o1a@mbqs-$a7s% zu1?)&~h2dG^r0X5#)fQfWs!A}yW@+FoaaMyd$Vf57MQgLbw`lniHvQ3u0u z2Bb4294FClhAHhdyW18mBek$TOp?_}g}F4dyyq_Rr`HCya$IIT0|xn6i^{XvH4F0S z!{O_+X_3;J(~pwp#-;opCW7AZkHuK2)lH(rN!}?M5cH$bKKKnXZ(*0tjuTlo-87kR z>RT2xSd&a1oL<-^dLrUTHUG4vur&VFgI9=urk;Evj`Ac#1a91c-xzu3 z&@?P~5WM|XYOV5u5D(`fzHcZo-s@3FM~{5qHGj1;7om0>?ih2XKZUCwalu9d;?83& z{?Lt$m{K~cN}^L^{qNN9$zQ!N5iju1yoC?#30bv{M-sR>2?ie?zxKCsd%o%u|zcPg)_vrAB%ti)H9xmTeh%C{#HA?-E$l4Z`W)A*)!ImCidE+q7X4 zHZ59OgBCbxzu6d@$XbHY4QX~*?GGpp-kDZsh+f+!PmNqwsnuhf-bbn!-mt(;B9KjP z9VRj^^*4rHU!VSb&oN(I#y-hJUA{`*ncYxH9!uRxwYJYv;@h9+-iIoMeKIFa#`r!K z1fd08Px`{nW*wB8AS(IV6B4c4gW#*lS!EGF=cZ@7)^k4_SJqq_=BJ48fOuN;z%IAS z=tGC!On9e#*z%Bs<#?Tf?)fnYg0An94B&6NLw%Jg0B1~3VW^nWE>N^qa^KYnE@R57 z>7C7T&nkPWVB~r=+1H`u-{(;6zWo`V_M4XBY=B?vi*maL0{3KXUaVHu=~lB6XUzE9 zw)#W9f@UcT#)HRo{9#cYG38PwN(h5Zv!+UKno88a3L`e5^OIFb4lRKnA_H!SI^?b?N(I=LqyXS4K@;8O}-nr;TCUZHufzHXE zTJ@zwBE`S^>>8fg#8*dVd6&E6u-@^p$`hRqRgVJ;8ACSn?5?OF>#A+3jz~nGakX*a z1l>=+jN`x)l-Rdx<-tJF9;Xi0f#m^?kRt4{zoFXdKNDp3c6BKz$vjW@J!x{@aJ=Bl z$`F4S!In?s`O8OwQrnAh11HZa98G}e2R#So5&QV47lA&UJsZp_jYAX-=aL2yWJwA8 zYwzqwK_I}N*lhE|6P>(WMdw9ZMBH08`ehXMkKBhd!k zcrzKL!ZnwTZXql*lYtJ^A-~WO|KK?c(a~7t0cPRKOp&pTggEc#JdH}Lp2&(|qVb{| zkF>4@??}WxTV>clYw*Kjc}$ z1^EU&3=T6rhY#=&I(St?Vf7=dzwbOrHZ;znSgRvEOIqHXZn6^COXTl9;haU{)YEB& zD_UQ8d$BXaiL^m;ULckLFbk8npkf4uvJ|JiHZLz1gn?L3n;0Y)`4#RXde8L(&JDvL zo%FD!jw02e_0{!^Vn^v3X#1L+Ja@y|`$+TnOZ%CO^YGg8h-N}jH2UI)dM?MZY%lN) z<;kgU?DIDbaUr?H48VGqC#;sEhUK_k8HGEe|rTrUrW2cb4 zPMH-OI3jIWuo35~?CdwHcrn7{r7U*x>vfHTSVJVu@I(ASO^!ua@S<<1l?P)PJ>4RP zX-uAQ6ko34enLD#xc_H@C^)g5#Z4aO*3^li=|ww`Nkb*Wi22l((@AE6d87I*J2YC) zy^~&T$`Q95VVr|OW3Q9!yKE8M#(a&X{u`pPjZ)ucc%wB%fhvDrMVrz?gBvWPQRBsS zDuY7^^`yMU+d4=Iv)AZ><9sM#qXK$;x(RC-#p!I5$la9~@nUO@@OlkRn?VEdK4Zgb z!Pt2bB-c1(={OwO-m;+dol)XLxD8ogI$f5{jt)1?63JCtBz2T6&7Cw1q^shI&pbsc zcErtCL1Jf(FIE}F{!Lfa4&k@N1D8f9$N72D>IwTq$CW}O_GF`IGe6ScKXXmJ?Dfk$ z{Xg!$8(xtcw2HAh@^7R~HMoOqM^VWjsbU=*2SB(_nF>@(dzAj0l*Wh2L7nntT87CJ zvBg!?m*Lb}-b~uW#y#Z)hx*ChB5I~(LG?D~#t}j71ZQYa`P+l zDkp=vWf*C}m@)Kt&ydP=V-=Ay(=_tDW~0Px-NY44)zkx8m`p!2l6y~vk!Yk8K zf9}$n{q0FO=~+`oQBvlayU$)ugm-`EN$a4AeaiNlMXPv`^$(&L6b@Rrkz`u8+JbYk z#Bk!-rU{;CiwY5+QRrw|OYvQE@&ikLe0uU`J@QdsYEnxtk$jMTJ!L!PL2AKEs#BFA ztdH;Anh{VMWkt(l=`Ra&YT*|lV{rB(n9&O#iFV0}j+Mrj_knWP!Kmmn%SOm^K;p_% zay0D@wXJyBWpDJ+DY3E*CafJp#;8mK9qn1EOadKyfPuabd@A|vAuLqI2DmETueH6I zLNnERY~CJ5GauiX%E&c%PW?1WrlS{ zoaOeB<}KbQ2*cbYz4E$FP36mIVfzdlLct!Ns+R3&EcO|Pm3mq|82>93_1ZH3TN*Si zhj(G;Y=hg`l_nkn$GahucpFf_`$S3kZ>=E1Kzxls{8p|3D^6nzsbO%(+zu~<^ng%x zoLeiNn-s+zI&U^`i^shr|CYlSz}`Q|n?~!kvEy-AuE7dIB?QhkLVMcK`1H?Z-jaeP z=q4pglB+{l2*{IJUYGL7@ep|1fm~!?*XhYu%7&IA%r<3{ zO8umI9lU-){Wr)r56MkC$>Ei4ceX_a=)lT;W z1m^e{ZhQ@JoYHrd*(5Q-3n2L!1&fySgTYU@^uq|77ZC%Y#ByK&3M5}HIrtG`pB8=P&ZtY{GYE|6&DQAm~3AN-gfmoUSm`PEKWNM z2E%&){1ht!yx(MD!9VrDeQ0ZFCC4Pw$Pd=YlbHDPH4v+#!l*|*lUkc@-}GX_ly1xM!Q z<+)0zb;VJjq#Ni(_g&3PFoZKiNYxoYuNYLQ%*5$THND0*4Xf+gLt7n|A6z@X#*Re> z=Ra`J{Po0Bqh#(xESvtIeu(LH-mwfFEf}_8&JcS4)1k;5Lo>{PZ3~?Rc+xvWgQ%~=7M*lvF zs&2^E51}4c_EUAsq6W%EVL)eE{u(JK9OR+HAm4cHUksjW8OhXR4YbLOHFav=*$GI^ zsCZ`-@Qz9H-2-30I@Mrk$8k6{e6-`@Vm^IRt&8W)eTA4Nz(ZJx!htHp3a+HY6X#$pON{T3#JO2e1T+w*!ok=%;fn^$#z#g$CGXqwkU zKXxQpc)Tk$S?DT%y>K{!%yhoyW$sT<$MN*|_@ch?Y^B2G`IHa)-V;_Y9V_JaGP#_FWhT)bp63fu}tsilgy2%9E3e$aqfkL6~TGS&O_%lYc|9Wf}BU)SFzoNst+w zD#Z!Qp2GbKmUh<`ul6p!n4-hLNhO-*cUMQvcb1BXfTw~Ug(RZ z+TwlP%pSif954HwvQ?S%qr?Xu=j_(-5&I<1kCX>xurrE3Gg~wVmm`R_%E1^m?@!a8 z{MGY@yV5DgJWsci9Ff;7Sr8{X`2btF!2UP5gO}TgE2h^RJ8xN;fBZ655&+jp0)gVrBS7Sf-Pm0(Y*1Y{gq47k<0B7m48IAAK!NFfMO;U5RA5Aj5+Xi+Pp_e3O4Hrx~BIv0SYY2-d;- zi@7%}!ZPT=?qw$bIp9qe+@Mzbd*~OuemZgLlPlSOf7|<6xejoi7(MH5JkJoCpUBsE zEUeM9il!q#XXOz;`OXpf zV$EYvMqpEClHe?lMo*?Nn$>V@4abu*s}#m@Z1LKSCy>h?6Xo%yji-o+liwJ@;wLkc z8GiHHx2EzZgV_DlPBe-cLgzUYX6e=8!toH&Y@baXI5J9vF`NI%Nv~Qt+?@1Y^?coO zBn$)Z-erT!Y#?AyW~P3FtI15n>4@al<+kNeh;LAEH{$c)piDR}sc>e^NEvo2g+6Yp zwRW8H8;R(;*1h4V|Gsnv|03SiD)854Mro83uV!T*<{CadH&(^X6v_H7JajiH_;+w+-*Z1Cr$tGpqD#? z9?}aKL1b4ZT_KtaM>CM0XQkzqsgiGkAI%;o2xakrpSR(O9BtS$EEt0r4b_ZhehP>m>)xK1 z!OJo8QdVtfn>~vr`#KNHAnV%yq}n_ivR6SoP!gi5qVaH3$z>S;#Avo`+L0sX6~OVH zRTl=`s`c{s>P+_witrH&AS-NV)vi#wb3KAnD1<5xaFtjCwug?8BxqzHR=+}_z^WAL z{KSgvdA48`j?xOSI{TE5t_rL+Geb*Y4Yi`8$;blMr!^)8D^pv?(MH4V^w*TIbrkgM z@H1>_qTI8h3=GT(Ahd}ocC6$%Ov|;oX<9n03`v8h@uUHunF=edGsUf1QX2mJj z%Kw9)+o&l?h+s3X&d$JPtIcp`ukRY@W6OPd{cFyyzIF4H3Rn2SKHE%VF>01f>o46b zYy_8bEOVKGdaPqy0cVVRMD+I|u_h5FMoSvIsVm7i+dDP*5)pglQMRIMWA;}^L~r(* zMdDVrsn0k;W085gy2FNJ?N|>Bpr(wLtWc#?3KR~P&HI8obI1o6mzVI%u^#%z*)M0ED>$J}U? zk(JXW9)}rn3}WFP!9Pgux<;F#+C_+Zb-C> zVx&!<(vZ91h}TnP-jIpcv|VmYJ&j^G7^UeIhiCfKs1EKqV{yYb#nf*jCa<@=pI$en&$;}ZG9jDK7F3W>!ZQk}h}`kR=n4-P_eX9!-#~=- zJ#-+ZJ)_YOtg`(y7^Dkewhv!v`?v=8lG-+2bPs1}ud!2d-jiohsD@Zpv~rY6;hB~| z8HbEmxu*NUS^J}8oOUt3j%+Kr6|8f7p*R6Sbf4{k%tyxi8nH5# z6%fkBn5uV^(tmcq}35tu!VvywM_RAa;A$ILi_@t}gVp zjAe{TLM@KjbZgouJAW1XQZSs}W*6VEJ$GtWsDDJBgMMPXjP_D^TI8j7rhUQ6D%KZ5u_Ew?!vXm21Z}&{A%^Tc*^>@%hllxI*K>zb7h5l;w-GXIv|9(437^Nzz4M?7mf=n?g$ zLYPtW`;(_Lc#r*qH2CO^n3JX+7P(^!6R(!_o6%4JC$`L*gLVvc#XI!y(?(&LC0o|S za{hFK4xP3=EO)u^L(v#@nTxcNxbyJWUzF8Tytr~+VpOTetLW}WkAkZ_*oRMXhlapO zA09Jf04}Q9i6&%1texEY`1_>15Zp0gdtQA4jM0uW99Cba`a(}<{q#80qHmy3cUUyp z6O&0NHGzZ8s`}}EkbOS6n+V(Txy1prNZg=WVs5IOgQ36p_<=Oll-QJ(@{f^>D8Uk+GQ01bT`%rHY=-O>D+j=kowNStZdU!Y7i6pYtr4Wscy&Z(y{NJQ zI_&?zXx8YmB!<74b~_+(`1uubjF|7&<3(;VJUwSjF}~wqs)OO~q|swsodH;?N-Nci z&}d=(y%gWsgZD>p4oS>5)7((mej0si^72_i>4TPGnk9Zc0etQvk)uHt-xKrZmLyJDLCEk6!+Z}nt>P|<1LdQJ$asqa7S@nePc7S2Vl_A4LWscpnamjPLdzxAJ(Diht6kT|fp0nc=)O5%azx=tn13!5gu~1gk)>&5l z)pNryTgCE`B&*-9noM(ZzPN&G#6p6zE-2OOMC?TD>U-e#;`v`EkIO|kH?3l{SBWTk ztD~WSmF7R7B6J0exbLC=5r>T=u+%?4pJ_%=B%N}+e5-(UDolLur4SCvfAmLz+5j^{ zYfm{~nCPqoRF+V?E1cR+)UQ)(;z5K&)2e{Up17wARr64B5BgVAY)HeHG# zRNPo88bl82hf$4*L@#HMbLCaiv0~7Bid(c`=t470ou!RmM4QI7Enjn*pMfkMG2Unw znXfQi?H5_7GM$SS|J`G;&1F)7a#O*JzO)nn+!_?iL)j%F)TEeQx2eDVM!3@vhw5-2 zZIhf8RI7kq-`6$=XGo~$p=*8nV5%K=*-sjHD`cph1*C}k_rw~fviHG~1cI$9sZ>$} z1mj?PWrx?J?rm_QkP!Flxa?^hJQ!v=1#Zg2#{!R9-$2$pT-p~@v{k~i6!i&dc!{Jp zxX@40SW!}~JR*^`!+0dn#$8(G$GTA>rEu5WgkI=4(a5GJg2@S-mM6ka*JrX1g6@zP zq=Pmd2aEn)$o%X>KJmWtoWh33FquYU z4mlf+|9FUi=@l=QBIcZlu&*0<(xO#^(uJuQm%-_JG)R;Ua=DMZA~IT-1Vcnk9LA3^ z&4)qXijl;Nu{BIkPRuopM{YrcVet@U-Zs#2k^W?1HF;3W)EmIW6b}}mMV#EAr#ew9 zk`QZ6eQ>Iak{;>0!X@6_Yue=aF)3UHs<+j<5p6`rEZ6Y?wo)(5i>1O?Lv6x>Q24c zZmscefl?V#G=)7hcqY7rqB*HVv@aN>@?fQvHNz{xiLZ2NL&SS6jhZ$^-dwCQ36o=< z++eV|fEP=|pXui><;t?9@sBfL>n@WU@vr8Gp$KETXV85%Is2=MdWsz-K4$``9AViK z=-@P>e_9kV+jo?fQm{%t<(&T!+|csvNmLx6j624M8eL>{osz(fXpfl^=qO=SQ(-LEElt+sa)(8? z21RRcB6S^M0E4-y8N%6OF9vQRJyz0 zs_uA+C6r0Lrx6Zb#mB%*$=_9niJ3~h#VXLDlinyroJ`3PYRv#FtQmKb!GxC+X}GrP$9f3+Y@xe?3>>!53#BGXSYn*$HPg1EDmQ5_ zIC77sGiGt#G*FP+$P|6u8x$tjwcNyK7B%FEtRrxRPWM1->7qY6PEtQc!Sr?S@bglx zlk$TXm~6<$SjyTS%XFcjr8e^QG!P6)zD1PZVkTa!%#JlDN`~`tH1B2N+{^0{iesA8 z#DAj4x%u_+1s!f0X$f(kKQh9dN(FaUt|H#z_d003}2Uw}n407kXhP`%bry+&_^ zc3YutQ;z=sBZJ25XBpKZ;NgLGZ{2Ji9UPsVT;1F}JUxAVeS?F8!@|R3Vq>2Fb!BE{ z<>ciS6ctreR@BthHncRi_4agr9Bf1l7fg?)&LI<)X5F{KPSAh*nfVxFM%{-uT4p2G` zD4qm-Kmkh!fFHVm1#N)bAz;!9Fm??Xxe5$h2E1DWge(Dr76JY%0N-aV0{rFy{&RqU zS%Ci(n*RhKU8=1Qd7!O6&o(*1#q`pf>&g z?92bLfIuJt0RfbfhKgGeBo~LK-U-kc0B8;Zw1)tC0|0|QfKea7v>#wT0JIncn0*A8 zjsnb(0813W8VRr-0oV)!Y)1h0BLIgHfYT_zc?95s{2#d@0dAuJ_ff#xQGmw?!24OF z08bRaV;t~y65ufn@R|j9&H+5;0B*AY*BOAzG|*`V=r9Ykp99*@030R(_7eb`aR7V@ z2%iPO=Kxl70E=0G*(|_h24Fk`Fq#G!P5|`Bo`q((jAMNNzlCdjk8Au3&-k9m?4H)~ zn#1c%GU8M(?aa00>RrPPV(6}N?WT42qW{YQYGY%1d3kYjYjgi_@9g5_;_`W2eZRWC zzP`D=`M-60bNhek?(XjA{r%&gKmY#y`}ObN&%gg3{{4IU|19h$z(4H2D~cr_B;VuX zULadaWn)5UZt^xg;3x?a&YP`r&(w)zYRMRMaxcQ-43;bi>#XdNE4Af#w zw>=~6$1jUN_=jN5wSyO42?VUN=(pR~u2i~jRw$R-pRLyEH#!$3RIyXkTObpPWFT`S z&9*Cb<^|aarfj-jri)a&xiWjT@};)^R5XA681~|q@BU#tf=Q!gE1OpJWmN!mVh_68u^m@W*GTWVp5p?y+~Y~EIwxyHWHsxd=d?h z6W{4DU5T!DG(%0WHv(6qj^;VCS;13@%UYtvh->Ee?I_2}&v;P^hn&Ca^~=)VL<(dA z754HJ(hTYHRO)&eMFL0UVAa6IiW5~iP^aRD(6jJZ>R@OeSX%s+g`^z~ggvd{B{m^Ngut(!h+qx3f#{Ipv)8ui3IH_Rh}2Dw&4 zV0$RB8r292te_@HZinKc%mXjdwW7N;>Hnc{-lPTO5XNiRKJS*3)Gekpk&K2kK3|~jeIG*n^qizzENU<50VHd8@(3bkj3MY!*pFfzg=B&hsWQ z?=O7Xs(Img;b&A%NS)yb$LIcm{~}fEE6@H*zMx62e!B4%SSnZl;^>AYGpk>QMz)(E z!qA}h{*$>qdDXT_MEv3oR@PMPD-b7Y@ktu5v^GuVrSWR)t01|GrM*|7av6&69^*4U zNHDVX9t6?!F_$LhS15jn<$7E>j$wL4Xh$9M>QN(_r1doYE3QP(3Isd9Rq1Inp4FK6 zW+~JS6r9!7*L6MCnd$QIo||_teavYbkSS$vS^Q5wmv{~){RW=JDYn&-XBQ&}QfgTz z?^;iRP&yw}J<|=!?9PXt=VDBf?ilxrk;xAS-%UNm(cirFW$iai@ycw=1gbepLA8gm z6bB@x2zC=ti*>xIan1wD5>b7%aiin6-Wx?Dv9> zx>Z&gUwar+ftMvF+0{mDIitj<5|)3RWRy@qfkY_?&L`9O&`-+$%}(PjQl<$B(B0+H z5k|Hud-#09-j^Fqmt>sw;#9W%0A{R_K8n%`YLWehcGN4iwf8cRW=E50i&^d7NhjB* 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
  1. 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

    m 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%0D&C(#gHseDrG@|)JY}6gq&G<0?F{4@7PpkgicrF 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 z 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

    =b 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¨6m(x9s6C7RU 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 TlNSFX}JkuZCFK|vsb42zD z=PvSpc0<7$nCi_s!P?!6O%#h5tOhf$xM-j6&HC_@r=Jwv#gH50efZfmQB`5E1?GIK z$ok`hac?x@123FbmiQZU*Uhc6rNPRcrYN&|u1nsUQ>uM$|3H%yBlY19tGft!n1x<( z1xu*9A5xzt)yo~8ILKnO$n3D-DVrsEjj((+2B{wBF{gTv4gR^pWn})!WK*H3cYAXE zjw%&tbUvS;nLyyUgr{=L*e%9%U=>*s1sELD zOXkAZ)q1@o@erzR_6V+yZ~)!=Xz$de;$)4%fYLk9}WtL4es! zfatCChrROMDLMP3F`dHbXQYSUPqU@oGdaT)ly5FUMh=D7_aX3dI52WTuc6r1dN}yT z5AilNV@E<6ngsujZYcRpNsrqMN|W{;B(#n<$BjSDKbXmQkyrkxN?K5H#Vy#l!L2_Y ze?z9@&BzVnWH_TPq`5uZ!(;TR0M(nI7%{VcS})FEM&DDQ<=(xuX^-4$xGyohf!I|Q z@nZ~nZFYOzGp#kacs&QQiX+mp>@HQL+|;WIUWK&XHCz1_pFa&>z52`I{&tTQ4;rTV zR{z;FLj z=p+)HPiE&@8H5zw8>s`_Ch;yr%Y7TJ=&mCE#alO6HSgUWM1x<8uwsqxAc>0}l2RjI zvOU^^(8GM`0-~%5-~J@kUrKAfrhC6WuW01P`4&rgG9$0D4t4SbQK|-Le#Fp_dGWla zVsiT8g=cfW@fy$1&4jnJPqydElw?VM?WB)y^*0oS+x7pBmDje-hc4*;`H}3_HES!l z(7ul=Xw&+f%%sigj4RN&yqD70d1ec2xh<8mG+k5N325JW!$(uf#9-3f+>?uk!sFtp zMmL#^L}GxX>uj1$Q{rUPTr^sak5Upq!W>Xj7L=)J9piw&JZcN?APC zj~<5)CrU+PmL12@qljvh(3xbiU<(th5HN=q&eWs%be*2-;R@ukooXUZHr{~AUXpUF z%`BaQa?Ff{QI7McQ_I|?{@OX_wKy8$ob0{@}FP# z2g=#b{|3_Ev}zQR55FMes46Ue3W0&}7KK3QyU4>-+0F~YFa-$UBGgoTK#_#-U=R+J z*Y72{PayUZH8gr|Ee%*rSX^;wg=e!^HW4ZnaZ4<$WGo1!+L&rIDC8JROP;(~QeFi5 zVo6?iPGeco-~#8Pmn6XfHc&}uQ8HbKoe(H*67Q2H3Le`?`zl4(ek4ss`gK*?kt2jU zk0HJ+TpG-bi-l#OTZUI?hUTGS5Hfv&UmWzHd2Sd&&yZyj&F{Bip2$LzZIP~tOjJ>1 zxt48R>FBkEUsSTDXP*@aA|_}(_(|f_-)@)p;iH3Z@7BJBOyVrOle3Mq?D`<(weETV zIwKAe*&dM~x_gE@+ukGx>yFT#kBFZ>Wjn6a!2M+JIao4f9&21PO17C3j zvC=t9B$UVjsGrp9cQ}wTB5gDi48p3&_deuLg2V#(sY>-R&{P+OQSd#&M|`Hii`lYy znz)Iiga<&NCUx_uH2Hg%+5lMXRa1#a%$9nFtDWQo`1|{F#S|00*r6&EzDARn1!?gL zmSBxq)=Jd75+v{cfov&$z9RzaNoRZ3L0DUA0*xgJVZ^&366F<`xV_2aUJ5s|Z(v z!C`~fL2cuzC2#)el%El4OOfDJUE5_ge!bsqyLCjsQ~P)3j!ikJu`u|b6Zgib6l)n&57U@PV9y8cv_&@)V$!rTy+xaZDHl`VomHxLUw2jxY+?MQ#@ZU5xZm2FZ zl2uFUa0d-fZ}g2rM2iU~N0yj)wW6cr`@R_}uv30D-l>pK(Ms(%y-Gw4S0JaNy_Q7o z249qBr)m00bSa4e|1BRqSj;VWV`S>3iEptR4Zkd`d(PHcpm;mfyJ&;dGQB}a6IJ;_ z!@7Qb%t-`s3$LRL(69xnGO*HExbZvdg;S)HP{u5H2(=bEB)u~-c*FXZQHj~&p=@T> zlMHECZxTgP3*A7Wl2V|;4I+eCQu_W$S+3wnm$8yGreY+@=zyk8_lyWCIF_9)&`3=` zzP5ggos2#oEhX!ww*|}RvwNn(zXSNKSO7K`<0)o)RBE?k?fgtSSM68j*QOGbiOL&c{;Z-Q5B&FPhfH;(~ zRP}UbPzE=yq9RDqHRgHC3@l-kXc`S`A@#>IT=vqfTxRM#TI-FIv|N_T{xao#KeId_ zu%%MXE@fuRI<1Pp^dp_EF!_zkO`WG5BUp~u1nMhZM%*7JyN-aOg70SRWn7Zvpcl&x zIsyfWe8()0Vko`knziS#lpudbJFpL{R*d0xg z!c1ns+Kn-ej^>0wCJRc&%_+5xmW+NTE6&=@Ik%41g1<~Q5{z4mDIIMU!pwH+wOgw# z9qkQ)%ns&^+nY-r9UcA5PVTkayN?~61Am!a!WefBusgfPg<0HEYj;jKI=jCIvUrp- z?p~;M_N?`@c(vB<-ne!4?)_!)8DZReNa^f56=wBYuHAcS>FmD^WDPiC{PDWfIqEyW^NJ~C11Hkw@Sg-MjthjdXxAZu8~8Rp!^fF@gk?=cU`D3v z)GAQNv@X$AvXn8vRl!<+E{5N;%vB(!Z+LK`RrG@ER1n4JSEMC^f=Bwc-&SdUW2Tk` zgJlnq3eU`hvXf>MAghyROnzaH(fX#hHg41m!l_Txy57Qc?C{i+Vz+DiZh~`n-y)!~ zyGBM{vb_i4>FTdfF#FWIL;Jq~e?Wl0J_IxLYzRY`!^^`)ax&bFh%S5i6^3}Lp98IL zFT>j0{uVJ0Osx-eEMwYiHH53*Yz%1Qd*A!+_rD|lVNzV1-=w%W#xX8xFUJGSaqYn& zLN4-=lU(HEhPcF2p5baM+ZYZX#kloxjC&K-)hJgv&L?~bm+K=Qqd)|r%N+7{_q-L_ z4y?^{uJj2LInVl7#;@ht16a6O9ilio4T=%;t()1+Wj@E!!;WAgD?1*{#w#h>-1B$S z;1~{n{`;TbA@;cwSm64Ag&|6=_r3D~=3Ztvl&LKERwx=BgC9KI6A$2I!-CI-fIFb$ zf!4mm!mTuK>$Te z%kyA6DID$P%F|#JPJadUt*?IgiXIjje?R<-q5ZkeVB<&bf!*BCT?2+kmRp&L9z-CDT&3szh)m>>-v zp?DpF>h&O6}f)}poLo86A60V>TT3-IS0uQ8~ z%&C<8URu?k)4kd# zq~RPsB6HE%0KT0gq7?(a!xpZU=xJFLx}BT7Lm5J%C<>P(PU5~*;tT47y|JM>EMP1o z9Qm=;4E$g$j-o9J7b1*;F76^P_M$KTVkQEcELPl`b)GDa!a3mJEiNN^!NUGIDB3$D zg9Ex%95SOdUL!VUqc(0MH+G{pej_-Bqd1NuIhLb2o+CP@qdKl5JGP@cz9T%wqdd+d zJ=UW=-XlKdqdx8q)g5vP1dAM-Xu=u zq)zT6Pxhow{v=QarBDtfQ5L099wkyHrBW^>Q#PejJ|$E}rBqHORaT`{UL{s$rB-ew zS9YaWekE9jrC5$7S(c?)o+VnQrCP2fTehWJz9n47rCiP>UDl;t-u@+C=A~ZlC13WX zU;ZUv2Bu&RCSew)VIC%8CZ=L8CSx|HV?HKiMy6y=CS_KpWnLy`W~OFtCTDi0XMQGV zhNftaCTW(YX`Uu(rlxAHCTq5)YrZCI#-?n}CT-THZQdqs=B94$CU5qpZ~i852B&Zi zCvg_1aULgfCZ}>PCv!HZb3P|@MyGU6Cv{e*bzUcSW~X*;CwF$IcYY^$hNpOrCwZ2q zd7dYFrl)$YCwsQ1d%h=p#;1JFCw_p602Z?kS)4sh|ESpa!a-4l1D*s-Ye#q9&@ME-Iros-uc$Jgh@H zSVJ{XgQZ?7re><9ZYrmCs;7P`sD`Sjjw-2^s;QnTs-~){t}3gxs;j;#tj4OW&MK|e zYN}R)HKfBjD4SzOYNgsLum-EJ4lA)1tFay{vL>tkvMwvLvT8N#>SE$UIy5V_R;#sM zE4F5uI{d1)maDm*E4rqux~?m`&g!!o=Crn}yv{4V)~mhVE56QZ zIuK^O=BvN{E5HV&O zcC5#KEXamzs;&cH;sd#gEXt;=%C4-#RztYn<;1eA%+4&$)@-^)>|Mr#&F(DE_N>n? zE3eum$NntQ7Ol}9Evk|%UY;z{Hm%b>Ezwp3Ug|8=R;|@uEz1V&Tn;VPcCFWb?ZYZ< zUB)cfmaW;I?Y!dbTv`L#wyoQ~ZMj;*T{8YH+}5q#-Yv08tzF_R-}bHF%IaPIt>6wW z;fiYD7B1o@Zs8uT;x?}1+AZTguH;TG*hVhpUM}W3t>tDe=XNg7Zm#EsuIQ#L=#H-G zp6>n5z~ekw39f*#a?9Mr)cU;;64YV6K#?cQ$gZt6B<0w36c9MC}?0KzP^ zuJSG~s=jWgc7h$if%Hx<9OOarW-9bj@AO))rpiJdXs`6vK_@UT`IfJzI`5`}!W>91 z9{j-~_`&+Z0Uk61rm8Rdx-a~)Fa2JsFWiCj+JPS|!XHF09L#|%m@fh+F#2lh_rgIV zY{R9>0s&_NrZ(^cNALt=>K{mNAN~l#r49ohNUt9xFbR|I0%NKy$N?Mxf~IDI2uH9A zvv8)mFdU4qrEY`&>cRd-u=L(R3IA~Go-hjgK`&@3C`d0K3~>=>>Jh_167w%0jIXBB z0UXo;5MS}>3Nff^g7p4DsB$qJcrmEXLL5{t7N2qGYO$vZLj!{XsIsy2x-qEwf%Gl{ z8sBl|sn^QUe@Bb4zReDX4P zGu$?Frfx$UgQ_^kaj0%E958}6uk+i2bEYza^kPD&!ZRGmGpIIkAF#7NpY0=Oatqfn zruy>?1N5Z|Gzv@a9_+J1f2|r1!y@c~L0jq~NN+MbG(>OeM8iQcQ-dF0FB5a{LWlI# zs&PhdbU}|ZHI%fbmNOj4aTD8crlNBrh%`+~J$cvo%u#PQ!st^R!Q& zv1NeX+IK39QUIsXVH@LPc_+B!&gHL#~ zLb!f=H--LZc(T6hVM?opf4H)O>tgyUh?h99K5Kg?W~5FkhMTyHhbpe>YKlK9jn}x1 z-#CuvxQ_2QkN3Eb|2U8bxsVSzkr%mil~=iym*WgoAsm3_8J|>BCxtOaeibt!2k2#u$s)!%vxTd+AuPTT0>zmK{s#>^#(>b1_s+})) zp7;5w?)hAvxt|X@rUE)#?l++)x~KlPUDmgvKf0&p_ku$@rFW{KuVs2yx~5<1j34@@ zfBK~|x?Hw6s3*F3Uw5gOdZ)J~qNh5fi~3s%x~t>)rJtp7&w8aRcU_V?uJ`$=%Vn=` zI{t14dxj4?u}`?MAA5r*yRsiRvp2hdKRdMZx3o{YeOJ4+!#B2PyLxXsx0AQGe|u)r zK|;T3xQlybhj6*K>bawPUq|w~uWGxyJ72?lO6S2Y%fVLHb*Iidy`%N_?m;Kq!5;X5 zAKU=}?*YGSs=xnxQ~!Yq!$CqH{2llKD1gEq$blT#@uxPt!;5qzTQ9tKLd3&?9fLyj zK5@VEwyO5RAK*dzax<#BJj{DCtI~YTfBfar@w$(E$=h=zi!rB?b~7}v^ya}1pK8%l zFVd^((r<6l>%8J}@wz9k&r2^IT&n+S!phg>t8xPPZi1?Uz4nTIs**kRn!VIF{w^KZ z!S#Z|6JLExTk0&deb>|Ft6l>5&UC8kz4r1ws`@?k0{+@3F7aM3)oTJY3%m+*Jy7fW z-OuH#ZbI0rD&?2G$~JT(wKUbAmwqiQpxzWlDf(z`w$ z!2aeJ?nLiF@)B_9kMAseFUJo(%ctrr^no4JK_5^yst$kgA3v)qzwsk~?HBF_+W{zG zf?G>GHTduE1HactKXqe*3hx0Ql>Glnd?(oR`3ArD2RFvMb;-wj z9pu3x%!0jly!y{SKu{AnkYGWB2N5PzxR7B(hYuk}lsJ)MMT-LWz}d6@P+v!nA3=r` zIg(^alP6JRa% zMwJS64;`RJv1ZkZa%xwvU%`eIJC!Pb+$Cf>Nv1{8yY3J6xoA=n;zq$4nKAd>*n!u5(G`^g9bLR<@M+aH$d3Ed8byt(V zU7t1V-@%9XY>m70bmGycS06ZC`RMD`$Cp2!?K=0#EE3!7|ga=1eu|tP`SYtVw5`Hr?#g&p!bTRM0^Q zE!5CM5lvLlMHy|>(MKVTRMJT)t<=&>G0jxdO*!q<(@#MSRn$>QE!EUhQB76VRatG- z)mLGSRn}Q)t<~0Bam`iNU3u-**I$7RR@h;QE!Nm$k^W6q*=3n+*4byFjaJ%esjb%9 zYq8B%+ikh+*4uBv4OiT8$t~C1bJ0y#-F4Y**WGvFjaS}z>8;n^d-2Uz-+lS**WZ5u z4*1n_RzYPD01ys9fQ1=u*x`pEj#%P}DX!S!i!shvyYc%ZFWVWOFC+UcjEj#}!e zsb)HWK~`B79#jCR+Uu{u4qNQ8$u8St08l~NSgy@(+wHgEj$7`zH%6OSRl25I@4fl% z+wZ@320#^H#Tf+f!x2wh@x=ijM4VnzS(@?5{wc5A^2>z|AeCJW$K3PJK@VN@iwD8A zoV-U*UG>#jM;ri|X$=SU)@iTZ_S?S(Ae>oc$KChefe)T%-DB-t_~VgJUU`g(clGq; zp^sjAH+8(gWbS3m_Wkbx5G9;r~#KnYHef~Xi3JQ7Gj4Q`Nr08ksK zBFI4zj!=FU3{?h6m_ijw?}49M#R|0t0QkWVh78Qwr}9@r+3LZ2}BJ0MX4k=ENisAtNz&rHuLIB**94M5SIfxRDC;lz~AKcUn$5=aZ zlw=$N$XYxI0XuUDv0`8xiWt*~yBl(fj(HRvAyN@YL8jt{;t;?R=dp^sc@biSK*b{= z8A(aD508GV-4Zp$NK1Nd5Rqe80CwlYg}I_5#yjL3QTD(}ZjyB^)KocGxw=8jLm$R# zUjP>dfd7!AYXBgnKGLDdPact&s*EM=V5ccG9+P`q90VacV#S70QWY5@M;{^P%9N~< znWNidrb5`wKdM6?^H|aI8WwlltVe%H^GTXb}k#l zNl|)Igt5XS*L0%8Iyp$0&NPq*EXN>2YB`Tq3Zyxm8vs&)j*iU3lNLh-IVFnE18OB6 zKBe4FDfLpP`t5(>AVf;BnpKptR3GtRq$>Ow))nC+to}U5R2dflPN7wC0T@R)2m#8W zyl@cVSSH0z3b8f9vS_U6DO=~ZR=~P0Z=oz}SUa-JcLIPM_`sXP*7%Ou5f7b%O&q7B zYFWPRj;|E^&s{Ax2&9f6&C*zWpGyOA2`dS^S=vvE})tN`Qbc)N1hTcqZ7syQm02pa}$Wrb%VtWkY428<#0HA`m z<@9Tj$JSm+y%)<)YoAs$2>^VYgKaw=M>tq|NeD$Rn$eAR^rC~y3UtIH9_CQw#E5)ooRtxWn)Wm+ z<%}shf11=QBy=WAo$4BDxl#aD^{Y8ZVNYQY*0t842S?>s|Ny*TEikv5%eXWjFiT(Vlj-ubu5}cl+Dn9(TFVo$htV)h7VK2RzUr4sK|}8UP=7 z!4IDBg*W`+2j2!a#DNZY-~%8&VRy+d3lx61gBuW^dChO0^MrT99sB@_$&Vgbv+%JONA{`IjBcsKlE`rXgeEbx$h@n;_o(f9uOA(e?ZjGz72k3%NVAAkNv z{h|H!zdrZnpZ`Mj!T$YkejoHN00D&${I39qj}HVe0kebv4X^=m4*?Z00!73R9Iyg! z&krOp1Mg!IEU*JvZxJ*w1f$~<{>}qUkn`Fg@pu@j?@D@COf16L@e4)xrgV@CXG@28nP9v4Z}P@CgAA|Cn$JQ(_(901BZH4zPp@ zxlkl15DTFY1G{hxLt_2F@CoC94ArnB0O1U=5D?ao4DG-H+kg-1zzsLg4&ty2K_UC- z0QC;f4rDu}=v}aR_H2`{cm*^g$MYkMP=H z5cRI4>R7kr@HcKHd@V;&J@; zpdNSd4%zPw_>Uh`!XFP&AJh@>*l{4;5gr9n{OUj4#QGb1oG#m^L}(IhgV^9IotUQ!nS!!6-b{2gW)P!T%yuP&W46DpArG$B3J6D8GCJ%JPc@oeE2lXDHyP#=6yE5DQZ z98)~y4=mXa5k+z@^#Levk33v)Ed^2uF~K|8PcHdW|Cmzz?w})P!7MRzKyU92IwC?Z zazgdNKi`rjx$;5vFDJ(j{`7%7FO)!8PY+XZJ`*xU8Fc)Tl0@SVB%N;#?86$&@GLRZ z_8>4aFB1Q3usN}hJ8e|{7!v#7@I|NcM_G?D^+75x5=DbCM7Q$#Ix+0ltop~4FJ;`&QT2apbegK8_d#3uP;Wq6#cI8`bM!J{~#0iv`_gICH>S-uhj5H z@jd~sN%cSvI>J!bph>+n_~@}t&o4W#j~Hc<6N>)AOWh#)@*oa4;Sw%^8am<*Ftr%x zAQLvB6CxxOv5z_>Rr*Yk`C_y}0k2et!b_Xf6`#^0Y#|Ri!WP`X4T6Lk-XJ(%HU8c+ z_}+jIJRvf!PTH6m6(Y5=?)DVHtMeEi3+7MrXuu1pT`+C%0U$8y{*88NBU^_584_5lD zP+?C{3mf+QR1{(za6cy&RxQ>7aWP}Nk5M-z4mLtHf+UqY{|B4&Gu~3Hf_~*ZP~VM-S%zaHg4s1Zt1pe z?e=c*HgENIZ~3-w{Z?(MHgE-Za0$0?4fk*nH*pnraT&L99rtk|H*zI+aw)fRE%$OU zH*+<2b2+zjJ@<1#H*`gJbV;{#P4{$BH+5Baby>G{UH5fiH+E%rc4@bEZTEI@H+OY+ zcX_vWefM{((Hd+46lQ@M_yjNFVHjjV7Knisfw%WS;ScP94>mzm3u71n;} z-S_yCmlOCve)nJ#w!tp27Z2coT{&SGbS{8nFCK^?6Zk-V$Cnn;;(XJ04)`Dwh~a)E znD?526ZU`{_aGCRL4<=MdG(in_ka@sbA-Du9-5&OE;tVKKoe%zC>FSZ`JfY4n1;R2 zhBe`W=|B%Mp?yt)gXh45d6{pEAFCMC46Z(J-l6Z+z!inji4>qA1q*#uTk6ihH@Ad!_LbxPc zxKrtX4?uxD1Udim!;Ja-XZ0=bi? zZ(Hq9hcRIori+W?pbi}QNmx1l##I(XIS%sR5&(EW837L%&ktllm2)`(@nIc0!4K+y z4t|*!O}P&IKvl&gnGSpxAP9-`L{=-@Q>`42!L9e=C3>PM zx}q)mqA@z7HF~2tx}!b%qd_{PMS7%3x};6|q)|GhReGgax}{zErC~azWqPJ*x~6UV zrg1u_by`(+p{M?R`lo?9sD*l{iMptb`lyjQsg-)EnYyW+`l+Ehs-=3Wsk*AI`l_)y ztF?Noxw@;p`m4b@ti^h)$-1n~`mE79t<`$1*}ARW`mNzQuH|~J>AJ4%`mXUhul0Jb z`MR(D`mX^yumyXt3A?Zj`>+u^u@!r<8N0C^`>`QAvL$=6DZ8>Q`?4`Rvo(9OIlHqx z`?Eniv_*TgNxQU7`?OIzwN-nyS-Z7e`?X;^wq<*^X}h*<`?hgAw{?5BdAqlL`?rBR zxP^PTiMzOs`?!%ixs`jlnY+22`?;Yzx}|%%sk^$Z`?|3^yS00}xx2f)`@6wAyv2LG z$-BJG`~JMqJH6F=z1h3H-TS@aJHF+6zUdpYvmt_S10J$rsqcF`^qar&+cy4Nsry?x z20WsS`Xo7W}9i9627`s3ROWCcLOC{5LL~s53mj_nWJQA;2wM7>+u`?*kr4 z+^9|5Jy5*FMO?#Eyr@^aJX&1EUp&8KoTz7m05cOBY$UD~C( z*fr$XuRYnbec89Y*}MJOzdhQ+ecH$U*Qq_KtzAN}UEQ^v-MQV}y&c}cUEal=-pSqG z&Ar^w{oHpU-4kTp|GnJ<{@n*Y-V1)-55C?L{@xe9+WFnz0R-S9Uf?I5;49wXFCO7D zUg0;M;XB^p^}XL8e&j92a}xufZ){^_g!=Al04vwr7wzURCC z=f6Ja8-D1OzUasP=*vFo&tB@cgX-Jf>fb)<&Hm$qeeQw2?$w^|(SGgiKJ4+{=%1SH zrNiw9AMOhu>#ttx6QAq1-s>A5>>pq3^*-?XKJx#b@ALld_g?P>KRO8C^9>*L!LB z2r;6>i4H4Tyohn4#*G>=GUNy{q(P6nM4Ajq@}$a+9#^`AnDV8}ku7K16d3d7%$z!3 z^6a^iq|ll`UH&X;@+eZ2M3*LQ>Xd25s86R-m3r~2NTpgMa_y>csMv~NIesmB@GRPb zYS%7=>K0+!xO3gsU3(X8-m+u+mW&G%E?~BT2fwvym?q-H1owh<+!eA`$yX^;^*fev z+QNw~NA>I!^it7CNf$K@6m?J4Ix&mYtT-#|#+(hazIoeb?*5&%2k(~o+h=dUu7}R1 zy%=_Iqr>SoxBDD#biLF0R)2gwa`ELsvrqP38T@7OpUHaRtYk!gIHNa zAWj(y2x5pHf^?!;BRW{2Z!3Pd;YTLEh$4+Dwn&_f8>P6Tjx6Em9FWinDP4>Y$z;tR zZup@ehbO^<$sKXb(T6Vx5(&{ZfY<>?9evnxrIRZ)69*mZgjwQBnXJKPn@mC|rb@)f zF$XnhlC@GDZSJ`SC~&5!Qap^@@x~l{%yQ?EDqoTG#^HuA$V$qosdVs>N3FL~7$->0s7l8kvC1J!tI3|U$Qp6b zdWSXYZs-y|c%1sj8lhgh=}C;N!ACm!;InHV^Y&{}zJTB}aKQ)v^^z@a+`(|92%EI5 zwf12d5h!i!fgi^c%_8i>E_Jd-9%t&aCLboR#D~7|2(%_1FRLUm9UAWn$iv&Y6ptH! zSObc_&aNv`A7&0jjjT7Hw28q3k(|fVD=o|ZNyy=Xlt&!$iJVY8Qd)U5wl?LPHNOy_ z6zs7A$x(;ZA;IHD94iadZMxw88d9*B3}nre6=SIB#UbHyYtj4e{j5p76a>c{a=XL{ zz>|w4OB+>d&38z2-0}6+AT_eaB^!$_(mHa`F|*n(U9!d^fV*L{>nZ`W2IvG~ZM#a{ zf;o_>dJ|r_O^TOo_)1h?Zc;Ow%<+bwy{}}dpR)|lIMN}l(}o>*Oxefd%yTqM9C7&3 zM>uIH@(@VQ?taUc&Tn!#PNg ziS08<9^9a}59&}N9$Q$$N=CzwWG)Vw*oG~3Wrx;Pk%%sl#TxX0ye=MYS8~Whtn6?? z7xHf-zWCG}^q{9Fa&aZ;a2i4W#fSwK$BB!ZWAaS$2{+7PhKsaGJV;juISMj`AgP?x zJh%oZp5%n|CweDI-z0qoOI6EX{FN$XS5D(NW0xe;LW!K$qc;!_i%hc)zb zpS=1iMD7(xf1X4RZm_C8c4=0Hz(ZAIjjKU|MN54IZVtp`QSln6NV^s!9ruE#OI2bj zK-3d}hP1x2}BfU`7AypMUiE2c$ zY9&>-=zzsF*a4Q49f(rh<;ONaRJsb;RkLUd*@a)<+~Qp+xP z=|NR?c&&0{WKDZ=grjXb?`BWZ3_#o=a(rlEa7!E6RFW4V>Dba6>hK34cGtU?Sg;)S zklgsbBye)Ln}9jOs6v7G#2ndGB+)Bekx;5oe&8-OF%zN!`G_JrmI#l2^uizoc}PPp zQjw`c!SE#hc|3)auZ5Oe9w?tj%ITrS=iU2no*yUg;=bGTJ~=ZXtj-v!@x!@Iq2h)-P6BL}s{ z3ytuO$NS^o#(2BQ{ce@xo7()AImcmcaGU#E=K$xqzMTDHr<6X)f}ULz>ZWsA>z?azj?=Z{^+TPy5CEmb+o5C_Wquq zecOHicHYw-_=YDw;*GC(=`Vi!kI#HcV}IlBUw`l4pM3l;-~Pkbzxnx(egLR`-Y0+JM|P)X zeb<(N*=B&*=X%>$exMhDq8E9&H-9K6f&Q0)0$6_#sDTvtfuzTQ@Hc|_mua_Gg8S!z zDfoXY=z=Ktg5(#1s8@mCw}2FPflF6*;3si6NOC@CaydA4I|zhMhjbR$fb>U#F^GiR z=YX)sf*Z($Hi&gpn1mPzf>D@-Q&@mbsDviSg;ZCCT{wXv7=}bBgjNTG{%a_MT4;tS zxE(nK8}L99a;O<}=n;0v7MW)iWnD+*bt8B z7LdpglDHO>2p`!%AlX0?ns^+X=nm3uSP`z67_jIN zvS=8z*bufj7`Vs~x(FD&Xdspd7MNIxvq6lzAdFpcjLE1K%V>;4!HieojB^N$&nOhp zNEOp~hjrEv!hnrS0T0436yA7;;wTj4xQFIQ66pAc>gW;dIEe0u5%743@^}&SxQO;> z5%~Cs`dAVCIEnt~5CD0J0%;`K@QpeF55U-p33(F>=@$rjhzuG2iwlZwZ%iDVK9emvw2EcZrvIsh4}nmwoA%e+ig@DVT#v zn1yMWhl!YpshEq&n2qU}j|rKPDVdW=nU!gomx-B~shOL}nVspGp9z|wDVn26nx$!) zr-_=WshX?Fnyu-YuL+y6DVwuNo3&}1w~3p%shhjWo4x+&o4*O1!6}@>Nu0%LoX3fr z$*G*n$(+r(n<{yUEV&ENi54&^6x3N3*4c?J=@Qx*irl#p-dT#^sS@Iuisbnu(utkJ zsGjIaD(yLuG)a)vX^;#tpV?WTyKtYwn4kNpjQ#1J;R&GSIF12Yo&%bW1xldjXrND$ zpK)l7br_*}IH7%5p@Ddzg_xmXswbtZMx|+Yf>FwbR+^>bC#G(QrT%8BrD1A?UU*}Ev85T;rMriwWV)tT znxn`h@J~s$Zyrlgg;3%08MpsJ1Gr zEl8`Xs;gM|hKbs$dkUqJDy+3ysjqr}u?nnbN~(1ShsElt&#HaBnybmWt5RsKmx`@z z+85ONfZH0Xt2(OUimJ?7sN?#py;V)-3a!WLtKFKe=L)V+Sg){(tK5pNj;gNm%CGe5 zuGI>!*SfEmmaqL6+5i~8?FwEuo4@9#M-VJ3$P&j zt`BmO8c-zyR%4pvQi7HKGhw<`;`W8122o3wNLvS6#NX&be5>$Z2RvU}^dSzEYU3%Gep zw|aZCcssR;`?!otusUnFkXyAh8?=YZtD4)lmfN+S`?Z{#g^qi$-#fd$W{V5FbXTiwnGj%esFXyKJkwlY6_qd#ZLTyu};0 zEq34rhijPMEEDQsJ(Z0i6DaexP$G_TC7MtmR#aF7Re zwZ4Jdyekn8dN2nzHop=v3vl2vzq_#7YY>@`NP98|iy%r3>k{tUI(JYz|2h$z@F{J= z2O0*!3h@be@CJ5}SNd>UOckjnF$;1aMSI`|ZV+M$?7Zx25^F+JSQsoRtgtI_Qt;)a z0t`4YV+V{N3)^4~+#4%-;88PtIH)2J!>|U1MZ_E7F>#Zl?QqsqjJQ2-+Mq?}xc3=nHH_os;$p7+Tv2rhVvL>G# z&v#b`Zd?s*K*)+eb5HlT*W{)3*92d`k>Huozmng%_1RHDI+a@{nruLNN)Vp5m5&*rO|#M zLsFf&AYsJ%a8fjd52}JGa`3-_EfQfoK>83Y4Gq&E5f7N4Do1n)RD9Q==P{bKVdonM zm!K-g{zBLA%z%%V34p-cy}iix%n@!tU}fdd2Z1}C?b8Q=&x@T9s)JfS^U(?M25*wh z1Q9csVh12>*5&sH`6Linl-#{*K*GY-+pU4_+)SUa2$wL#Z4D9DFb8m8Jr6ZNcVN{P ztq^*>C$j9>CUMl^Ef9%)r!vvl%#9FX{KDRv86r_!0#V%+#nl2)2gq&SBS;OzQU`EQ zEM?LM0ae-}@nO9XD+Jx&A+aX1vny;O2Zl|)|He`S0Sa#r2maiw0}jz^V9jH!)Hd!C zP7UA!u?KHp!3zEwB4G!cb5i;fE3mWcU6@!wsLG+J*kx;GTk8 zED-Q*2b!?Q=8l6t*DiDLy?yWoa_|XZ70n6{=bdZ6c0dQ@i5g_0*t<$HPtLBBZCY=D z2kp({A+gd8@6zf%5VD{LY`zA4uD{|Q5tB?1I3GEH;O>#Wc$}aI24n|+Kn!{nE2D1a z;ePIst0u%f#^G%90^!JKio-OcNts|`@t_HA4%UDj^;)V|KEdM^<0kO_N0 z2X1g-d_e0yPrqwb_|X2)h>yH&kM|pkxmQd2S--i%Te;J$xb+MBjs6?moj>}lkGQT+ z^|4?3xSz7{p7^%E`n7RK!jdU5 zp0uda<;0UOWhRU{)8@vSH)pcsnN#OWmOpp;6q+(OW7j$b`y6&sOkS(sMQUOc;&rdqcU+r}k0mo84Y{&(MY<*L`A-MfJ43XV(I zt>LwZ(JC&>Sghl(eEIrC2wAJ;tC*>3j>_4o=cS;LiY`i8sN}Ac_f}MG(DcvOI%D6Q zZL{{!ysh=!mdP6^>YlpmLZ$3GDRIBXRVrtiyEXHY(6J)d3p}`RykW8LrXINa;O~XQ zA0D5${NnSC(?7N@9i)4(thd7-yFRl0%lI?v-^{6Fk;3WZFO$QAL-a7~ojZ1FihVf1suK|3sz ztwkkzkQ8TcgZ%%3Z4jbk#>4CH1diD=T)j9WV8i&{lD5R>v#%R8`Pr6@AvnUbW1Y%Wb{v z7R+zO442Gt%>)!4?BHPuUE$O{iCx{?6$#$fgalVMta?+E8RsHrKy5Pn4YN4 z7i*rh?w4zpybc)blf*8VY>~`P7;TQ!ZkX+g+>Yz&tgDWS?yl{23U8@j*83-TY##Y< zodTCE8^UigoG-)^7X0MIZCbpm#v6Wo<;Z86oU6*`zT9ue56@ht&HFa}bktKZ`Z@ zdhD~;etYh__x^kE!xw*i^2;~>eE#&)SATu>+jswc_~Vyv2R-;f5Qb2MBP3x7 zO?W~Srci||WMKSGk zkt;SU1#JqA*cgLGmhWMLh-Wf5)^No39z$&g0=?2!wJ>Kcm67drGbNVu9=}IRpZ;8%#u~RbO6lXo7NKC2K(VqK!q9srRtYf(*pdlIPaIRIP za-k`qYU+wU`T0;K`crBUrRWm>Nv&i_YoTx2Xq-Aar;pYtq<88{MNK-1zMZt97gbh9 zKXuSPjWka#WtL3;WK%?OMWqx?=}sTYQjJ!NQaF{AP%}l;O(C^YG__Vqeag?CKGmK; zeW_AYWmQ)h^;B5?brx5l#io|>M5_CY>R7``)tYJ*R%(?MTWRH1Tfr4qa@Cbi%_`2a z-W8c>Z7N-P)X--H@CuF zYfo(Z*ohvOwvquTObz8#Z1J|J#BD2e-)h~s8dtfaP40G0iQD4BHm%s5D|zc`-oK(Z zu<9MGcD;Ms?!I@B;H|EB`^w(J;`gxnO)P&W>)*<{SH6O*?SSn_-|O1nq{dQaH0B-YkhbYvR*dSi=X7?}}MG8H{>3!5|*5 zj5|!@``Wm?IzF#hU5v*J|Jb6;jWLcFY~%(b`N2w#aG=7< zPM$E2)9dB+g1Nn7&aaQHyx|s~nTc5Lv6gSl ztm!CoI?kRhGppz9>N>;v&Y&jskSkSdTc@VTsNS-w3C-&_`x?=}7PPP#EfQQS5z<1I z^!}%bZD?a(I@+0@_NJQ)U4+WE*315Jvs?XaMOQo3*OqQl%e_=QS6I)u=C+Hy{c3Pm zTHL)RH;Pkh@73bFwJIicyI1_~SjXGh^A2{s(>>yYmpI`kUN<)v@oK-}5Y0XVX_+buiV0p`3{&JYR;SF{G1b1(p>?@nP(;SDl z$Ds{!o(J6L;RZUgxygt=$U)|BV0zP?{&c9n!3}k=_;*JgYK@CL=ml9vGw=bAX2fH+ zD5i!r_Py{Fqy64$&o|r8e)3~7f)6W)!yWK&cf99a?|Y}i8{$xNtKS^wStt3{{t1!* zXh4_0i8c7*6Kep)*wJ2xKD^!Vg&(@Si(Yh&Y|{~an8O?3poc{eG7p~j!znR-VZxhy z@&eJs8ioN1#yh^`1F?f2BwzV~Uw+rPN604fAcr{Uq4B+Kcq^0c1~}{?^n}y{=}mui zN2h)ua{$EcWzza)z+M)zUp?(@|JvCzJp5@7zctpd2kX1!4{MNv9`3LPHw@q0{63{0 z;(&b6o3iIaqgE?41qidzjQ@R+$!AaPI`=hx?NTMB-IX-vUC(7@f>z%HajmvDo~1HbMgh*?NMH_SXZRXiCLI~40J=AfP+kw#FDq8K)zH|$5vFuSLDAy{J(8t1VFe)e5^Y6L!wCNgF1KvJpepzN7` z8$V}k#f&C z-~&031Lec3p3F*Vd`e6FHK(r zOBno6CfWlyn7T#y&9UUe^hD74QcyK}(1wiADXq|th)Be|D$Z&>jD$^>s6sl}QHW?g z^t;Xt4JJN-LDHNAm2*r(m2~M~JPZc^1B}rt` z&fx3LD9Thl+En@K)I^2P7Nt;`5C%N((^+-V-Q!PJn#+|7zDvy`SH-Y8^|KYFw_24p zP|XNHXaqf7R%-KASL#sYv%9^^)@<#(zY9*b{=~UbYftBNPjVesbA`@4rOih@CjVTz zsC!qaGs|Js)MJgbWGy&pWzKR%*JceiY89rWivxijSb{BBgB4iUw7JYoHd*DybEVaN zh1iFc&wmxBMF509$XJctSdQ&jv{cv>W!QWDxO@%OiM7>;rPy`dwt8i@k^Q-nRo0Y6 z*^`yFirq65pb+@Cnyrf0i zrPbG(oz|ztx~ToPsm;BrrP`}CS$^%+t&P5}&A6}axTaOwti{^0<-nn})3imswf)qv z1>3Qe*|$x#xkXk%WLa^I+rH&n!aZF6iAC4Hwb#If+QCg+$mP|&_1VJp*R#dhx;3z! z&CtAM+s?(?$#q&(Rnf-f+Q*gL$|c#*bz8($+0hl*(nZ_TrPAg+1;hv-sN3g3tq7uUg51>;O)Z2b=l-a-sN@P=7nCS{ajNu+t+2c z%;nU(?Ox{9TkJJo?cKELHQMS0-0MwWvMt{2Enm--+v9cLkOkl0o!|4V-~I*N{}sCR zmD=`Y-1n7VxJBUj&0PiVwE_0p0;b*rW?%}&T?>w0_;uj>HQ@Xe+zGy5{>@;@6=Btt z-VK)E4tCrR#^44X;TA4o5{CY^2Ugn%X5SSK;TI;}3TELQ*4pp&;5Bh5Qj@6tP2e6j zVh~1R9zHgX5aLiH;%~w^eBz68lBIZpr*~4PDlVgT%9k$gmoE+&)S#zOn_@uGCS3C- z&cUXaVdI%`<6WScxUd;Hb_+U&<2qgoFH#6Jt~E7Y6EapaGp1s7+8KAcVlS?xL(XC_ zR^&tu0on&s0 zU7oUD9wKYLW^B%8ZT{Y7ZtiAp{$_9vXK@~9axQ0cK4)}JXLVj@c5Y{PerI@&XL+7y zdah@CzGr;SXMNshe(q;~{%3#=Xn`JRf-Y!-K4^qaXoX&AhHhwwerSk}Xo;R^imqsj zzG#fjXpP=zj_zoW{%DZKp=lPfYJQkyK8R-iqG;|3E?O0rerbV7={P=VgOKTw2G{K> zY16soJ0?s+<1NBtw)Sebe(5`|7?wb5vNkZaW|6V3YI2e%Mh@#< zdTYSu>s-QO{*K7&x;`$mz7QvNG$`&1?)}2Rj_d&b!o@yp?`rICCEXiVVjPxi&vs$? zv}^)iSpD7X1y176PHo8EJ<*0>(gxz|pkDx1ZQAxY>TNAu5anSZ|WZ3;70EL z*6v^ll{XY{+nVm}s_w)*Z=OwX3l|pW#&GC%@FV>0+z#*k&fW_jae>Nk2H$WF|0x2G za05^N?zSay_+Ic)Y48+xEC^RF3D?s3#%>tzaTza_0I%_tT5%k2amst~9#`;!8VI-( za=p6ob-|2laG9pL7X*>|KBBUeEF$2KEluZPUed9TxRtr|o2Cm0A90 zb`;HQ*oF4-4)bZJb}YB{O~-a%v~~REb`kgXZ%^%NZ}Qf5go-P2b1!gE&vkWQch7G3 zUl(np%Y!~()jD@}*+qBs)pdM#Yki;d!)C=hsLanAbkQpGuhMfjKX_6PcXzk!Kd6H? zNX}0ec;6*>+ctQMUv!M$ca7(Gk017VcOpD6!sE0>6HOv@^gB{4O=7Q7V=s9mAGiU7 z_jxU)jqmt4jd)>4qD63nHmFQLaD#h9PB>V;K5&CP@Pj^}13C!$Z0CudA9`?uY)}}PB*C3H{gRwNP447b?}8cXgoexz&}90Mcss1;Dg4Kg*fO0 zVF*auKY4{;EZv6#-Z%TRS9!&^@uQzRB(ek0#7Tg7<7UkoJdY;T(KBfw!-ftYLX0?R z7sZMeFH+Q}aU;i$9zTK%DY7F*iz82>OewNtMU^gJ!hE@@4ycXI{@PH}xX6#bbsB-m z(f5ZZ$DtZO*@>xiDN~IsGd7KS^64&#ReAT;a5VqbG0ehi1{L?JfN3;o=pCHv~j* z`5Hb8_crX)#?hWRk&sI?4mEaE*xZ|X|1KV6JkM^dHCrQ0BOpKP;?$fq`p=(^e*lfo zKQg?2m$R`0xX>bd#LLW0F~>nPhr3A(q%#cvygPnE2cpfat|n zU#Q)&P#|3WQ9(3D59=WgPLWS$$^P#m}r#A9eDf^ls=n?#z#6D zar#Ccwk*mWm8Cir*P6m8Jj7l4c4)lejI)aA!=Zp^V8Lw|@C z2Z|MHhw5UAI{O$)(SFyArqo7zDymoBO4}lQ$kF~r8-VFiuDR!;o36U)?(v79-S(F2 zTkz7G6`|N}q-{)~)YO>1_%dZJz|Q{r5+}1b#%;Z}5!i;PfH)Gd#1m6ovBec%w{T(d zDy*@`_X1q7O6j=K2C0gPJn%~btGsB+D1ov@QvRyyF;&WNfp~4{==c&kKW$ z@5?9QbH^H<&^&F+Pebh=v{4B|M;{3bJ#bbh9cSeNsGfAdK?V zQNtZ~zHd|8aoG|L7%o^T-fi~S7xfKq(MqK=i{XdQa&mWcF9pvZdSLCe+>^(hHj8!# z{!rd+++l0x_5O{~=c^7L(1g`4Q}cGTLAVTbL3S#^!-0oFUKxNJD#F zux=`R5e!}ELo4m@av{7S5gk&(B4#It^gEyqnfSveF3yQ5BpVW|Xha)Yv4+NJSr1#& zMJPV;i;F~UxCge)W$35iHVL9%I#bR;KNvd8g|agy;fWEn5XzfU?4 zm7Q#1CfznjQO=N*Su~{vRcR_)u5y8`Y+gxVc|%!Rk(MA-Bqnj0%lz$xOl`K$nMi~t52-mucaBqbfz( zF4Cs^r0GooYSNNslcz6zpD0OMy`w&rs73W*PG7Q9rE1Nm+tla4swy?8PBnU7ePl$j z8n_8sf{>PQDj%g9RK$eUk7Iq|Q_^bI?X5L{nIL2)ECi2%!GkJ)1z2F8GT696v9K&T zEVdL|lD*#bdVLMxCkXio3uR+q*`P{h0k+wvbQZBs{47gCi!IWYq_UA6-eo5U*(^@h zulRE8VrL5%#)`Isv@Hp4QMFr)ymqyji){d95!@nXLKe9aMsE=X4`INCxzu`Ybeo&o z^HKLL(v4PjsbcHbS&I@6loG^ac5=}&_?)S@0WsY`9@Q=>Z7s$Mm#TkYys!#dWoo;9s&ZR=a( zI@h}1HLrW^>t6#q*uow*v5Rf&VRvay+wJam!#m#co;SVgZSQ;IJKy@=H^2Ms?|%b4-~t~w z!3%EigCjiQ3ST(G8}9IjLpsR;O06H0nd9L0ucB-=s*uT&p}{xqx<{=A@~5(o9=X` z{(Ha!O7{Q-DBuAQR6y!hk2=(|9`y=%-RfZXz}Pcj_OX*4>=n2`1}?z%wzD1V7q9@` z&2D$IW55A=-@D!$-~hk>o$rF@I|d40c(!YR102x6-92D-$Fto6hR47I=>CAq(>?Qa zSNqyIU-ha-AOcmd00o>*_0OZ80$`uO1VSHy0~|mCu$KVsC13yvu%7j}$9?X5?|a`< z;P<}|zVM50{Nn@v^G;7a^HaZey1Sk2ZioBZ@80&iN8kF|x4s6t&v@)--|o?uzVx?m zcE*4I?%qfL_t(Gv#V6kV@>jq7>u-PWZy^8r-#`ER@BjY;U;ql>01{vU>Yw8Nali&3 z-~u9`&MBVGi2w(@90{CU$ywk9id+eFTm^pI1ezSpt=!D%T+M|b1mYadmT*L_{o{ov<~o!Vu9;}s#?nV}hy9_LxW=UD*hsU93w z-SRbG)$tq!L_q67!0f@^?Aadg=^pY4;vf=YAr@cNO~4$|U>!PN1!$hzVF3A6ANGmg z5}Kd(wcqxQpCy{z_)VYrc_00SV)vcj{VCr4k)qw9;ws9Y0lFgpX~6y~%3=W~;4CuW zEjHlIJzxju90vO0FH)e#tsDi8fCdud1`Z=KR^ZIl+|9Y12s$GKK4Z@r9SW+T&jH=g zvEb1y-O(Z4&n?{yGMysgpw*S5>Rmtyh=3g8pxXUl*l}LkJ)YwMq2sBY+f@Jt$X(`D zUfqe`_)VeSJ%APd-4$Np780Hk#-I5?-US5Y9V4P1*lC{RePa1hVkKVUPi8>+ zSzq{Bq9=Z0DXt$-ilY6&-~4SKE1F^}&Y}Ru;#69tEY@QGDgIvm;o<^zz*p*G1V*3) zdLS@jAP0UN2o@vD1tT#g<1!|r2sR@#KH~|F;LXLLHeTb;DP7Rr95`ZQ(Q)I?y`VUj zV@)=n1%N;XfF0^3p*v>X=yBfKMP1_=A!AOa+i9L7T7dRNVg?i*6%OR(H2?z;WEM&x zLhc>nkz)GsBxp|I6rLdjP^1}ZB_;^p(G!k>8&0_G=ICSZT+XMgG0;J?h;+_E*K<_Q5A*Shbx+!#e?7szNh>xUIEf4RZi*#RO)@&;(v1G zp=M<*cIBt?Vg!C=2r4Lon&mK7AX=&=s6^M~>JjTXvL1DECXOEEB~~AK?x~(?BA{X?_Z4bVdaU<-VdA}K zQ-UI&w&(p}s{fJf%1&jcF5m$oDu4DT0{&-LI-m&}sHvW6S}Nl)+8i;;B?;c8&Km7s zg1`rWD2EDb3+Cm~{p!T&v)!Uc_!BoxUV-${v}D zDFOs+an7E>BJ9B;?3y0m!ZIv#`sO%}BO=0SVrHHvQeVaXBYL9e#TsQKiY~@_Y#4?i zQ$FgTx^5{F>ieav{Y_=}S?cb(EG_aM%zEl6Zsh|m;8-@GSBgNWx*S>ZEP|pctEwf? z4kN6VUFH!`g^{^|{eV_$kN*LCiRN+#&3F9pQtMXn*~p)K8Y zVFyUx#A55&Rvy>^r9)Ppxc(ZXX#yS=lIz^EXrUHi0;}s3Hh`11Z3H*~yh6YPPq6Ei zq(yRM#NzAv5}!#DXCDSEz&EE4q(j=ukczif#Ra^ zekEDzZ1Wx{Te78Fig7R!ZS_85UFKW})SQHx;D=@-VNR`x$}xz_@x%6|(m^c{TCHw2 zAL&77B3f&e3MW5a9tM0R+~IHj8Z!L?@%42f3b2p@o))$(lXl@{s_SJ!BIRZB z-ko9JR%AqesYFU-{vNWP;F2EJI-lru=?6~$nT{z57w7KT9-8K|!6s+%=`!ZVFd=%b z;S%dh(r_bkrs(c4>Hcst=V?)9A5jWw5vyVn*Y3#5Zlki_65noq#$x>CA1Y$%6#w5= zD&Pp*tbSVREp`9{2B`6lWmw)EFZOKnKJPKQrCbVa2+G{iLLkriGlp`n(h8>e4kpq; zEgm}^)k0kzHfBf$C+fAHz2;;E%&U{)C@-2_mAWq@>!g!DKqMxz5VIWySis&|a%om_ z7Ba9D2Bbcw=QE3+;aOf8(k9;yBn7+P1cP3eGU*3AfMg!4aE6|j9w+RfDeR3fz~M4s># zsLk* z*iPx$W^3M=p#!`fCwHPg(jDKO=1Mof1=J`e10GCg02peb>YlXTkzp0aZIA|DDw}dD zPjnZSKn953L#LkWd1>hFVIMZG_LH!7|9!l3vPG+&N3 z9>3`5CF_-@@{4vP*b%O3V`K#6B$GNKXwoa)O=RUkWR;R(;f3^PUaa^%0Nx4r+g4#Z za)3Z~t4q)BYV z@>8QQerp20H^liEi7jY&k`2IG3 zv#BHSTBCY{+pb>MwO;QvEAnpdQZa^ec!x9KhqrU_ilu;t>OA-2FP?Z9qj)~kWf~tl zg+ikUx^ac#C5`KxtU@i-maq4QcG6n=k2l>79%ivdo#2LdDi?WoU$A(`w%_)n1Dte| zPx(p5HvLkbQ;(#3B;~A!(tV4iv)|kYbimNTV6`Xh4X%CDd9OmFFVs<8`feoY ziTh4lu(_kVY6~a2pETIw@5EMlaL2pkWjP}I_5urD7GfcB6L6W6`2`qZZ*#Jy?{))g zA(JA!6;iNH=iwQ?VL3`9aBB51ALmI5`T;!d#WQt!XM75Ge4`gE$RDEbEoXY;vP?4H zeV=Ij=J3j=E~s-NH2?Rf_oOtdy6Lu`Tch7u*L*7uJ*S>J?xM4zGO_=WGcEeHV7na2 zKK=K{GcR^A)sJ|qmg>kowgsvxgeoItBRkDGqpW7H%Sq^mjy;C{VkknV{f#T_4RZU` z0R)H-A1HYEU~u3;4+sY`q(GrU1qu-!PJ~b~0>z9QBRGfv!9oWM87E|PaMFPVl@Bab zQ2BD@1C}o_IKVLT=7S3vGF;fn(*w_*8EQIcfU-eS1`Lumb@1Tm$)YHQR<()&D+UWP zp*}Er5<s4Q>&~r6a4y}74<$yBC=sSl)vJ51R*m5`YuBo+*0w!V z=ue-wdH1%hL8u1dzKK^AejIsn<;OWR=b+&^^9>uIFOUAdT=;bD+c|8XUV^)K?asTC zcfNr<`sN+jb723zeFqWp%8{~y5r{0opk{ze$kzx(z((7yxk8$kpH z9dr=C3M~{Ng!@3KaKjEk_z*;a1_CjJ4--1^poBy$D8&{XqM#uUNP~z*h&DniBec$X zAOe;~2w^R;ym}xknNoTH1D9ZWX(lAGqG=`8s@knJl#FT$%cY{Sl1r>S=pcijfZ{2u zCs(@iB(EU263emDBI%=t!itM7j^K&_uEz8ttgpcM91O9-7E5f<$O?T-PeT{8i!;qG z!|XB6B&|rshu|7*#)uw@fJxY}n$0!XUdw7IQ2u8tE;rXuUA4I3SS1cPa z?z!o%!;V++xa-bWUx76*z4C}%?>+aDRrbR9niX)s{-Om?!UC;ru)zo=q%gtbl!V*I?QN<4gLKnq^7*ePq7*Ui+-i0uQD545-)bS%7!#Zh%56&_wgQo_5>c|Q% zV3Mn?Sn?_>m5!A1HlM6)Qz%$)u2KAOVz9F3Zgu)0zlQJY(jl zu|N9)OfZ`hBMef>GD9@8L>;YcF$v&;6jDhylNYqm?mg`^PCFeLR8dETtu<3sElz9Q zrhIi(SHXsrCti0=t~p$xE05N*)n-nE{$R(GTki9UJ(j#>I{=|Q4)AkNT>KV1aKXW+ zrPkU28`DL=YAd-Q9Q-f>8tzB08}mdR^jZ z-?eb$r~#;YbfAM0Zo+Y72ADz_W0Se`$^oE4&TXnR zjf_5l?lDda{IhbrQ)bvnvTM(~2n)N6TFBSWbDRR&RoDii=Y^BDnB z22=SONdgy{l?IB+coS5O!f1mVK`N6SR~X=c2+pIc8dN7JbshmJd*_9b8X{tZ7>6KiL8w1L6i`4*U^vK0u36xE zP(GEIIweLCikR!1h}2a@EVAxh46#=MV^jgq(2F3II*kP&K%{|~d{1S)4YbKjp>S<1ic&#XUt3|{b}R>s_KGqzk*EhEKCU_OL(6%ow< zBa%Rx3=f)G<7qQ1I3;BcmV?-|N;q$`kPR-xdbeRLIESMg=iq8r(YdUx#%ZhRu+yC^ zbf?_nIZt{j%l@A53D@58nYw@mltI!m91<5N(89$QiI3Bkx4s2A{5TPFzs(%w&LvUK zort0rMG=cyG(Z^@a7Mw@RFBk%7NB1BP2fx9zSgv(-<7naGNt5G9A=ZPMKCK|GFedB z8@;dC1S_@KiNdUu6R0=P-bHWv$~YkrWN6o8L+x0{5U+we!ItK0yFm zZ}D?*{tE*0;jR^11})Tx3TF{!LE~_#FJjs$Ct3;4A-~D%UuvK%L?y$PlYj*{RXut%jj>yxwPwEF=a+e znb=00O0i!@W;IVG(^L$kbc|C4O_nH(#=Myr2L@iS@Tf;CIm;ZWw~{;B zRDf|1C2&Z)AEi~zyl@KZ%Nyj6e2}hdkv$bcLh(qr+Njc=FK)y z(%ZaF3)OkrWMg)N(y+z@YQki|i!9XSEVu`guFAi-DrRCW0`ejw)^6=g$<_peeb6rL zD$HjBC9Mc$*z9L$=tr(X@GuSo?@Fxi1_%aE3}$j}k#MTo43B{lFOV3|@=gWvX5%G# z%JLFxgFMD#Iw17Qt@FZ!$0W;|z{zchWyt0!-c}FaS`Q2JCg9`)SvZ8_wvgjmt3pUX zL&WUhkk3K-iOdq`ha9IuC*jLnQ|Ln?}Iq_5+?umh+sbl^p~%>JlpGDQUBi2GW? z*}iBrq=sH75KkD;y3V4F7*Hm_4lL@Aj-+NQj>Jfc0%C~Ayqu{33lQj#PAN7G0Ew#U zum;m8k9ed9EqDYhvQE{|VkxldjbKfUCO~{HPy%?-FeboeREfcKjc4}a155xJP2dCC zE|*p??hxfsAmgnxY?hWy#9|O%@+Bf*2htp-+P*Q{jHflM#_=eK02^pEoP@9%kH*Bt zRoEj5iK7WK?+Gajgf45y%1H|0E#6khv~(p4k!3w#&qDSl%Qh}tKwvC;o^OOL3^Q z1gO@lc(9@Z3J<^5i!4wgs`N|ix`)474NhoI7jseVF3_vi2bKDS109So?qUK2VHL=M z99H2j^HLD#2LxBpe+VTS>8b?xrvw?r8nF=(wGn2Dgkk*X8!-(XW8;`!tnzjO15QB| zHj^_u(=$8M6gVK*s$V?0M0`dxJvxb`ELga&ncF&>Y z@QG5#_@rgG9%OK|#XuhNh?3LH8V5pxtIZ&a&aPL>{TdLzjG|w#BqOjYNGMRHUhV^egij=Z5hFl;I55{ba2R#X1YE%t z1YsHD=K}7Vywd_;L_Eu{CMjZo$kSyMP1W>ErQ9z~KEf!764D|m{wRqn z1VJ2Jfe`i+kFX{x8L0n|fQ!r5_KH{ci%9ya` zYUUNjjI=h8v};(bOjLmosPs3gBDF-%g1|&ejf350lRT;e-WoP;^szeh4IrgVP0b^< za_>#u6htQHx0L8kCj|J;jJK*~`2G&gpd^RiGKAuuZ{jS@xJHsu`A{GXvY<4eA!3Bj zwi8qMEK{TlMb_5Ox_pvI5T+U|v2+w~#dH6yxF@Bp*``87y=&?@wm0C9C* zv%+7u24GP$OW&hQ!!32YN%Iu;^kk@<^lje8W63yx_A1tf+Vq|RPD27t?MU{v)67d8bHb?~qZ?g(R6!i?s6~nhj(aGmKh78&6|2E+Q-} zf-MqJE;b^RR?T~aQZ2rcdc;eo?2CFbU{;$lC9oEcgtR8EExob_>2{UVh-zcvuPHR? zDClVG!e=cu$?H_gEPL?*|I5D$z@)C9=kZ|9P(^dbbvfkoFxf8s82 zWwd87Y%**VfN=C)Jaro@7l9t8k36LUq#`o=_n2-qU%{c7KzDdVH)|<|N<$BIzvOh~ zu{WAHU|aV!$rQ`a?uogBdpj5t5D%1;X!FE>#aC&a%fVBiHj8*1bIY=Bht7dtY zuL=SouzNB%gE<(%x@WBPHmrtm0!mb8?nix8lv?GI1ebX-Q1E_6u-H(r1zk{v2dLE? z^M+TV|NiI($+4NJL|@BsNV^sTM%Pq^(1Jh)3H^8;E6+Bx33-Z;9$^zY;A0@ibWL%W zi)Am%X3vIdsGgcdBRg@Up z3NZPiME4ec7d7YV<#>B+OYOFet$DZ$5AkCxStT+p;>|*JohN|p_co#o-cc2OSHwR8a zj8k~=RG~@Mh{Vhdg-cN1%=r+tn)yW`rId=z zXqq|1@@{}6+-ZQ8rNXNQ8BHorVx0GyGF`)S!;zc`yNF45G!y$e)p-dmNb{=636l*-PdR$1$5c&`WsViU>3hB>_`b2~l>B1RcNuS`6_^iz z0>FU+!uqWB;seOx1FDrz>c_0m2Yp~kFU0i(A$(F4Q#4$#P6Q0YW$Nds4l)bRk48m- zKwOBS4hQ=aEBv*8CvDfghBvO$oplU#*+Z%P_?faPDA*%bf+E_HP_f^mnzA&;b$rL) zZCPYU#+Bt*zTH{2EQfZ_T*!Djd-I8SleUQW$oE6HEW~(4Huw@6qD$nWIqtS^J9LiA z+`l!ZzG6aWAfbW7H2=J{)rP-dzhoz;*P=(id$ z5&!|Z?!Z>5PxKZrko3R-m#z-Lghk!#)(RR2QyQglFqOvDSe?Y$Ze8(; z{ZsyWUokh>`Ln)W?67&_v7Jc?`e_AWAbfvC3{x?2o{-kbc%m$!JkrFjRAL_%_UG5SMp??kTX<4h6| zKT0KaxVU-m)xqv&FR;gmJ z|NLT3BIyY=`8Jh~WZ;ix@9n zu(*+9V??BJmT&z?Gi>cmNOrcate zJ7n-FG^hp*KBG#VO4TQas~oC!$hsA)*RNTxiV(52>e#bqL8x5|Vk}z_A=ripA)>9? zx@Sj_7{RwM2@xXzqZK?jaNe=+7KT=eE84-L}$#MH*Z!e zdb7?C9zGCEow`B=3l%81j!kfO1rM-ed$=8x_vzlMCn!`1Ap(U6v|}5e0D(gBgbx}- zXh1zd1BS(~LvYZ*!9(l~9S9QV%7ldn++BL#9uXWN^)nq@sGz=ned^sCFxbz(KZ6DS z;g?@T`0cmA0tzgUKmrWlx8Q>dG5}!$5hS3%gcxQxAp#Q~fPjY|hA1KeB$jBxDhL=* z;sGokV1SDT7$8B6EE=$i2_TkO;)^Mg*kX$@(io#bLH;PC1QNhF7r2B`NhWm!{?bTknsnwyDiPw41!kUE(MUz%Srkq{ zP1TeK832mYMm7l=XrLZ|u#}*HI;BBST15(#23JL@6<8dIz`+Qa4mMU)nRYPPTWsM~ zmt3UUbt+(diLe)6uM*~IV6-lVm|=w}mRDt}o@$q7ylSSIWF2JoR%ys4Yno27!B!h> z&))W$2eL`4lWV(~=9+59F@z9!&2?LWamZ1SWdz2dc!L*PAN!YSaK zk^!AAb?04s?@=^SO7;~@Ab0xt2jId0?k6C12UEx2fd?v}K!XoID4~WNcf25p5Pp~= zhdP$5BS=1$%%aFKCfOo6CYY>ajV=2A2;_?}66s`+NFFd_%Rf80<X=bz%L;`En(VjUK$|qAh{WO%JgwoWuO(QkB)S@#r zg=kNadS+<{Pwnk@rJsIEm8ZVm$Xj$B^Ms*js(1lcPVHK_xqnO6o>Q+#++!hm8 zI8r4mD4XewW;pYc&w5sAK`z7>!xcq9Z{*5IdouW;d=W$OUni5a$%Fj=UQV zxCC^*1Y}1*5pl@z<`u685CR-GiWdfC=m2myk0RZvNWuI?Ab)jlVh2*#0tzHC?}3kE z7Hb$ICuFe)UC2V|!~W2PEQWwuu8%|tkYCAGAqZi5D1bi_#43)tGL@xBfFXj>kq$Ub z8uk_yeGA8dlw!oF9I%}R%*zC-a8FAxP=XG0@{^JDPW4Es z9`6Y#d;a-P{#+f_JqA?_mir+eyBJil(fks8nH;T+jJl}xAe`?9z=KP0-HML^Z*RBwu2tTzz9i#fi;PZ zYiW|F2kTii4?4t7`V{C4i!zjjuFWO{wE#yvxDn-oP@zHGNl*|Ks6W<_SZ$oB5%D$^ ziYhUqpt308Fj_{#A+DoyNv{>t8vCh6$hb8PS+m~4P z>1YCx9hqZc6u?2a;;}W88J2ytq%Qw#Niy=80(nM2p&@Cs5tLv;n)aNiHDtu+v;YU^ zJkQsj(4AXz6Gl{cPS)D_w!;l{bnR9Xf{rjvMY)Y}WhX?baF>l0m1uX>C>5+sC8JF& zqNo;EUQ^-aydd?ceM_2`l*-D!D?Rl_%X=);aOQJ1{UfYr4T99f(T_bjER2hpcrm6LSVJ$}i z3)rU=u<5OBZKc(zZgmJY8bTjT(D_h_tH%b{aCrBc<9G=n(t);hKKx&DSG3!Pq`&FS0C$`u5W#%kMnKIzSi49k7qpOCog#=D_Lg$7A7HJG5&D*wI~GQ z7{tnsxgse~SxHNh=8+&?=9am>fd-UP#Y;Ohb1}_n*jY%Q3$|JrzvN7K7Wqj!$mc$< z@H`ngiON|HL!wM~p)_%gOxkA92!qgUhH7X-{d5{X@w{+@gCa&#<*QYhN^^IqOwr>a z(ozeia+mYDs-p;M(yhgGQ}?6xWj*!MRY~k%r)$lD5IN;j17&@)@f^sLF4B>E%C=y< za~=pWFXr=MY@KyXT|w9G5AGCqCC3gDm=@{$k{-&vVfil|z{rVsq^6|r1pteo7q2TJ@rJ!TP<*No zdq+63Ld(#DZqh4<6IbNKz-zVE(=}V8k;focH3fTvG%=}RRVifysCj8=Dk28b0w6SM zVM}fS$=H%+#8hV3WJj7Un1SSBylfrVSP?S+j%fKOaJIPZBIS&ar12hg7!s1CC1k%| zaYvCK8{ecc+7@|)V@l_q;c=wV6*tLbHZeidIEcWRvW*cAAnBb+NG-8yL_ zu%s+(i0j$aFnF-Ne3-Q=0+siT#*%r2B8`%1j6<+f;&i`8wx}yb;-_S$T>qB7>AyX?pdd6T6IV?z8@_k$pTr?T;ot1K#YAnV9_26 z@6aS!O*Wgf(8A;M_Keh;%+yYT#XJ+YSb@@}5mPXx{)}gu0cUP;T&{4|4n_}EV1wwO zn#S+@WPUi_?<2hF z!twlC(j-&)Ov_K}SX&eg6Cqn0O2ki1e5^tI2g&PfNnk?*AAyd$LziUrgr&<{Xl#gj z%9U(DGXx|p;>kj0Xzdi0xMZu~7|up;s7;&6e!a%VUv7c)Abex(6YiVI!Vu4@ z?;HlF)DNq~C6ItKm`GzPn!-(y>#O(Tp3qRCoRdbSa&IMsP5u5Cl8pgMQ}gsE_$_F1 zpWS2gnSefkw8+2}K4<*5jW-1kZc&m;OF$HS@{AqG+Mbw(5Tbl%%DbK{kAr(nPpEuK zxT_ab2p^S?r6I6soaFA2YQd<`0eKD&ig?wKK{A!5my)7}JY+FfxJU0KGaGj}>YRHS za->anCErOob`hkXY63MpNeNC3CQitY59J6qNQtH;)E`(8M zWzcjBznkeWB8PqmChR?b8HrXLQ3$;sSIn();nbw0U#_KSaRGgF$9st>o>}F3W-D!# zYSJa1Lv#1pBsFkH=w{noSh_JjrXTqkoW4f5WtI=oyf;|C3eeLF3IPR6&t%3vT;mi{ z*XZpaq3Vb0c}nZ*m-6^ulK4FrEBN{ClVMVY&*{VLQzGqUve=2_r%dRg9G<3_>U@Yb z`DNiFVkB0*)QIHzWz?qhh^w1|&m@4=3e~EbEoz5MCRp{Sq3owH=DScCS9jG@J~gC7 z87sCH!09i%G;ywNZ0Bn={aavRyjt9n&y|*)} zO(N?TTd`eaaRtdl!j53{JL>Char#J_(+is;4>hUBaR|f&(A5m~_^Ai}A&JMcqAvd_~l~P9;kjA0aVO{kZ1< zRN6P+ zj1$YxMo;O_m>B``t+i4*YtL-H;c++GKB#*vXop`|ZEN)%e4`0V^kx)i^(hk1+m>E| z3>*~Y>scFNO1#*vwu+RWXk8t*+jWbnVK%e9GyFZvBiyZNt)Er8#>)H!>p%0l57Txc zP&ce|G(=pM&t>5dE>sSLFzuG{x>p-HnMtLdFzyiYc@TMQ`KAmU5G1naUmbUybISx1 znUpF@i)JuzSTW@lMOT|qKSdEL-&MZ%HaQHYd!mnPBBzraB@5PP68HO?il((7?UQST zW5k16kl0yJAVN#&HLHSslV|=bc$j#%P=6@m0_1%*b6VFBC;GdKm5DPCdy0`bLQe&q z^>W(0sY@;|+iu@7LrLnsfjAy6Yw!IB9&!d=JH_fN29%nqcc$w;Nr|5nXS*m4T5Mu; zKrs5#2JwM5H(T6J#brP4xN4uWONHDing(4nX$Xa8BDb4fX-)k!rPlb>S?MdFi5mwE zrM;qq3TW)}tr;$5@zE~{#N-L6j%O8krK3|!9K`Kz2_0m!=4RZ8n}1chJbLzzdo@%# zOpB*!NV4`gfbMa=eSQRe+IuJY4*rbGF|TE1Zb(r!6cci?Y$p4bURFxB4^@LMM!W2z z;96EA*d7P=EmlR*Iacf+el1SL_f5CyXC)eVm{fZ57ZvTc;(73^mgOu(;!@KnO&9V9 zk7kcMICg0!8Z+?Rdl(GSyU|99_w%csBG2e4%tX!P+S?O@G)8L}3ySYPc5J4q#^iNu zWI3RTNB(PEXXA{}s;MP`HfgHb%8Gtm({%Dzaix_6zoB{yS%h){E2D2;Y)FO_(;g^P z;TgvI;bZ$B963;cBcULTY*HKrEqp|I;EC4f>FTR!HYZ2$$(jN}o)7rE4@9g8B3|^5 z?N78>WZ81&*=o!9XlsNCTYRisB6tB~ohV4Z-?U8{r+ zL%@*&tJYQrU5LTY>1Bd|PK)dE-}Eb$&z)mSEB#7L27mGLwpa8ljgR>8G)Z@}GDosA zccNQXQbQ`sT)$RldRE+-O78B`L}_X|n!eM6RH_|4*J64`dhi;F8Q&&{Z$+@wBnZ={7ztB-B|Va_pZHPo_DAa_LXz zD(ey7_{#Yt6mD{6;kuUhl`1Lt4>wJj^cL0&*LOc<7sq1VhD~1~wSUXlK6Vb9OH~p_uL;j3hDdAl?U3W{YUJlHD<40?1@*-4=)Sz}F? z9WptTH*V*yx#hzD%KbtG`MYkS{MX~n>Uvt(W9vravBIPROn8(vtMT3_q-S#5CcW|p zuV3k%XtJ(b`o-jlo~T53l*GW(^+;fYf>?jkf%&a;>|{)<3iO4S<-q(@gQQ+x$Ws50 z7nhV$cmH`Wb}U;Xl#q!|>^JVlfQs-JJ7 zC_Ihk=E(esnul_Gtw|ae1^;w`RJ*rSDOrsFgkO>n7sQ7AYG;4!9WxXP-d=RTSRluK z2ebQ0d(U)!?9W-?%N=691&yBtTK)MD@_yXhd2arM)@AWIn! zD%Iz(23}=8=L3O(hq6^_k%r*5FP9!U^}OFBdh!FTDr}ft6TM~YKf@YM8pq)6l#3`o znF$xfZGSZ|nREKueOtAYN6e(p>`|~?!4dF_Eq1l6=V)Ds(8ls43o4qst)aJwSsco7 z3X`}FQ463RA^{fyi+~&p2!V!0L?V`Pku#GBL&7E3uQc5cfkVdO;;WB=p4}+n*9e$etpkC- z;I69-*=y8hO4Vs;1lD`-*V0D;oTa zF7fC24k!`Km(c&`8U186CGxXL7$U~QZq7u3$-kiYx6}F0`vd==sniDlU6inj-0c{+ z2;EE`)`Kqw4_SJCR%+G@9A{gghn>K`l9$Bt5!n{a;Rqm>#KY=C$|B!Au*NC%9B(yf}zsH7@5Jj5?fK_6iy0*6R`H?bX7%Ug-BKKU;%r&l4N_+s_NF<=n%N> zD-QXZL5h~y`f-XGrj%g@6lLCBbBB69+~*pVUij@8R>AA7nc$w+T$FhspaUxVIGMW= z7zrouibIw;rk-=20j8OnJPLJ6dWC1{jC+se_OWBr-r{=dyVs>M&3ApudaW&{&OJW8 zyqWs7BZ_0xk?UH;F9JV<0@cKkMcEQI9>YFrO|8aqK8eFhcm5Qzdn;KJ{ewyZG;o9= zNi=vpyA%_;2z&anaXq+<9%h^dGcS26A$8Mz!5}tYh{a!g2lXDJHtR`_gBcwRy-R+9 zSiS^tOp=b3VpJ|m4ghgX}aE86)q-A!O0x7*`RQ&8Ri@T!r7|+00pIr zWXlJ|wr^b6b&YFoF>|n;;FiQjX|XC?UCh zrY@_uVVJ4ZAk#c%Z@6Eo&7N9`p37h4IIrdLecU|lfrt=62|uL{u)H2t6af$|p6?f|dG=Kwk6%r-HhTd5CU5_N_BGHUHV7y2&qGAMn%01w5*aqJ$6rH=YNA9V} z0zZbwAPmZ@N>?!f#q!gIxOQs1d*d<`_)1w~X-e)#Yzu{d+GI@ap`1AR5&)tU21Kzl zP^DmFTi%(38Vr@YQO)lo=3uEubCjKNYxr-4BB%DArm{BG z(yID( zCR!3lmGPccBj`Usbfn)LCp_3w_t6M(^4~UYg?=QZgK;K4W5Ciu7Ksip3c^RBa396c z?*Z7jMEU4pv_+bRySN2(e4g^Q#y|yIB&Lfb>}GTwTwU@wsZolMQgw>reVUPjGmOwa zI@28-Bp4NqUXkW7-&v)pr1aK__axgY3+3qK6fceDOKLmCgfOaS8hT9y{UxjHT*CP; z+AY8GSZ(a8FATuH@N{3{f@HTpGd|!GlwT*;T3>%If+gUdgk7#f_P~*5N>Q>Bz^Fhv z$Jq>n=Fsj!*4`{tx8M1NMbH&S#~Pw+x=2Gpgm(I6qY5{YZ?q$!o-J?b4jmOqCqJ-S zR&u$DJKc4DJLjoP6q)grn=CPA*UuwnU7uK8^n4d?DEQ>RM&%) z@fA7$_@EZum(KuR`Z7YGR2$=;o<2oEWMP#wM+cYp!rJh!@K1q75uKD^EEo200zZ7u zL`mYkX3p^%O2mGi62j1{8E7a@77sNLAw}1RGO(X|O7=N7)%6+8rnEenx7+%O)-e_9 zgI&4+Pjj~6l;yc__3w=ujxr5u20N&a(mxJPh56P%jX4H}sPWZ*2gfx*=N?S{@``Ur z)v6_5^r29mGZA>-2|_UYiNdXRlS7;mKa{~;s`RlXHr1B7$$3~5jU*00W6Di#DF&ui zS`_-5_LA(zwDm`2o5ZqB;)3G|&CO_Iz@HV{%M5Ov4W9Zl)LoEU*CxveTxoRfrlRHZ z;_m!iY5k@~LHH~&=>a*4uv!dC5_QBO1k`NSQ<~}w?_iNFSpg2e4-K}I5S;Qdk(L<8kG|QsHP~VP$CjcmmstQzTcJ`UoQ7t zozNVcGhE)KRY#jquJbktBrC>O-_t}Y!kysFwsi}f7TU*l3!D)Mr(m_N?N71mzu6%= zlO%KWR=Ll$if-S|7HQ!LPpgC&(t7hyP|8|%WF5lRa=8d~+7TsV13fc<*p&ow3g**~ z(ti@@qHZKf##hq$XXPcKe1A1o7(cN*(bI{>B;dtOy|n*Pa^x?YZF;4-?UrUSZ&HMo zn0u&)_pwv*KQ{dqJu^XWWRGU;x7Za=nv4Hx0{|PE4nE;$hUj?V1%gM#fD%qCLG#Zv2#5}5_|7(nH=Iz z_TC|vjT!xS#fKbKJA{aHmk?7%@#I&b)Gf{vEHVgjT(oOB$zpv}3H`NS=Y^keoh@Oi zYpDz}*Jpm#AAlBIvO~IR^-=DoTC)$U3zI}t-&&PR`Y+y6{t&WV^_2Z{ zjU7+SE=4IvOsR?T!GSu3m2^w#-biVNdxMSPa1}$!y?TKXahbyrt5!FE@f5${W|#97zaBJOITDU&6Sc{( z$k+yor0WDbC{{ZqRwuNEvlM4u7nR3@Gu3aTX|cT5ZQ$)PZ@9SR#BZdTb1W1CvIk9a z5nO9;fd1_;{zE;|^p3p`hS$|UA=YD5b~K$*qVAt5#mLKuwPf%4BmikY5&c#wrI&a^ zJwA1%d7F+i?pZQaOge;sSfxq6+F)!BqmLRXKXkKY@vtQJyj=PfGbgd?(vP6{o-&ya zD{eEX@{Im28cWiF3L&`RT2F@JD*Cpl?}-Sq$**S{jq&qu3qX zU$oiPgUIN{l>It|UB=!9VyqeTm@tJ-?h+W`(J!24Tp&fyQGKsS#kZNo9 zx0!!03qpFR*iYF?RjK|Sm_I@=BP%mw_A_f&;=TvZcQ(x$Ew_>W#o0@oB?i_OvoU=V zVA6zQpPNofkF|B;~DkR{(< ztk_+y&|k;Cw1js08}95CaPkV+`vur|1gt$kt=<7vegc-S01H0>bJtKa7l6rg!1yU( z>xy`Z_ROV z=Ms3hA2Qq<-`|_w(UITKR9snGR#8`8*-&29Qc=}bQQiJQWzGLXO(h5qG*hSjBt_0_`7t-P%t8EZdd*PpW1AFEdGn%8c7 zwl0Q$98T>Y%^x1E9-r(SpL{<&J~%!(IlVYNyZUd=&aeKP^Yg3oi>r&v>;G_db9r@h zaeZ@s^Yirf_T>Kd!~ zf8XCf`2WPefB)kl;yYjpk&4s0a45tAi@|VGEp{XVWh^%7tg(13hF~nL3z4Q|jMbFK z{_3oWLY|#!C=s>_%SthZUJtxqtU*1K!#!lXSXEXrUm(`y2&K?!JI^H7MkPJnTD4rE zTl`TF)n>27sL`aqIgLBB#$Y-U4JT+-yV+u01u7a&pT=p^n3gdUlvdcG_qkkao8gWA zF%S%cLZ;N&xKF2sA*nZ;*_1M&k}vdS3DympCNs`-& zpC{IuLONZRuwc~nwp`*yeqIl6GNnxL8`+oA&ZPZG{|;lcuC9mEvXTVjI@p(_OW8z{ zPeHqU_f$;=?~*cezWk0`?QuBgUxfUBt=IC~h?ocpyX+0cp#q1$LjL^&z|-voOTf~N zh9J^Z7Gj9Q4w;6cihM}$A!*P_i9@HkVno2wuK*><@o)~Lu#{8Pq^Z&^ljInTab#qf z!-0n~oYAS+vAhSB8U!Y@h!IL0$8<+3f>o9)Ns^?#rJ4%D$5a}+VpFMFAZ<_SG()Sd zG#y({q;!4r5W@6KllE0SW3`nuYh&+yTznHRY0Oiz2MgzP#WW7gw2S>sJ?O zon#fhXBTx#VQu=_k5-hLR~TdVcvTp=woma8*Hlm0F!{+7h%+`k6IL+!)Zhvh*e8KA zYW+Hc1oql@yd3txnA*1cof!I^ri4Vr{)q%8a#V?th?tKok)JtMETm}jA;q%9o|cEv zxP5e33Gen{$&y^th??t{>UQ;&{`+B*Fq6TsACk@As0o=dec6w4a#|!XpT=#SJM6C6932Y_N^uqu61~ z2@8B0$CKIeu$b6jeZkhGNZ3gQ(b%|JO{>R!UY*wK%PrF}iQ;aV<4WmD&wA_`Yx(P` z4h%Q(TctkD^_*Tdf$eM+p_j4qH`j+MS|g|uF0waZ{NyXuQawLO%e{h$S4u=%J1!mV z+P;WZmY7(jMjE1X>8k45=$`k~JLf_dkiKg^5_W6K#tG5DUCnLmpxIMKdasn9uY;H6 zGbp7K!V~8al9#fL=EG^L&lM0n0Sw|`$GARTY>l1=X5G&G6Ax<`L z7V@|lk7Fl%seF|vHm&|p-_gWOg_HsmjHW37aisVrE9fjm>ugkrWc1BjRVbk_Xmw3% zzsA~lM^!V~Y_^)vU}UNg$3heGan-WO*em;(+NFO;RlPcaXHX3|yUubjF3NeO#3*>` z^InHntG1-*{N?&ly4umN8VrW!fS(z^@}eoa>ov^!xM3H9FN>*aWzr& zc5}CJKTGG-Ew=E`9g)~g`RK2`@_C*xte>N&7V%i0d7^VeBxw}{!}h#PdRr`HtfiKM z!l}y0;OKjTKqV}{@n}EwsJk(bQ>OQNbgej)zAHNk^cC4Eb&GaU<$mQbVxHWjTO-v| z74{9kaq|vjMRE33waZ}NY_N9BD#-fYJka+X%lb1<0_VH`>Kg~mz{?W@3o}}q(xpyj zzAGrWh2S%#kMf{>8JeYQs96X4X&7TI1**I>Z%0v`Q^ayw%aRu{kz%`+K8#l_TT0t( zSmKb>N)5MnnmJMYLt~|c>d6&<=hXQFXbIlT@A0Az`UOG!2aN@x`1&DNy^44Z8fo{6 zl_k2eN4xXU0;JSX)=#sP3M7&_q`Sfv{)9(u{mboM+s~R^^rtWSC8iq?DVbX{!H;_? zU-{=wQ^N5J{mCKcbo--GW>kk_xe!X$yM`W3d3lFT1IXFrQKI#))@y&hS7F7=qayrT z?n!_GbouX|YIWzv0s^lceFPF^Obu+_(R~#ZtLw3z1BQkc>nrP?<%@b(4Cm2zHb`h) z2lELHAI*YUIdVuU%Ov2$%l zFK#mC@DJhy7W1Ux2t_$@zfEdr?B`MB{F11w7g;=qBjx_V@L8Mp&g4;g8djC&0{tik zoilg!7My$5v@z>iSpF&8YlYMSjcT`QMN0smn2O--vc_TS?aK=6-yqx-p)f56uau#p zkG2~VQ8sRONwaBS&UudeYgEmaLM5ix)-r z|Hj80_z6V!O=?PI%9w-w>Tdu9EGW$aWy=Chniw+WmKa*e=E%8;CHh=9gg!lVpiBWJxrJfe7>=SQPY@qKNtJLvIy= zc*y#fLoO_gk`$2=Ze0j=*>L9A*FqaRF9X{F&(&iMTT&Fa#d*{^eqnz%jcFk+9}8eZonQT5%Fehgheo9cp-=VBs$SLx$k5@I>7lsZa|NeONZ8KQ(^Gj{A4$ma}H34vAAn3>U-?pTOr?aMXS&(YF+J0@$G70%;Yag|eBB^Rcp^2j;6-A|_acDTFwn zv2)EezksSzu^|#i51cOMNqc%Sl$b*hheuDRFqLVkCh$BCe@&ST>S(>{&;` zd!ab0?{?JHw6U5)uA~*A3RVg&k$6$*cvY#kG3{v!h;dDiX{-ovDhqa&goKuxaTdM> z91~hE^zJo7ycVmGbG(oww|Jusve{;j+f2tN0)E-Xz%LIOAyo-e>K?NQQq~!n$?V+o ztoV3!%g( zJiNSCgMwd}Lae-kY?+OYbdjqwn5VPWC!Bt8l-PL4e9lsHl)|`b|ANMcQL|}TJC%*u zsZP3@+@0o(wI9NY=?gnyRYs>N(&cL&0Zq4{A$A^(w+ttuhFo`xJmG@cuz*~)2b1?( z?$fDDOD9~$kqc9$@LHSAJ}2&>WbCsa^=?%|A*}J)R4Aovns$`}M8=JlHmoVNBCtp+ z)IQ(`U3fxMkp@BKSB@r2B&Cook~16bbgi$p4=S7Nu)w#%>y?ZhT2EO3tYqRlsbgsK z?rHdDDdSdCcsZ6T6U|p4UfrVV0OJ%`iwzYpw#VIK#AvH|KRn+!kl#eE#%hG;w;AMp z|LeZBcadJnS%d&IL|{PQ(houK5jqOa6)^(fEL#e_HBgAv(-o6*YE+JY$y{OYj=J8zZ#w8f<7pCpkM1 zXn%6kx;BfNcG*3>&`z$CyoCo43+Sep^%D9A;5n$It5=ICex{@%8G8?brHU!s04GL2 z@!UX}`5k9y9|gWnhW9U41!^T#41XNo?W6eVh7U5YCzuMhBDk?K$hheHC=%NAVI@-a z{>rv-RjZwOdF!FD3`Db7h#?CHvzTLaVO+sn%CH)lqDCxa+b~*vs`SCJWxKvtPg;kW zT!4X$YOtAG3%j6B?!iO^qaKiVDC_4kAHxZ&b?!2Z;8`Ft%#geBD;m_zI7ZL%ICVpHz#@e!u8L)`ntE<#cX-j-aE4dqo&ITRaCWGIiY)lO zed`5ND5Q=7O<}8&UtfEP6?Jtf&BM(t?)-U9{0nod>34~X-(4-5X&76rH%R^XJ%5V_ z22$$`xW;=gR}Z#ll5Dj=ip3kdm2){G(kOZS3E*vRr*h50smjSrHZrD)2OJSROW?@A z)0D(?*2MUHLA-}p?ZK4>qe9r=je=26w~!kFD2Q_Khp)&DYF&+Dvy)1*^udA_3os?7 zs1tk05o(xpjl>doa}mR7MMM zCTyMI{$(7f@J5ZDk%KVbr+uw{!3nv{l#$P8ZuwqTv6CA^y6aGCv^mUUL(1PTnH);Or$TrbsdR3{i-X{FeOf%jo8waN zU~0tBMFEWZbE`)X4q#82D zpUsE`IFDw#NC2Ar)M$HT5h|=AjzoMlDSfF&H@sJ9udZyIj-)aJhITX32{B{o_>la#BntTm1HCeFquPaBEcnng=nzIOxby`=7tCTT2G1ODlDxZR zr;=Q{hdkB|d}y9K*n>lMMXXEQdOzshid96$U;OY}cV@4`G$9`rDlF|1_O(2L86WK2 zcY&_81wSZtjyj#M9o9`QAPb9OPcomy&U7BBq33+tiDWs;&)B{9Tga4>mxlVTb1STU z7jtMNQj_zYLlTc!Qj`Y&N0*=|_lT{BnP@j-*bP$et+ZmsuegS#h*Xk2K9HAn1!4Lf zA$-vCsZH@nd4PyVYwP{K>faR_<49E6@#V%|2 zKC;8ike|BmFmGh&%}L1nYOuQKux^t45&TE>MC)r{wL4RP{YoMhxf04xu~`v#?Ga0$}p-_OrfI zuW#-0rf>0PU|8brJ81=~{^ho(-XW~07}4K;LQ#O!z&xyOJhG_T zhOF9#{FjLKqTA&61QmB(=BadMjIYXNS4Zzd&5~*xND}uFgMSf=k@v-b-~Zhm?fuD1*iWJuu@>{rzag~@DE zH1zd&VbhNL;`0U(KPT_BXT6QH5ILZ{^}KfNuSeBnsJ`&+J$x{Q~R3<>+_(=Z>UG+Y^Dy&$Z~pLk(Rc_~#%w*~B`zSk|3BpHeb0M?|72BrjrJetW( zjw(rLNsc`DHgS?V8~`Q(MLS|CGPf|5D6-BFj9{>$vzIGz#)ZJmvIp?NZLhfWf}s7M-%k5l7d=vNj+5((@RNRHCMr6+JfbH%dx@X;*EC5g*uD5_S{m!$|G zkHn-2+*4>~2V+HpSe5#w8FD&$wcdNsKzFR0Iz^UvPpEv47Nj z>VIK~m>2$Y|K>b!FOlwZ_`HQO-v|9EVA13l9D0j@_nAsI>PP1Dek64e0RryN>gL}GcVm!m>?*n3%E8Hu?(b%i0;Fj|Od^CW0^DtU?~ z)RcIN^#=<~xVG^WJ*}>O$b)ulBLDJi(rqi}ExVr>ES}^i^D{NbF!{rpB&UL05t~4C zKp7dV^3-A)m$2QvGH2TbU5*m9aHU$(>kdlZARkb>(vNNoSHXZ@x}r2-Pkg<^?>JAV zxgCS2j%ka*%f~W7$E)7v=az%715yg!wj(YvFUK@i%hmQQ8}{#}xo^V1Tj*sJGq@l2 zovzz9uDCbaLla6CtX|w5h6CSld)c~j;EbDiU~_Kbhg@3na=1f`H>>7G-m`hgUNU8^ z4*9__r;@O58>ff@(+NRx?L+U0k;1UA>eHhm&9Kyn0*@_fuC~@Kf7$mPl_e8n{fVG^P`-?}j z{%6R%VM)|5_P96ELmy+{qrJ&nDm-b>rmAVjxk-QjrYMv`MfhkF+VY>@qW=dw8}rn`Z5XQwUUo>O^Tt}vw?vRds8Rw3xB0<#o#4u25qr9aU~$( zIIkgTK^XC9MHDi4Z)R)uJ`q267WkK^%0n#qN~)xtAY9Y>iK#2x4f0ivN*>8+A8ss& zNlsA?%Nm=l5NNjSMFL?{Y>Gip1Yh1ANL3g&?-rI;kgymfq(|%14FTO}@==7w=M(~t z13EFFR8o9*E>K?_7so?|I_E97vc9=W87@4zyv7p0km9}DkpGw_QfwUf7>yGGDoZuk zhbHjr&~1SIlzN(+61g_p;#qk@h)#E zxO$F}D!sIR?NW8h4PwWsNju<~e44uI|J{lO2E9sB#IBg%0*m^CP(}(!pTW#yM4_^l zqm<t{tLADe{#2lVNo(SSS81SgTx6Ayv;)KtbY( zrm@CIxjT1C3vW!zfSo!skorVNbE6ERQ9AS;UzElg#h@^oJe*0 zYt49E=K@^C*mbr~FY}Anl*1kjXl%c&^n)~`EH?zkN^*eL-#x9I1HK{M9*=oUR| zRgxUWk+glJD^J1J%-`>BcDpfZ$wT^U94Rm|tT{Mo187Ub-j>GuNr@t7lTq@Y3MV#! z9MBv8Xme$0C&l*o3ESJyG{1a$rO)0S+=#zKKwB$b@`c z=dV&5*3(CLAMA-6>bZCO zl)6bv?os#;Q~dW5evHIBItVfHk2+Y3Aaa~j{F;NP6sihC9-6{5tENT3Dkh1{yuFAp z+i4~nK84=-t(_{Wv3Y3N6(bUKOV1z?PMJl)h+Iv>4#WA3CCLX{LJ^Mhj73HOXCVf~ z%1>EM0mC5T?$3oG;O6Q1)(VwQ~8A0J0spaDw zbXdfLt%atal(9($yXke8UUDK@b}zbgSA^1_?TGn?#2sn$ybXP(6l1~O0eYuO*emuN zHx~qeSYVp!li$sUQl^L68Oe9mz?6_oN;NPvP_U&%mOyV(Us9rbncz<0lP*dUB1dJs zURLtGz!!Vq3y{q__LB`GCaEuxPp<&?A0gP8c3vE!FDde0G&{0KtMZ1E#g5p-aljHx zqaDCdjAaT|au`;^P?ob~-sF_BD=ERvQI!CN=45uYR1!@t#>8E5ybhCU|!#vSR zTyAkA=w~fR(H{8_z7RGZ_+XZZBgN1s{Yjj|^5B9IWV6O5;?I@Of+fz@;Pq;m%2iTj zWtU=JD&{*+E>6W(DOFVvf|PqqS9;(GW+^~w6vQv4wLnPPR|+cpH8DL%IFos-dm-43 zQP_Y1>`7AAJt(qZhL&EnugeQ8XHXjC;bdpLEjTh=J9$Ru$i1_QjchT0-f-*1V)pl; zZKOD@&rxjHXYEl@=^AB*AmG9r)KRu>Ya%W$`UwiO0%Q>WENEiM2mE-hvs2td)>l?rAm`DvF2iyxpf~NeyK<$TwPzsFuK?1OO zAr#bbtZ(Hm69L|N23~Z-wyFF}W)Zv8xB2b4`C6VdH+jB4n018nSvb%Sxhsz!H}W~j zjLRkZm7->pF=>WvwXZPa7RTVHOAeel#e|ueMi=V-RPFtwMSYDH3*hWY2&W0h zU?B|i99tX`Nvj)f0VQtSG)Vzfo7k*U>#EBVZ6`CNsvh#E_iwRIV~s}8d+Ji4vhu=_ z4p#KsEk`1YFvjjJnnsOsWLI4Ww(=(&Hmw?3D&2x3ISjzLU<6hr{DJOqZz00gvJ^G? zH%;^i_DwPAo*UB@GD3=@fb0tXAteLa^wM4)5>>gl6^bHI{_KkQm0k{&lq45S(H~G} z$b4BCWhopK;l0v-)mE5$JbaagdbZCpzOaX=g8uyyTF>i}7 z)YI~qVd?3;Lbd$v+f93g!3J?+Ih>s9 zcq{kSXx~4Q(-mZe#%!ROm7_Z{lzmuEdD?we*ZfJolFp6!@{Df3Ej#Zde>=Jq;J3 zXfoQisQVG9NZGP#V)UoE`zWon(7+gJZ>-zkec8Zrag7KL)qaY}5s2m(GC09xh(y&| zQ6lE0uHhBeO&zzsegFCE)u(_h*5GT|kiUjf$3@al8ll|#_L}=Y7c%{=CV#7MYzZ0p zoe%MNW}fKApJrlwCs^LKMJIzVOwRgrOx3`jmzlE95`pu+c{*G4!-+s8W(g+eQ~H?D zOW~3lM8YnUflOw)X|H&sb5#1E3HFKE&aiw`3lrrR?}6n?5)Z)g-gycZK-Ch zD+rWyGZji+1Drt{m*U^2jvz@(sT(jh;{O7RKy<&+5Z&L?XKZsjE`z?K3u49b*X@EKQfP1nWM;KhwP&0I9j9O88P!Iklk zpJB)qrdfmpNMHutVm4-Dej0)LJA7rD?I_*nIv~?^L4%R5xO;z zRj4J_Cnvtg5Og0Omf|Tk$WLQbLVb@RGG5i(Vw(M^F9zdp{-abeo;@oxvS+OSqM}OU}Pos#dqi+h=@>y)ZKz)#)7_3@I=`BZcK>qGhN{$5}>F zMSB<9QlCbHH2;v{5$ebvM8RW5X7YkzhoWj^rkK7f*n4r19F!;JNLZBJVN|1ygdJ-N zIoW~4t^IJqe$urj9A4yvHH17tN;9Vc``zdim@WoA`yk#QQpisOwPFU(d#1@c9OIoN z<1q&4fJS5YENIDQDlb9R`gCKa4aH6@-#M1mJhoc?$vK^^#ac!}i6{#lv?NxLW^G5t zUq{a0vmI$e?zgt}ie`0{@pI`E31;g%LCKuo|*z{0KI zK{M*1?((C4*IRB4)2*&$raPz}kRnJ(in$nF^Y1q|8EX^p0B>*~Vh+N)J_CnaN zo^P@S>v%F*9mMapiw*_3*zgkYsOcCGxflp{PW&;a`)-k$<*$_@UiOA`diG+{yXQ(> zk_*3ZeqL;!?C^mGN)!W1Jo$nWXIc~&U-6A-s>S0xmQ@)4%$#`+24FG2_>F5S|mlI^Wg zJL`e8@3Ch1LeJ)e)$9E(bNcWRjUmD&{BF*bLUW#U75ZUm%by*3DBRt5VTSaoF4X4D z*(p(M4EI?}HFZ<>@R=WIQUyxxMb*m=9KgY`9=qcnqgoipTAHv5jTYpyq+iUM0jh0LcVt{M+g^n(IJ2HW>cw;DUokufyX!2Y1{UQ+;a$QJ29rFpLFDC>p) zjc2ZAvEJ|Dh)DUM5sP2%{*TdgL`B1YnRK;&4ug3pe1~Tl`uvcs>PA)hm3R5{)Kr^{ zd7(vhEeh2y!M8SkBT;-+RaI5N!DFG%RZWqV(dl)uyblScLsG-*P!CQg_(XYzF7@#RjSL1nh&h{Om|BLbHmNl0X15rIfD zb`;6-W6G>rapKhe>a`@tj7g1LENes~+O%SoA{^rOEnK%k=F+We_wL;wLiFy%d$)|4 zz-0y#E^PR);W1^%C?-ti@E9_T$3&h?IZT)_Vm5OYL;3S%F=0fD#%%gD7}Q|EeEG7P zbr>(QXUpzl`!?>}T~MI7&3pIn-N0@0E^hod^54gY>+a&k_6gfuxNNCzeGB#L+P7=Z z;{E%T@8ZLY&vNDbdGF}4pl^T03jFu*;ZK=w|Gt&_R;o;q;(rPhQB2Vvfdl?Gpn?7= zxFCa3FzBCy5IPtIg;G#>A%+C#JC%~aD(Tdl!-+swc|z}9f{RfZ8Cu+oGOi^ghog$6%i3+S)>-9VhwaqT!G5v7omRf zRp?!TDJqy?h&g)LV~;K-nPin!3L2)MW!9Nzr)_rH7oeinT5FhnAsZO8;r1MEy|rqb zaKjZBYjU;P3LI}e+?v}7({b@dcGq#?19se9mxXoZiKm6K&1PYRdE`Zl-n8f8cddQ; z>4#r^QaE9S6a^OeU%2E#XzqgzDmbBq8&2phh5#VfunHQ~k z?zLxyeDk%=EwGGB^M>#+IN0+pGQrtg9 z*2PtYn3esyg0wefrD-1X8UM->6@pnU31+gB!nP(hyNK; z6Sqs%jc%VAO=eQ~DNu!~G<`EoYgR*>*f@t(w_%m#h@%`_Iqo25emZuQ1bWdVpx{>~_*RVhdQi9kEBt=Xl6@D51Wg~g~lGCO# zl}BboUnDCUmbL;Xm34)Fp5#f)o>Y^S>5ePB^UM0uOxPg(Yr>3qLTH6sJhVeU1k_>CqzVx)?hI z(Z`EkOyhyVH7v6!+G0pUUXNjj1Y|}0 zb%aUka-~Pf=!jPOGaaQ#Bx~xD`{0+Qe0{Q~QfiXR+Gmug7-9a9hfK)7G;&imwGV(w z8(;y67M6_sENZrVpq|cRF{Cs^AR+Z-*eDoGL!E7ybfE!S)2i0BvbC*leJfn!D%ZKv zwXSx(D_--e*S+$!uYUb2U;``I!4kHxhCM7|6RX(8GPbdfeJo@nE7{3Xwz8JJEM_yS z+0Amcv!4AdXhSR7(UP{bradicQ>)t5vbMFZeJyNbE8E%9wzjstEpBtG+uicEx4!)? zaDyw{;S#sF#yu`_ldIh2GPk+TeJ*sPE8Xc*x4PE7E_So4-R*L>yWagSc*85+@shW^ z<~=WZ)2rU~vbVkNeJ_0DE8qFjx4!nhFMji@-~IBpzyALHFMtCq-~ki3zy>}rf)lLZ z1v9w84t_9%BP`(wQ@FwwzA%O}tlfLm&D$GF(Xkk1>Y$1 zl@xIPGoamUjx`hd#>+S}nd1>>8W>_8S#GmBtSr|{4)y3;hCL0etn zgq~D|(<-J_{Bd`rx#uW9?#6m;(`O{zZhBmjP-@#mMk|r^F^X2dTGqy1 zu^|+#k5=s35N)<~T17Exw9a4@@9?rZRNdAdAfnse{x-P1t&UmwecKm?-89P)PeycOCGtj%+-^a&F=&-z%#ujSeUSh!goqBuGYiV^g!o7v4} zKF89-j$k4yJ08r&D=FIC^LNwW7!H5_`=8$-_PG;S;QD}tAxf_Iz4HL(US>FysVw+b zC>kAuA3WU?58!0Og3pG4JD}r%*1p5Stu$}zwdLH_QFvVOp7-zN9}jsrOTN!$-}PFr zZ4T6@)z9%@_~&EaU(u7AuBI;iTX~T1nX|RxY)301l>G|X6Q94duj}pQiU>%l`S^I$tE9PQ=G(_j=%e+BieuYUN79u^sYKm3cK{khIy z<45j+-Q5gjH@hPJ>;FG{iQeeB8Sc&1C@fjpy;(BI->Ll`06t&2At4un z7q00;EKr{kuAmWGUjDfP52T*Vsg)tn+pCcR6n3E;D%T9~fF0hU9nx75;vu{B93tQ$ z9wHgxxmhxdUwE{v}@KrC#nOU-qS6{v}`rreF>xVHT!g9wuTYreZE8V>YH^J|<*Fresbg zWmcwTUM6N{re9w%}pr*bYQb2g`QJ|}cWr*uvybylZ!UMF^D zr*>{9cXp?DekXW_r+AJhd6uVno+o;yr+Tg@d$y;0z9)Rfr+m&Qeb%Ra-Y0(Mr+)4y zfA*(;{wIJ2sDKVAfflHN9w>q)sDdsigEpvxJ}87nsDw@^g;uDAUMPlUsD^GRhjyrk zekh3khNy^+D2bM+iJmBmrl^XpD2ukJi@qp~#;A*rjov7Z=BSSDD3A82kNzl- z2C0w^DUlYbksc|MCaIDxDU&v-lRhbwMyZreDV0{Km0l^9W~r8LDVKJsmwqXjhN+m2 zDVdh3nVu<{rm32)DVw&bo4zTW#;KgnDV^4-o!%*)=Bb|UDWCSKpZ+PJ2CASADxnst zp&lxtCaR(?Dx)^4ql#xdtV23jLp4x?rCutgW~!!cDyMd;r+zA^hN`HJDyf#Lsh%pT zrmCv0Dyz1ttG+6%#;UB&Dy`OPs#b$Fq{BKWn`1_5rP?a62CJ|RE3p=M$wq~ogZY#HT>!_x~A{OR4{HnK>tGS*lx~8kTt}DCF z>a!Z=w6?3f&MUpvtG(VUzRqeo5N5pQtH1s$zy_?q4y?8AYhd;(!6vN2E-b?~tixWa z!TKe_J}kvnti@g|#ult!u0zIltjB&V$cAjHt^;4<1G$PU%BHN!uB^jWL%81M#Imf+ z&MeK=Y`RA5UB-jW?kvyttj{hhui7QY{w&cJtMYb& zt<_#F%LeUS4lUMpt=E3-!zyiE#w^&Dt=XRKyyEO!S_9g)t=qnBxmv?rGX5>x)~(&% zEwM_iUE(d@_O0K_>RtY=;0`X~ifZ5%F5)I`;U2EyHm>8^E#p3}aH&9CamgyDljmD9@K#x)WIHL0x@uE?9OiO z-fr%0>NaEoAJ~B$&_Nym!Ys6|@-8o`zHX;>f*rtt^iD4v{s_aR4g()ZuOB2Z z36t*vW2!930UQ8=re=Z&N3aUBaHhI29E`A~ZiD~o!Tv_D^xi=U|8VP`FbexYFK8+# zNG~4@aS>(I?jv8SB};D{^uYmFGAE;Qr*1O! z>VXu8vMdwsC|l|#Tmm5U0ToxV9Bb+==khMsK`%4$CA=^G0mlIa&$2T6Z7pZ2FVHa@ z=mDrcv-C>yr*1s5WsQu(Lj&?IUM$3)eBG`tu9}^rZ?k3QO-E?6X3Dtr`!*BJ6=dTk0Z6Z!$YH zL~rUu!$C4rgCAcn6LauFhxFB|aYk=+L60*vl(eRnGaSfq6Weg6qH`mNG)+IP8qdP| z$^jSx2W`Z^&bxk+5(dw~M_ptl^f&an*9Sn0+!@(U) zbyZ(={q8ay1TY}z!StH6Q=j$c?yae6LLGpwRuBHOrLwhK-vL}x11S74_|kz{qcvaC z>?r#}BkTd~+QID(1E&JEV9NnvV}fCCYBOlU@Ye3}dURh`_RPAoWoI_uVzy>?_BX4w zXNR`ra<*ufHbaB9X{Yw!lD2BMw&tR?YsYrovbJp3cF)qbZRfUM!?tesHrCFqZwL3) z>TO-Jt#BW=)5@(~k}YyKH_xiATym{*PdCqsEnQMAb!T_YYVBOot#*HR$P%~Ef;V}i ztaaBVc9*w$XDoNqC3CMgd@C$;*QLqEw|z6L%krgk-#32)?0M(qd-u11x9fZZ_<$cc zy%xA$1~`H@xV9?zUNX3YPk6IJxPE&#h5l!FvcBtKN~?x{xUz!lV)`nGmpHIKYkMbV zq)sY^o4AXIDz55kia#oi*SL+}IF9GIj_){+_qdP$IFJXqkPkVL7rBuiIg%&2k}o-v zH@TBPIh04alutR8SGkp!=ZaJ6i*I?U#yGS-CW&*on5!y^N2`R7Ihu#6h#%&-rn#H1 zDu?syo6q^GTDXDJIi91coiBHu_xY*r`COj4pAR~w0ytH@0WHdT%?olef2jduG!?LceObi+g2W|x{rLx z+jAs~F{hGtGc>UD=D`l1YSB|K(yQvyZ*S7;yy9~4x+kyCOD`QMXQ<*VE;zUIO^ebgJsT_VPWd`aSgm z{@N!l@m??0YXUS2yb5zYQ0x2M&*iIbLfES+<(IwXSAO9uZYOB9r8cqlGQJ$&fgCJ6 zH4r^svu|UgYBQw1{I0&zyFMPk{^l3%MDIcJ5^(5`?<{;T#}7Trr|K;9fgRLAA5b=` z4uA0 zQw9|}lxR_XJdq|%vo zzMOe;=LwTX2U+cTb?eu4SChV7pEc~?!H4&3jl1-8;?bv9A2?n4=5GL&aL=HX!8EnwOhU`laxcnZh(834*lMuM`F6_`l{o2zI zID7>B(8LqJs|Ftt6-3d+7n_Ta#SLMs(MH`uoDn$=Z|u>>&~nsq#~+C-lCmI$9MZ@o znfwdMBo!>N$tkHcs~Q=hlnx&rtL)NCsnS_7OZVbgN6IhJO!KBIGaNI)GSji&z-)z({a%~jW3dF|ELUx5u)*kOq+*4Sf_ z{!LcdWtnZ(*=M1RR@!N)t=8IWvCUT7ZMp5%+i$@QSKM*QE!W(0(M?y~b=hs#-FM-Q zSKfK)t=Har@y%D?efjOz-+uuP_|G0s@y zjXCbv%yPF4^RhQBL{d01yUX5L8wv$69z+IauYJan4!ioq6ur=bwQNTIiu2 zc6k+epsiV9qM2^m>8GKNTI#8(W;%dDR#_GvQ~;>j>#xBMTkNsPF56=OP(j*QuFY=S z?YH5MTkg3xMw?hwx~5z2z4`9j@4t5jKowxc83gdd5l>w4#Q`5goL*B|n(@j0DX-k} z%Y_agm0b9NmVd(i=Cwe#)44`2MnOIJ0O@zGCT zeY!VCRUFCJk6-@zrw-upQ@^KQ|NZ&*x%^U9(LVtWkbox}T&b>CKm{(4ffDN;sZh~C z2~LoLs2CMI5=cP}ZjgQeP#dTs$UzZ~P<|E+RR&3zLKRByfuCB%3bh9S_`wf`49wc6 z@>fIU4PqSl_}(DOkwc5MjEF@vBEobSy#H|u9yClM>&BrDDNd1!;sE}@JM{5F0Nl_V zD3q8vh!Tz`{w@F?+|&!lSUYl*WE=v>T095=J97xJVqhGK7}JQm8*++{c@!NXQV~c& zrs9U;5Wo`Wv5LHT5n_Zu#UmjZNlCU3kAAG(5;et0OL}e)kz-f@cIU%|xuPS+JLDWu z_P|PRl65WAR5@6=x1_qDE{Jj*b#Dk6C|m)pE}%` zGGjgzbnLpjB@vBD$QbfUvLIY^n#G>``@#~?#$IgeHfq&b}% z08)XDj?BZ87DEL&C5q1jY9$^%rQA*_^-`z$?SJARL`t!mRg|(+AMs$MD*PGN72zYS z{yfK285aOfp;d7K7)Ln>0m`Aga1h~GCdEz)u{FZ7XsqZdTj#b`z`8DPp)6}yJF?7o z0)QO&z?;L?_>S2T51oTe9H*peS-$O#uN3>wT`e{Uq>f{DYt)A;7zTj*by2g3Q|qSw z+FG-5)?%Nn+c?R%GWGG;?)pu;ks9cFXFJ!kaaA9z0ORR+yNb-h z7j6u-R5KbafQUF%R+0Bk#s6X{SXHPqP_Dj|IsGV)>-5Gz{ z_V)6iJt|;-o7|Hl_NOXaZgsb=dajD_y5Su<9=m(o@wWHd=KZR7-<#iw%Qvjj-EV=j zSIDzs_P`M?ws6C$s0nv?+ceiJ96y}m3csJPeq3>lKTUAND)YucE;PFtYisom`N=DW zHZvYeX()HO$*y*4WYJ8|FSohIjJE#rXc5d{Eqn9LA6`(G!K~l{Gy2hyo^+)zo#{Q%S;)v=y+t#6&{UHAIe!5((8kDcsgH~ZPqo_4jbo$YOR``h6jce&4< z?sdo2Cjh|*JkTKyZfL_A03Ue451#OaH~irT-v&3tfev`!10X(OcgZgc6n?ma8xWs) z&2OIbgm=Ro`~Zr{j~-aF@WUKBpL*4=-tcqq!z@T2`&(@y53INS?QNfjO~{`2uiC^N za36f(cm58$@BQ&jH48lqpZU#4ydGeWeCdDc514oU^|23lH~eAx-Oto4@Q{7+XCDvI z_x|}Im5DfvpZ(X5LnhE4fBr`Oq5bv0KKJFH|3dY_{{3%$AM`H(0fi6zuKbSeLKATC2M3 z2>}oPm~aYHVjbWB3ZW1Vu!IV^P$Vc23!xALyKoFcV*SAI3FCka)vzM~;S8}55Y~_k z?Z5%sfDh`x4L8pY;;;)rA^Ye6^$yPtWI-P`0S`A%^!9KH`S1GL02GK}4-W4Qe4!(1 z@Aeqs6EHCoF){qs{(uuSQ4={4`v5Qzna~KGPYm_p60WfDMzIfX4-rEG64zi0Jwg_- zPYFqJ2xlStOdiB z@Eo0Q`36t-HlZX<5^2`KBvo<|(UBqpQW|G5BMovRv(F7Yk_BZU`x0^!awd;5`+QL;C6E!aFB>}| z9sr>P3y&&a(JI&AB4e^3*We(>j}g351Dz221kocr0T2lfEmJQJOtKk($s~yp6iRYM zhQTBekuW#m9*0i~=TZT`F#F&D6FQ<9^m6d{vh(IZEh6(2A5#KZQvCS98W^w+?BFy} zlRTOMHBs|23r`N9ajc**Le@bU$8t71qBhf^Gym^1BQP|@&lIWABr>7%2GJH?QWpQi zE#Xr9AksJWk2l+II7^~9Id2em@hTzFCJE6f8MFCN5jyp+E}b(IDv=R1AwAU-CDl_s zffN4mY~dG^a}Cl^AAC?NzmxeKQ#|DlEZGkcMRG6o0Vr>eJX~=t1yTty!8_ScF8Ndc zm{R=ipd)6%EHQIHZ|@B{B0?{6LiNEv-;yS|@4W4ov%+g4&FGjf({jTx) zMzJ9OAQSksPx%xj{nSsd)bK{}J^`;u^*|3g!cfj}A|w>Ck2)n)`b?4eVzfd5uT+P^OPkacpVA|2 zArCsj7TmxMf`l60AUIz&{@yeA-hdB0Au_qK9HBK@adhwi!5Z*^6E^{A(g76iU=LvL z3poKE@WC2DK`KS@Skdo54N(qk5b!Lt4fbGK+Yc7ewfo4_5P{G|>(%?(5MP0?N%z(J zdemQEus#FU`=pa#J1{&CR{E?^VNXyC8}|HE6k;84KPMJeE!F~YF=M-rQ8%^#h0tTq zuU$jd{&bLJy)RZzmi;gzBGqQkFJW_5_!yRF{=Ls+e>V71 zR%p?WXp5HhjuvUrFIkti^PbabUxwdP)_G`g5Y{hnL$+m3G_H5BM zZPj*d*|u%n_HE%dZsm4v>9%g|_HOYuZ}oO>`L=KUR&A*^a0Pd83AbVX}5N5_jYkNcXfAndAE0c_jjw&8f*a+W`P>`1TW%Y7-T^fh=CS?xA#Ed z5A1*sHbGPiV;C4g5AFaHT=jWn4;03c4)#D3;&U)$p%L(44(QVyLj+d#1p%L-`4(31)HepxY_xO^R6Zk-W_h1vY!7i{D58!}ZIbj%dE`Vb%9*7|m z_&|Nfmlo3EeA9Oh_#hLA;eI8U_nLtd_JADsAQPHFgo7e^^_PG5fD-_7gu5>unxPXe zI1cnc6K2>b7Px`=pc7V@hP}^*HQ|EkKo2sZeNBRc=fHz`n1zYB_o(3$PB;!yc!*m# ze>-&!_TUo|c#6?49<~7#`hXmjxQ9_);P$AxzF$0`VapqSp@S;57I74?rOvuDPBgFdj_L4uaJV zUT>8JdZ8J*p&k06Av&TZdZH=1qAmKOF*>6)dZRhIqdoegK{}*GdZbCZq)qyyQ97kn zdZk&qrCs`^VLGN|dZuZ*rfvGBaXP1UT2*$Tr~ZBVr-3@Cg?gxox~Pr%sF6CUm3pa} zx~ZM|si8WmrFyEVx~i@EsHSZ<$A8^x~}c|uJJmr^?I-Qy088EuK_!-1$(dwyRZ%Wun{}46??H6yRjYnu^~IM zC3~_dyRt3&vN1ceHG8u;yR$v}vq3wwMSHYKyR=RFv{5^?ReQBryR}{WwP8E9WqY=1 zyS8onwsAYRb$hpYySIJ&w}Csjg?qS(ySR<}xRE=#m3z6FySbhFxuH9{rF*)mySlCW zy0JUEwR^j{ySu&nyTLoW#e2NTyS&Z&{=CsUz14fY*}J{n`@P{izU6zq=^L}NA%brM z95GP`t!NT*Fhms8_r^T3p3nJilX{sArrzYFx%| zT)=aDsCV4IgIuVG+`x;xs((Dck9x@kyvY*;9-tgRq}-^T+%>AasIR;=vYe>5oHV+8 zsK0zP!d$4wTr9cMbKTi@9ol5X$=%+~z1-3L+;<_}6J*{0z1;);-3LD23x3`YzTOl5-WR^w z`Q6_E1mGiH;3uBoE8gHQ9^o@y;WwV)JKo{-z26^xEPd9_Riw{^dEI=RMx%^Bv#!z2r$==tZ9Bk>2QIzC320>1*EUuX^dZ zqv@yq>8t+cp+4uce&=<*=ez#rzdq<2e(06H=*Rx(%RcGPUh21l>f7Gx-#+Ti{^Nsv z?t#AU)t>Ire(mi(?D5{{pPKEZ!|ewj?h7C5uU_jDpX;~Y>l+{JA7AYCKJfcK^8cRi z^ZxGlUhf4zItbtM4IlL7KJ)#4^EJQoljHMKKlE20@#9|cU!U<8pQ=$GIaJ^FSs(XZ z|L|d-_hmo!9e?&AU-%_o^C_S7E#LG@zxILS_M1QVpMUp7zxSvA_kExCE1&o;pYyXH z_=n&7i+}mM|Ni>FpZq~S?a?3e)1Uj1U;C9m`I-MWUVZ$lKls6a`%j<#Tc7&(-}>vn z`~gCrz<~q{8a#+F;lN!C8#+`7F`~qY4l7!`h;gFEjT$jBzqM+Z zCgQ{d_kwlY6|z>zS1D8VJC(te|$Z1@#R6YPxf9J{AKZ< z$%i&S8hvT?r`f08?tXRr*7I@K*L|ONa?RXT_CNVwRk9tY4}AFncc5_lF&5xf2{N}} zXAgE4p=}fTcOifV4tQLHSXo3MP8kXaVu&7sbfQ@!I#{7^D}K1)M<%|AB8@7xNSuuu zrMRPxEaB)JkkAP!U5pROWX&IL_@N(%C&7cs9dXRjhc5^c3DGuy*a1f!eb{oPlPfh7 z2OaB#S>j5WtifiROhPE8O2o)92Q_GtwNf2z?zsjiaHgqJJdE7&#vFXia_5mNC27b0 z8+3e`XhSk(Lg*ZR*r}kAGOmPACUda)W~P9e1kWC8%&~_Zrvf7?o+>qS#~O8{x`rHx z{^{yVeyov6lcSmh$Qpa}L2Mtr;;QINeXOC0uek#2N3_z$;f65CO3JCJbnuZ!t+!Gb zCrHhxO2;0t${|au$)2>x8gbBihc)VM=n_77ochNap_i8vuhvo_G?nU zfZ#K5!3Y2Kk}YoB!EmGqo3yO8_F)+jC~fS4AIB5TBJ9I1b+SetXX>*iA11HFhraO$ zv?d-et0XZU8t)3o!`rzOj~jnj1B$-Rt}9X>W)4J+tT&&uiNOProX68EEzAB%$l-#N zM;!8roKQScT6r|KHszZ&zYw1k?6CsLQHRwb!Q)08D+|ngt(fjWGtVz8T1jih5yTl2=lZzxv8&zw~cSv;H@%7dqHL}Jf8;dT|I&#o4v)V3Q zvc@8SyJ55IDgmpENQZt*(@rIwhuVkv9vkcET z(jl$Wh8=iJ*~jC|b2LmGarn_kBh^^E_DgH_JibQF%pnIS>C9rP+r)Ri(K>YtJdk^J zVtOW#!y5{cuT7}!XEQk-`*gA_{b>kn35nGj;P8nDx}<0z)5pCusQwa?$!ZUJn!~sD z*SMtdi4NGCAnHPrhc*C@fF_Xz9rh%<_)R2cet?HSVCRPQWzTFT!N(ftP>^>0ZHNXk zp3y)!sWsqXa46JX!t`*%IY^I*?K4Rp+@QA)>QEvcTUf(NM#GR~E)JR4hAnnwht^e* zh%S-E8uWm?E*@@Ia>zrh>~KOC@^2%)_|zQqpr;(LmQfrMv&~vbOY&D+AOKZlk7@?suan; z0wxenOpJ;oA|*(M;RiZI&RxS8BSegdM1m+$lCGg-9%mv8{sV3?mMiJjHj8P+jo^b& zWJ6^yUs648ZbVfY6Ue{dhs&9ygHAp?CrIkh222TLSsCo)OiYzSb!xr>Gx z=_tdw5n%Mes;vy-Qxl?xHS}|zy!t9c?iEOXo3-#K-?j6d}v{COB>l# zk{2QA*wP#7@CPAw*SnWkupIV~-1xpEaB{etfH}gbLV@_i9NASQ(JNe$P^wUV;4U>W z6QTn7h$1_d2#7nv^tlS;8oOk_>v_{TivGJVW^)aB*~%`k@WnvZN9Hse=0O?I-2cp{q;hM;|!Sf7Xtq9}J%{H##hvPDr8|eQ6QTDAfOrv4lwd zSW`dw&>iZuTwJ{wRM$w>H>&iYZLMTnGg;SB=Jk|WJ)2KE+Si8ebDW8NWn^br*;{6I zm(~1bXouNInx=J+tPNyi1KQbV=60IX8*Ok;Tikq>cDVsOYHzpM&U!YtpS5jibbhVyS;CSPh8O>2erlvjqr}g`{Uonc)Q8{Zk6Mk+WeL|$6;=8oBLbm0Oz^D zeNJ$kdmQK~7y8O+F7lH@n%*TJHp|ytZKY3|=~BmZ)I;9trgK{Bo{l(jsxIoJKYiW| z^7>)GUg{>++~_lB`^{Z`aW}`E-E+S>(G`AohUeYk^jbUI$Nl$n2R`O*-+AGCe)yj! zKIntb`QnS-cd_psX}4E``{#iv_w$gct~dQJ95OSb$EbgeJ&^R9A&v zIDsM7I`5q@YGfM^kd zI2eRj5rzmDi0BZC7#ED#5RT{;kjM~{xE7QMAK5@4*+3GScpRMQ5uP|3pokHo2pgn$ z5vHgasAv(Y$QZ0x5w4gRu;>u7Xc)BE5VklNxX2K?2pGI*AeIOgm{^IkL5#Z~j9qbz z$*2{}XpBR_j91}|a|n&kC=}6171MZ!b=DBVfQ?H555h1M-gt-NC=}$lhvrBU==g`~ z=n?EVi0+6H@OX&wcoFoti1ug^`1pwWSP}dyi0C|Z5X(ZY3jXD7jz}Sijc@qoi z7YKQX3>p554rvn**%uPIh!k0i7C93bITjlEh#Z-V9w`$bDHb9*i6q&JCixO5$&E27 zlQT(^HEEMKiIX|0lRL?iJ?WD_36w!8ltW3BMQM~riIhpHluOB!P3e?R36)VPl~YNT zRcV!1iIrKYm0QV`UFnry36^0gmSahlWoedYiI!=pmTSqDZRwV8372sxmvc#%b!nG( ziI;h)mwU;Ved(8f37CN?n1e}}g=v_FiI|D0n2X7njp>+=37L^8nUhJGm1&umiJ6(H znVZR(o#~mM37VlPnxjdYrD>X{iJGaYnybm0t?8Pt37fGgo3lxqwP~BTiJQ5po4d)I zz5eN&zX_bdDV)PeoW*IJ$BCTDshrEnoXxqLDtU=4xeL&V7BDFk)L9nR*@-Uc651Jx z+_@6oS&HDP65^SPJMp?z4Pfq0>Xn4yWdp^ey~k@%s-NR8a+ zi*W&rCF&L@x`~~*qM_KLrTC($7^AH?qp?_{wRoc&(xBZbp~r!VI~txn`k_Eto7@G&qB*C#9=KrD=D9QObr^nx*3>rf!I({${GB zVQPh5cw>ICr5V?yyN9M^x~5l}reKPvWx9d{D27+4gH!6KLkOsB`lnnPsA`y}bsB$t zN~nTrsEvxKda9;mIHm{qsCK$;e2RvLTBV9QrJs&xm4 z#pYyRaOqelXjC(fYA28?Ov2 zr!u>QC>yanJFy;%V?NulLL0M0JF_gCu{KMv2OF|V`>;m4vq*cgQVXj<>!wf(hFCkR zRNJ#$`?Fg6e@r{F7wfe{Ted}ewnyu<2rITNOSWsbxOq#rdV8~YJGF`XxQt7%I%~L)TeUPBw1>;9n%lRQ+qIti zwVa!Uj(fSH8?2yfwy2A?s;jo1O1hsbxle1l&dRr2Si7g|x`Y0Evy@v9A4aE(3%rEO zx_=wHY^%GId%M1Ss&*^9#T&OSK@8iXtO#K*cR*3o8-TBy5VC*?fba*5@Cn>0Y+I*n z>i`OIfCrp3ugt4Pd>{vKkOy_OzJc4kD-jQRFb6g^zY;MEaNsh(yRh185Sfrjdol-$ zAW9AE67JhNcThY3IuV@kDQ&_B8V11%@dQ8Rovs3H)gUP00^3sz}I(oc0@~>;8bdy5PQ%D>GEOUCBG`n5y6r!=`aVI zQ#rhK!4Tn7Nc_Nr47)0k4trq3A*>Q8qr{pF5zE5GODqy316((Jyb^&|3ehg3tbhae z2Yt{j!_o(_!UuhDy07`SHJ|OPumO)+eb5HlT*W{)3*92d`k>Huozmng z%_1RHDI+a@{nruLNN)Vp5m5&*rO|#MLsFf&AYsJ%a8fjd52}JGa`3-_EfQfoK>83Y z4Gq&E5f7N4Do1n)RD9Q==P{bKVdonMm!K-g{zBLA%z%%V34p-cy}iix%n@!tU}fdd z2Z1}C?b8Q=&x@T9s)JfS^U(?M25*wh1Q9csVh12>*5&sH`6Linl-#{*K*GY-+pU4_ z+)SUa2$wL#Z4D9DFb8m8Jr6ZNcVN{Ptq^*>C$j9>CUMl^Ef9%)r!vvl%#9FX{KDRv z86r_!0#V%+#nl2)2gq&SBS;OzQU`EQEM?LM0ae-}@nO9XD+Jx&A+aX1vny;O2Zl|) z|He`S0Sa#r2maiw0}jz^V9jH!)Hd!CP7UA!u?KHp!3zEwB4G!cb5i;fE3mWcU6@!wsLG+J*kx;GTk8ED-Q*2b!?Q=8l6t*DiDLy?yWoa_|XZ70n6{ z=bdZ6c0dQ@i5g_0*t<$HPtLBBZCY=D2kp({A+gd8@6zf%5VD{LY`zA4uD{|Q5tB?1 zI3GEH;O>#Wc$}aI24n|+Kn!{nE2D1a;ePIst0u%f#^G%90^!JKio-OcNts|`@t_HA z4%UDj^;)V|KEdM^<0kO_N02X1g-d_e0yPrqwb_|X2)h>yH&kM|pkxmQd2 zS--i%Te;J$xb+MBjs6?moj>}lkGQT+^|4?3xSz7{p7^%E`n7RK!jdU5p0uda<;0UOWhRU{)8@vSH)pcsnN#OWmOpp; z6q+(OW7j$b`y6&sOkS(sMQUOc;&rdqcU z+r}k0mo84Y{&(MY<*L`A-MfJ43XV(It>LwZ(JC&>Sghl(eEIrC2wAJ;tC*>3j>_4o z=cS;LiY`i8sN}Ac_f}MG(DcvOI%D6QZL{{!ysh=!mdP6^>YlpmLZ$3GDRIBXRVrti zyEXHY(6J)d3p}`RykW8LrXINa;O~XQA0D5${NnSC(?7N@9i)4(thd7-yFRl0%lI?v z-^{6Fk; z3WZFO$QAL-a7~ojZ1FihVf1suK|3sztwkkzkQ8TcgZ%%3Z4jbk#>4CH1diD=T)j9WV8i z&{lD5R>v#%R8`Pr6@AvnUbW1Y%Wb{v7R+zO442Gt%>)!4?BHPuUE$O{iCx{?6$#$f zgalVMta?+E8RsHrKy5Pn4YN47i*rh?w4zpybc)blf*8VY>~`P7;TQ!ZkX+g z+>Yz&tgDWS?yl{23U8@j*83-TY##YZ`Z@dhD~;etYh__x^kE!xw*i^2;~>eE#&)SATu> z+jswc_~Vyv2R-;f5Qb2MBP3x7O?W~Srci||WMKSGkkt;SU1#JqA*cgLGmh zWMLh-Wf5)^No39z$&g0=?2!wJ>Kcm67drGbNVu9=}IRpZ;8%#u~RbO6lXo7 zNKC2K(VqK!q9srRtYf(*pdlIPaIRIPa-k`qYU+wU`T0;K`crBUrRWm>Nv&i_YoTx2 zXq-Aar;pYtq<88{MNK-1zMZt97gbh9KXuSPjWka#WtL3;WK%?OMWqx?=}sTYQjJ!N zQaF{AP%}l;O(C^YG__Vqeag?CKGmK;eW_AYWmQ)h^;B5?brx5l#io|>M5_CY>R7`` z)tYJ*R%(?MTWRH1Tfr4qa@Cbi%_`2a-W8c>Z7N-P)X--H@CuFYfo(Z*ohvOwvquTObz8#Z1J|J#BD2e-)h~s z8dtfaP40G0iQD4BHm%s5D|zc`-oK(Zu<9MGcD;Ms?!I@B;H|EB`^w(J;`gxnO)P&W z>)*<{SH6O*?SSn_-|O1nq{dQaH0B z-YkhbYvR*dSi=X7?}}MG8H{>3!5|*5j5|!@``Wm?IzF#hU5v*J|Jb6;jWLcFY~%(b z`N2w#aG=7<PM$E2)9dB+g1Nn7&aaQHyx|s~nTc5Lv6gSl ztm!CoI?kRhGppz9>N>;v&Y&jskSkSdTc@VT zsNS-w3C-&_`x?=}7PPP#EfQQS5z<1I^!}%bZD?a(I@+0@_NJQ)U4+WE*315Jvs?Xa zMOQo3*OqQl%e_=QS6I)u=C+Hy{c3PmTHL)RH;Pkh@73bFwJIicyI1_~SjXGh^A2{s z(>>yYmpI`kUN<)v@oK-}5Y0XVX_+bui zV0p`3{&JYR;SF{G1b1(p>?@nP(;SDl$Ds{!o(J6L;RZUgxygt=$U)|BV0zP?{&c9n z!3}k=_;*JgYK@CL=ml9vGw=bAX2fH+D5i!r_Py{Fqy64$&o|r8e)3~7f)6W)!yWK& zcf99a?|Y}i8{$xNtKS^wStt3{{t1$aHTdEaYXHUA(O!o>yxs7HAG*AYUUZIZ(-D1` z!yDkBheZ%F51#kKDKUOw!kc{Z0@1`8h5-u3JHF%tv4bBZU-^Mwe%H81$R_e2hdAh= z@x5($E0gX9IP4+xgwzA+O@DPqr+y%F0L1NO()wn=UKX-nJ?(A(+SxNa{AmxrHP)~P z>$~I+YmkE;?yv?o4By=RKBXVxfPB!KviWc*ec%CQQb2Hn<%24nD+yW91bw&zMzDrO zzz5=+y-ipHYS2FJ<2{GCgYT zKRC#P0YoA{po2S@!AXez1VFe0I{1Sn+Q0sTFTsPTJ+K3wDnOE0KR&>~I)H=io34c8 zgf*}RSy+Q7gu?N=gFgtto$J7j^TL9_hc(~>E+h$J$OBs#h=IaooXYo*Oox){X4 zN!Ww?qq#^(q8*euK6nHr0>bAT!iS=RK42n1zylv-EF>g}Pk6sJ@PlE{z}?%xE~G@4 zaD&JLzwRT5Sx7-Q%se>cJkOKCCISRIU^+YagFG}vnWMQMbUy!E6K?W@HK;{f?7sk< z!9TbIH^2irytqaDh-UbM`*VXk*aQc}!c8QoIfl39c~AN+$is5(dB138cb<-@C<%t~o|N=y7Ts8qP4#LAE8LBZ6BD&)w8 zWWiEe1pcYBgPmNWNcaP#lR1H8BDEAkdPF9B#K(KIxIDmvC33;O3(I4YKJiORzMMqW zw6@i( z#O7SJWu&>n%!t;D#HXxHQ=&^Z$j!%`gq5^|f1EjZ1kSY#5{RaHKd{aU#LiNhOWf3hs%s*5e8~Y##r3>QnuNY>!h<|GDbr-e`GnB; zJhllXiA*R;ip0EeY$dtF%{&NDB{D@+L`znDN%F)@;T*i>9JlwB&u-L&YOv3Xh=)xO z{stMn2v3-W8;uC5)X%P5h+vva82nHs+5(iNo3N_;OovP%2YktRQc-EM1{{5rBIm=20ZZ7S#{Cf<4;$b z%asehOU)x!#jrZ{vlXScT9r0X%?Lnf1U+3=YV%cB>QLmfyS>ZSZ0)?i3r@EF#JN&y zPv>+`avfK5h0Z*s%||^Z|6IDLdsnD4%VE{jV~wW9W(_uK6{e(%1A!e_ zf-P8s6?uarPY0f*oT$Re-)-h0E9otSdHCSj_p{qRM-?{*n9oBd=1r! zwbh8F*md2udS$ke{kf7=)|5rrla;oL-7{EyuZG3On8nwbW!9c8wwsO8mhHBeCAy%6 z*`KAheiho4?YE+Jx1+VZq($1L)z_Mx)~Cg~sQtI8&AqCn+N(8Le(lw*jlQnUxUcQF zrd8Uk#oDsvz@fF%v_-wO{nW4p+p(3|w@tOVMOHy%S#gcqzU5oOJzV~YMc2Qz*T99^ z!A)Gq<<-6Q*~0bLv&GrEHL#t{(7a{a&c)lwby`$a(Z=Q4$Ccd5CE3t*Tf|k_(G}U! zMcdP*+191q$hBS6Rou%Z+StY1*#+9wwc6BW-P^U<-KE>!@{EQ-L&a7+Uf<|>rG#>E#B=dU(c1> z<8|MV1>fJD-}9~C{srCt6}t76+V*AK_my9`Md0|&T?Ov70ruJgrrrZ)U<$@v3yxm+ zb>RCo;QSTb3BF+d&0xwEVbzu14VK^zcH9rf;07My7A|2DhW@q(R@(?>-xUtw7be~c zX5k&y+VAz?HE}3Xlc@bo;2t(&5JqAiJ~oaJ;!q>vZ^Aiz;)`;UrFep;cT%S+E~9qJ zmoDy?FAf;gpr=rqVnER*T=OQ*!KRmC3XoOB^ zgI*X=54)4An6%VpHqhX;shMOet7NV?YGazk}J}$Gq5GQstDDDgH{ldVG>;V44 z#XfBBYV2<%-5XY79F}a)c47InYyw_b{oU*ZPU6o_ZOGm|(S~5s2IA|WUjSBZ+V)>` zZEYHUZ54KG*(TrG{_WM~K-{+58Xj%lo@}j4SKwZ5f^sfMnc?Ans+{$%%{5BYbXexj z?o$22=oa7NcJ1Si;pf$E^0sc}uE6e&)$mpCB0lXUE^qkGHhp`_^w!z+w(s^f+#HT? z{%&q;i>VW?Z|S~o>K@yaU5@P%6su1SMY)w2)Gk+y}I$^%JHn)@d{6JA7Aq92y!P^aStbM)7I}Jw(|J? zabltIEgvf=e{dsLJqqVsF^6$7Hx@HL^8xR2&0TZAyzVN0^9zr2WbsNmzpFH#Eh+D+ zbJKCR{4fP#iVry^>jj?bP0XzU4QFd&+;Dz z_72x=)5Uci7WHGN?PO<_S^j5s6wPedh4%3d^J%AcEVuSe$97<}b^PXb5%>0QPwi@N z^44~QiYsz+FK|%Lb#-5N&u;f$7j2}=gFax@I(K&2MR)Yob$oYgeV_BgX2m(sMUIcv25{cem_6sDn00&QBM3-z9k4Hh7C)bd2A3jpuleANF~7B0Mm{4cwtAPMR0>Qs7ya_gL_0yI9R?uaDzPX zgFc`GItcn~=ZT&ld7fA8guixv(!nCs%~l%vl{fm9XQHdGgFQG-H>lJ%;Dbp>db&q? zU&Q%(k9Jr8`p6FZ{&7F4MbLvdXoH3iCbTd5hd=sBu!B9I%inBzC5i*O--9`zRJ|AZ z*(Uj~Hc2`_z-Dkvtlvvp&;vNY10B@|POt+w;DdA!h)uAAIOv0Q$Zo)2_Rm@bJ8T0v z-~+7}q{Nr>wO67=So-1*LdmatkgT~oXwZ6+_~@eYimz==z=K}+1oUeLH}HdX@P#^P zJU&>!KR~}l-Go`-gT|AEIOqgn2uRyMd4*pr-G>9-H~X_!dBwN!qn|q@vIEe>Nq~6c zX3ZKrk0#a8Gif2ih7KP>j5ui*#fla$Qq-q$Bgc*&KY|P?vLi-|BTu4CDY9fml`dbx ze7UI(sEy73+ECND$dA5t8iC2t_lGCPp&CEgiK%ocQ;jS$HjR4n=`M*@uVT##agm-k zZQ|@%q;>41KXuyJ`9pRsTdP#xK5dJ&&Yp#Q+=!jz#|@yqedOSobSID8wQw&=O&pS{ z;>IMOI*u$A(;YjT^fiOCG1DG>pYY7F^F|+^OC9;dnWMUnMwO|s1KNi&RSBBOpWN(s_`6b|=@A9S?Ah8u9i5vG`9l3Avi zWO_9rme^T%Sb%bv_}m(R=*3rGsNJzpA8zE~M;~<1;YffhRtY0yg-&%SqOMVcnq`>D zfr)CEXq3qvc>EERKAVWfM>-mD`bHkMEXo~~r8*VYn!;&$7IUw{8mp|b9!Te^!?g() zfQ#VOP$Y8H<;QYv%&{9oe~1y>SBsI`xr~ne%Fkq)JA(Ms#o4h+ai3((f&po zfay`Lx#yyruDa>&@rR(@_Ll2g@Y0(Vq1bMuZA_rl)R?~bGG#5m&i?xnC$l)lZN0V; z*oLTpI1;hM6H{EV#T8$-aAEQ)tg*-U0$i|4>A2Absfvj_@Jj-#ylBcOfwD$Y{;KLR zThztDhHi^wY_rb~aa{Ay3xkaB%O~M;#~Pl{JZ;NQL+u~5Q3*pw9|;RRbXGWjr3WBA zYwdH;EQL*Uvnn5bQao}XjPle`!yR|NZ&TZG*%A#HE?6nvZT8p~^$l;)N~JT4;fK$1 za(8qu1``0ZALgSk6v?-D@WD6kYlaT^?}MJ*R64RCpS&!zs4jWPtIr;NskKj;_3#ai`0n+j z2Y=l5Di;5|^F~82z4=m7pWp4@vk!dt6typ0>DiX=a{cGyum1got{=buxW2C{|Jzvj z$TvQ0r7wR9lu81{)4u^iuq^=;U<3_QKm_iuN)22f2V0au^jWWhB4o=1M@W|W5$uC9 z+F%D;m=YGo=7A=hApSMhQ?`G4_nhkC_eFvk&$5*D|o~*G6aR&3Zm`)*a*fqN-K6~8zLG_ zc*Z)aae8jlpA_Nf$3*o}k5sH<5$}k`JlZdiiIn3X8>td8!cKIAEF=~QiAY32vT2NT zBqvw0$MKMHlJPTS886AdPdX5loorzy-8M*3&XAN@G^GYrX)0T;a)GUEUP)kiLs?pp zmLOClCUKd|{Oyu~boAx_fLTRhuF#lXl;$zbm&_>kl9_g_Bp#JG#Z4LzoYh?AHNmq? zZMM&uNQ5R2sX0b>j#GB!WJ)N}`8#z|a*J~$<|+9Z&oIJMlajP&1o25kb_&s-!xZN~ z8#&L{oRgr}Gw3h9xkiOX6Qd37;6s&CPl;xZqBKNk8#Vr#P=;<4jve*jD?vI+ZXVL2 zf<);zF_O|wt`sI8b?Mzi8cUfj(x&^Q=}iG@(voJAr!Rep#Dvw4V}0RM(rVW2tu=s|AY>*i z1doBigDQUoSYV$r*tkNmuq-(&wiH{Ez25bDeGT9z2>A&MWn*C3ph{)|w%Mn27O_wK zEK5R*Ez*{xvXLF$WhV&PEKb(1_;T!GXA2j`infEaEeUQ>wOfq5cD0#{Z2)Bv+#+T| z7P%5eZxIC#VZepC)Ov1oo15G7QTHvX2A``9UST?N7 zB6y${F6}K9e6=&*>*BAz#<{O^#xkBUjcaV<8{;^~ zI^Hpld+g&M13Ab-9x{=OY~&*&Imt?1GLxI^G=OKs{?qdL{9 zUNx&*?dn&s#YG*Sg*{uY2w5UjsYX!X7rUi*4*G+zx(a)e*-+=0v|ZR3vTd(BRt^>UpT`X?(m00JmM0cIK?Y&@rz?T;~HN$ z2|DiakApnqA|E-)Nj`#(iy-79SUJl_ka7~FyyYTjxyxBD0uhAZ<~k1n&wCyM5coXk zKo2_4L11*F`}_kT_yE(J?sTU9d%y!q_W%Vb-~kX+KR|W4*fU`E zv6CI_6}UhKF2MG-vmNXgumIi7Zg;a|zyW&SyWSh%0Kfm8?}Fz$1`1zzwrhX`9MHhs zJz#dnv)uxQ$G`*V{(#HVJ@a%|``S5Q^{Pi80#&a71)NUx&!e6KV4uJQLLY$x96$oF zmjLZ0U;qiQp7prLeeQejd*4&w_rDLm@QZK!;{*TmPES4aQ@?h)yPfTBhx^;_-uAmk z-}>6Oz6QF_cOeVTnThs1%BKFnjFoo z+|21*&4nNY;vCN9910TM3Krc80v*#0T?{VW)0Lj-N!E!_+^_T|fzlfE?nW+WlbI zabDUzp5pV1ILpGC0^oBW)cV@{^qX`Ulm zfc8aV1{59@4&>!E00R(Y7D^#P?j7QhV*2qUXini2o*@KKq#0@?>CxTjsb1&_Ve{c& z?(t>?7AY&wqEPG-s>HJ0l;1Yq~uECo&gv@?=7bx zrs;FKDRg?|bY3YVHs&LWXLfetcm8B5Uf)p?<#=x5Q}Stg3MEo@AN(O;{JCFw0_7^c zr~EBm0n#T`PU;3!>V4Yce{$uaW@RmQ<)`vu1b$@*Dky@Q%Lg`S``{v2KsreIQ|H|`)dDxK4XqhK1{)14!oW~u5?T?KT&2yC9(Rb3mtAwG6q zWuBcQ;$%*0-i~UgL+Tyn4XG8HX5XQv;1ymzA|9hQp4}bZ6p|s|MWjTYp_FE1jA~>K zHs-N5Uzdj7N*+K07(fCbfFIUg>`efgP5|vWCrq~Ko4RT05$id!9(8gijvnPDRv&rp zsh(;gpkgQY6>3s?toMCk;=N~6f+C-`=lx--|B>veFT8up%ZScK&2X3LzXmp$K54 zWYTLtZr%m(Xtk~#K58E3JtB8vUuZf2X@2V!GHDrhYiycljpiw}!d+;_ZQHgjZKff- z&SnH$tKh0$#BL;=z9ezV9+`?M0t9Sv&Yr;{?7<@JnjYW6GAwiY<~WWcBEo56W}YWf zU&a0-dZOpW8f7GkF2;In7=|HJKI)*lZYdJ#`=zY?O=b64>h8KME%G1Cdg>`|+nia@Bk99i-#f}$#`swL14BdnHS2~H?9)};yZB{*(q(*7zpGOaiM>J5ftUwSXs zb?%8uCg`az1;pq@t|956E!}lt2T0$)f(vp%!5R ztLqdtfRnau1ULY^Lcj!1uV0 z{gv#>?xz9{V9gG%@LDl};-c|>C0Xih^ByQ$vZY&!aWE2X^*&===3EHWoP?U-hh`&T zPOXT_F^J0X!}g`pK`jtkt!_3S=|N{AT5FXGCqG^u27D#l;cxyLGW`Pa^>rcTIq;AQ zu#f_t7Pc*ucHw2J>t#YBCTH>KGUmoGA$qRi66;ISa3gZ2=1+b^rqgsPT?vSl%2j_H6S$?=iZiTncRn z%G}XHAkXb0J|=41uTtCQj=FPdGIx-TQ^ zq?0~CBqp*DvmFLlz}{MNX;yL;GO!c|q&}wSGmD?$SzZ~^Cf^Pu1-sq^gILLepu{=YdS&AUfCL_?oTr)zb&GB>g9&OS6GeAS2(oSvB8MHT2ZD=d>!&;sDCg$fQ zV(1Cyl@fJsq9JEWspUNYW!kUUPU+cZYu=fm1H2t4ccMPh9p9biN;kj-)F>tc9!zHd z7;2*Gp0wVPVHL)0kOp2Vn{p~obQhLD28iB6r=IJ1Y3S`?A2zPz+HzAvHB_sxR8wvX zuVe}Xb4b!cO#5*EmNoVD_sOm&$eyR69(Xoub5x2mD$Z

    SMz(7oU{Dy{j#p!gCrUye2&zv$>C>y@VRi*_W~5w2=uWCY|SlR6@3(ktCfWaU9* zm6BoMh4g1$toS_u-U;{HR$)4FfIxPuOV94({iAM^;pP1u1Vr%PQ9uYZz`LF@DqCdM zVO^HO@|-5_2a_5D8oKSBaGDl6FEeKgHzy-@HS<}yepjp~9-c$0 zt`EPa#hPFAZMqK^aV9GG{x*NJsUz@Oqk4neu3p!*Uhg$4@^0@^F@|$^hcn=Zw{!7| zrGSR&Jon-+o_H9ecs|o*8Xr4_LZb+}afRX~jq9AOLM_#nulI&_(pvkEH{A^$X0b+{ z;D&c97kPJIuz1I|-}a*eoOF{<`ANq%{ZgLfQEU;~EhYYF+k$zR3trq#9>(Hr+ZEn( zWAffUfSW@=6~3!ZLqH;8q?9wCNNTlmsw7H^sZuXBDA{ddrXQPI|h=zPwSgC;Q2@svmKxXKcvUU#vswR*G{8#I88QVij}c z0hY7P;^M6%Ac#BuJ%}SVVne;ue=!&nyBVvci_a>o&YZ0N9(I+qu*KAd@Bw; zr=B|QqO+nhvHy`XE&8=!yBx_r{rAT+FLp82k9ez=>c~B|1*$59DkEhhJIy(xtY)vv zN$7`;J%;{bC_<OCuDSR(t!n)4=hwr`Eun0mM<|lz%cXXg9{llT-eFe1J9lrYC33uvO!V? z43ai=@Zjjlq9}z{wTb~N1`9HwJ}`O`LdOOWnv#WZHf-1i86lQDJE7!83UKL8kZ?dk z-UEC0A~0|O0Rp~*2j|Ue05M_-iVZhT%-Dco#C0iGru$g20n3}~&aFsrF5QX`B}R}a z5vEVot9!0ijo~$G*Q%}7wmnqnPoKAW_qMG;s0QJ_iB}bV9C>o($2m0Tpy4_54I7{@ zkN&<~_;l^tIc%R^g1dL^&byO$zJWaY<{j8`VE?{-2NCk)%NKF~eg_i!NsQqCAHe_o z3y?tmMi|h)`}RA~zXR_ZK?DXJbP&G^EfgVy`#`90!wy0C5JZ6n0x^US6FTvrghVVT z#TFf+pdk-PgNR0mHbN^Sw9a}U0+vPyVJ)$|dLS&BQhERbmtcBnCM2<7$3jii<9e;EDjQ#`GerufX^m z46(u%OKi}{3VlpZLl?7)GtDl;>@m(Htw_d);2Lelh#rc7N!YNO%{ACw%W5c4{%0#L zH`h>IwYcF}B@Q^_tV8a)=WG@3x#_OMj#u%x>&{nSfi*9^@`zpUJ@=AT_QLs^6>z}* zq6JXG0I%$Lt&N3>4rv`rN$OySL0hCiN%gr0png~ujW9F!_Kl=hqFq;!23{uH5Lo~BQ9j$CJ3E+YhQb{+H7qrms zJ?%73I~^HRQAdTXHB(hBPHWw!e05bR0 zmb_&<0HHk&@N-XG{1!ZL!NI4c*4h9Yly<^x@%y%0ZpppUE*lpwQ%I90jPR(po0=_!f~dSU~>7aGe5oHDN!@%Km)IJ zv-so&m_iw2lezTD0iZ(8ZK^blj6Q+xF-{BovvRysX4pxxYtOp~3(QaU{RH$cz7m@N zX{3u*%r4A~rVRi3F;jYJr@I$M=w%}&ZDmOon2ptZLaI=8?I*o~U<7kBwpPVTC?3F| z1I(_mBJL-4R0~b8{azMxBULtCqEVf5wx;JAi{|t zaRw4%v=+B5!u6+H8yc6mJXE<4rOt^U*xZLgkdVr?%X6RefIygLkk&oK0~M%Tr64j8 z($I@Z`})X65)h{~>Ig|CsDMlc);kM0U|}Nx-$xu~fih`tcvguZ^Dg$hj2-eQCX>k> ze-ae0xr8f7;u!Ueva+OfF98f_<0iwBBeuXUE}$$4`VJ7kQVynlIeVXA;upUJ9IAfm zGa4)-L#X{#22q776aYE%839rTQ~4T60vDN;28zmf6I6}DXoDL;Dw9fIdzIKcb{r2< zvo_Zo6UcsZ9OP9KIUY<~+SYa}6RHhZB-BoJRyenIiv9;Yev{!mlLa4p1}=3PB4UIX zhahZ0s6RmzP(VvyILJw^S>Sq5K9!g{B}Ng7nCqN~)Kx_+vhH0Bu~z|OQ~}V?iy)Oc zjRhb;q<(QEWeI?QTi&>)sGNlYkzC|f<_Nx-7Bef6{1i_HiM{M4(s@f^iXo+!Na|ex z17XS&#BgIQ#K7@4@5zPQ2l0cda51LxzX)`N0C1nnlgV?l6IB&C%4KBobw_z+e zhocPkJiL{+{p&*WU7(x_}0hLDDiD5*H`X!o?Pe zkJFa7z6Ck_I1zKd%^c;A$o*0f)bcV zJ;u75-%20?_n=m_^T8oLK>%BC@pEwg3j*`ut`%DbE!2n#ZD_eL*X9jvj<_L;BInq3 zQ5m%huTT4;LC6^0*167nAd$#ZR)!-tb$2ZNnw`UVR3sxkY`n#U?@o}4Se{~qV~G^1 zmWEnXl#nWGRJy>B$ZI70>Ih|IX-a=NBEC1lu9Kj|lU~%vm$2dt*SE&YT@WzK3h#PP zg)x-<2DK>5=x@TgwCi3mWkySx*hZX6v0q1KHBTkeR1Bnaj8g?omMDzIyqPRyGnnIY z-&oujRL+mv)>(I(2eX{T6_ZDsWV*rdSWz~QldXJZEGv;c_{2|_4Yymy-L{|C3UlH5 zsV(19@dE?boJ31haVkm?<8=NG(cVC$F627obEg}Kras^j*L^0s8j-H}^p&Fr3`9*y z@mHb;241l6s7EU~%N(h`j3|Lt4sYRESbD4`%<0}F=$GR zkxeNn+A(?9(2cp8q`F2WNZl!IqFHoNw}vQ)S4mQzE=b#OyEee7&hf}?z0O|`WajP- zV}ZQc&BojG<0SIjOxyYvI_EylVb2Ki<~R1xFo*L|;+h*uaM|v*w?}-f@NG-DGlNTV z4{a9aKH%nxn~UNZ5B|}JIxY~6z6;MV!WRWBz|=G9SzoRLjYdq<@{Ux%10~gON!yqd zB1Kwz4WpxX1y8-FdIhQG%{Ece+q_N-)p^=vV|Ihmu*L&w!eqdUEY##IxCfK2%D=cO zW@0S@@**SFZtYCT)&zrn&@SyN%x3~6tq5h<>}P1`N3KHfFb)InO04e&2nJ6KW^!(k zaH`r2kAV^|kQmSMP6hI2<0X2^@)B!AoR+u^TLG3B+Ht>$!&;b$mS{DRuA7= z4-4}q;N$~YIE3T2kmFjbLP$VE#O&aZ&q4Z$%o68^9H&Ak1VYw~&5Ub9DvEEUuj9V3 z1E?=_;6=I2{-|j(MFixC`&z=;zGyV0hF&NTPZ-d;&Z3PNP$s|*Eb5Prq-HCQ#7K$) zVu;7QoT&f{5a^IjDK-rNiK^+a2Gb~yc%%m{cmyo6PSwz2DX{8|U`>rCKzuGx0(j9d zCctJ?iNSP@XZGR)OaK{8-~-w&msT+D5am%IWq#>B=|*dqyvqX{$b2`LMNE^EljNebaD-d4!8bR`RsWj$ce zLiQ%hHZEL1U_gKfiO7(M)R6eXthNv*%@#`HI)q%Lhz_S{Z>lKcLV)A=<^%RnBt2&# zu!w2?4iSt<12`_=Aua&@0ug3tgd!y3B5ZOOb@A2A0s>M7yu5-U(jqD%iP2JwE3^mb zOsytNKov~j@y4+y{)iMyaj3KesMf1^u%ZGA55LxnEKnk<^h@iyhre14PH0XSb5ZRs z(5u!5mHLDO9gHyUVgdwV707`cR^cx5QV{3|1Xs|12qhZnss#6^1R2E|u@Moq5oU^n zVf^SDF%2DKLb_TmeE7v*!t&H~pMlJ1Bo!4hGR z@&Piy6uqyFkNdnOQ8W6vXqF=BiBd{t+C{U$d?gN5^ zPb7d5BS3yQFxNV87n9>@Wfoe^BtlIt&^?EW{L3@1Tt$ zzRQn*?j|Ir@LKGc{!`m1%{EM6KM6remy}5fK@gHL8CgLPMw1?&qio<~A&?Mkcq~gb zsItt4ABF7QI4j?v>^$i0S7=lA2(m(SlZM{oiR>dz$wfXKl5x;1_|Oox_WqQJ5JU|h z$3ZHGa-v9GG(^rcvf~UQxlE+`22li11R*kt&%*Q0Fr_8D(*j^bJj<^pDPn-g(`6J* z)$~iH+%HW&!YGIm(jqDTD2XcsK^$Cx5cU&~uqG-QsQ-|HKsOCz3>0Fd0wxrc0jy-^ zRPB;%F+w+#A}+LhYHinW(ODC$ec*B!<%bZ+K@b#00}ntD$YBtGjYe$=*<|!+oDpac z6YrpH#9k0nFi|Bw;-+NEn6Tz*<`u?_v^J2mYgnvIRDlqv^f#&^wM5T?z(h-pgWYD6 zJgNiU8a8h9u{!h(Af-%A%_FsP?@iqlL?-9Al;}<;1o+O3x2k3M{tnKdB!}NJgyNoW z;w;X%Mv_taP#_GlpfsQ%Vua7O6I1vsQ=|*!Hl3r~1td+`DP%fAZalrrJ~5G-d9%q>II z1jylU=aR1UA_T~RMb}4v;x2Jzv}Z7EGHeupaP(e0bsH-efgYxhJf#ApA~O5;m~J&+ z!J(NzcX&iMYbl0GLl1So z5=25$hg$1+D-sU3pd=M}1V3TIG@i zmw7T!@P0vitWiQKS&xUHKo|;AD=!~H(ehnh5^zW)CcH)&C75zQGhkKq7eGa3DvAPtuS9@rkykb5=%gx3oT34Z)q5ZmmmQdm zWZ9~5c`tG~mw{Q8_+%JWlo;CzF!`cH_ZEH_cb8b0Ftzn(95-@DBk%f7uASzS7>!|g zID7t6@eGggd;&>B4X{{D@ya=Cixl%XNS)Vtotc=%#KgyHtU8d#p6^*8&7WzZ>hy_UN)QQOZQTNI%qW- zGE&O?PBZYQ_s|a;ocBtG~H-5hRi! zcEX2BvJW{#sLrr!GY`vi+T}gTQdefgE!gD=j{kNErQ5a-&8i%&Mb!dZU!aukoQki94{IgSH8%zYLS*>+t8z^$2)PJq=e&! z4tTpe&D5?3t0a}Y06CIXtF-`Eh5xttvQk%T*@%QzZPR;BVe>9(1;*RobqN8+6#}#6 zjt4!Od4JtfE8%?DyD^N$vuv~Aq@x#Cg^D%&aY-xzL}n3x28Yg?^Y~M+n}oVxK+Tkn zYN~Y-{?O@b|Ka0c>siKMizQ!T*Gl}HH=*ERIC%8A;cgEyy$h+!R6m<)SVRhjDRPY8 zL8*hZ@U(eMTGXKEW7cQKHJIFJpOfWe;Swe>rI<*6a9RI$eqeO|`Z0>XX{FE`-Frj2 z_U~hE8#B{7tzH<-W~xT(kMg`Wo=NYZsUOaURtl4uhX#Y+47=E(eLkB^`w0c!#QLRo z#XL+uNO!Z1`^oY>;*gXnACw9H>~aq-(J5o@29y39 z{i?OBmH6_>dsOQE^QZR-nQSj@YR>Q7Rm0d%mPc7tsKn7qVSG^mxB4f2J_F*;12xMT zkxC#u0KoTBUUNKpa!l8-siQ1hO~F6uCgH>ZKz%=l^=j2`2{==3he6p*n8OjW-!9fr zNszQjD&09VCs+6LxSRafj&ThN$2VO}ujBq{zXZJJ;$MGiA2hpY@!xALR7Clcb5meC z*mKD%D^c4OyQ!|P+-)k*V>-2jVmSD(*=Rn3HyC&K?A(6vnr@OlWAupc z`G04!yZ!nr{gIMnq&xz+o~2!W$uynptKeXXE79jM1gVqI1O$4k8O@_1tKTc=eD3D@ zRgrEpWgz-}e}XZDHumMfJQH7_H&i%RuhydFzrPl0G^Yf>NBftf?55K+7iNOc=Pmxq ztNdfak4uc??0@P{k_U%e6N6P?_fOE!b2H z$Q2SAB_qhlxC{}%E_^H+lMEIUvkQ)jC*m+`=}9e@!`+=*e8X6hR@WKr0V8_@TSEw zu!lV3;q-eQBa;p?H8>Kv!;-WZfJcsRn#ZuWbb$II?vFe+P$1Q>m%dnX)?8!!iB z)0GTI5ZMS&gK;TBL!&99m}tOsS$3l=$V3`@AT|nEXgnejm1F`NNlP3GRhGeCJagK* zMLgFsQMsh#3sX51XINlA0T*f?Dv78F&`avL$Q@?j;z29j#@^zMNFQs`rOFWYL})59 zctc;773}l8j^tRd_fimSiVT+&WOohm)Ff0_GmwaZxD`1*6cW1R!)&n!zzot!+e))cN!G`#hvJ#rkx|{@kNHhbgWIEWZVBW4QaY zW{NfRJ70yVH@Z|yQ~#;^gM{>sC~TB@ryvbf$nJe?8u&|-M^ot@Uxmu|`3Y%f6!^(V z<&C60^#hK?QX&!lMx3cMip+O_Di$jwhc;R$tASQQENi}Onu}qBMvx(=!7}mf^9%Ap zJSWbnRf+-yr{$cuaPQ%wp_ct^)?6+tmXxw@EW7j@87!MZLd{DXdEcfDh5~z=4jdV< z+Qy_))CgHNH^6tq*D?I8o4)m3p7*C>u%Z?*k_U0&#^cjw&_Ua_bsh{(tGPN@U%wS ziI046xq^WmjfL>Z=MS0tswO|VA4Cr7?Y=H+6~?-U>`@%>^P|pj&RgOHH~2qIC)kHK zzQtD`@Mxz?yuWH9!KY3<=Xb*h(^P&>vCbv{2s;{7Z8PHc^Lt1KL9ll(>@Rh>sXh$l zC{*^gpp2z>KY|Ww>_oeUK&mC0VS4u9db3x%$trgk2(6$R4DUl$WH0G#{8sBoWH95u zh}(tx>A=}`1=s-J;dcI;aSjNeE^YB<>b;I&^!|fe(IJ)f$qs?V|0Z8o$eTd(DZNN`{>oB)@OHI8(pm?j(sBKQCtDCW645eRwIZ2LOP!9rEJm_Lg&H*_%b=#b zpV6a6HVP^0zQ3ze**mUy&7G7RPiVh7VT7Gj(b!fXSNm8$hm2e^!kqaO3pyWiof=fQ7+nhRJz znAn$GQJ*xESQf+Hjfb8t;!H==U%cJQHh4I-1E-SbTAJexOZM!w@}?7K1$R`i|L3I0 z{W}-zFDFq-ZQp^N0h7wRFR0kiEK+XCQW*e;6Y=0!aQH^r^mj~7p)HmF0#H9nL6zx@kges zMqiY@`Z~@|s*;*NV`rb~5XZl*s=W&}e=83{Td&4zIc;=yu3W8k@kZt&k)l*teA0-m zpF;fV=J$}d?}tLY4Da$5`)hs)v)$jW%~ntk=y|^7O4$S=y&r)nycCDK zif~`if82f;Wt=E!O3_m;L@SoeL}E$|)U8(jJnPDt(XLNf;k@fs|78KJ?~o5PRE&Ip zFbT}EuPP|~5l=TXZ>l9;kPfUdvJJtlhE)iX%I~lUI&2IL%-0wcv8dExVZJ)r*z{0! zTKOP)eny7ssG-cD7zT}qWsjgVTxoMsI&)l#1MPO~V5$gy&Td?sD7pU*7zL;BHhJx% z70eD~32yaSl2c`+%VIiQmx^xWXSex81`w(v>#b!y>Bv;=7eeA^to9u1WH)_eXvS{I04D;&Zr$_u4d+Ee40F z)~7Yx5FT1ysTZ4qiGW7Nz)hVS*38flLn#wZ*aOIy+=E)6U`Tpz!;y4As|yQULqd?L}NX$)p?-1J0)57F(K zD$#`LIq8=VvRAyU8deVZej&$<#AUc~O^Dip*%==WNXy*gy0g3+4PdqVB$K;wa?H#$-Srj)n{@+tjP7$lKM6S+KWPY5LK>8n_`wS z5|S>URcoV_OC$%E48imMP~Iw6^T;U3=+sae2Z@qz2qzJwCq2|6{fpvrvMjW&MTo@2 z+igI$dc@xAD>5-cKjTg@qz%`R74zmN=gFctzO`|VOiKp|@6!;rHc_uektLA6Ysr|MV!KHus z7n6sjld0hyNc155{&!x#EhQ0i5P7MwJ7WIigRL(OAAV`7TYFF}V%nU&j*SB;196P% zHH`mjnj#+lB{Q+=G4VIUkP^h$A{;HD4YO2FuMA68rS6!=$dIUKEjbjJEVGOZeaubn z+iK6a?XZPw%rC`b1yM^;uEFUx5ibk1k_z%4165zbBOoYTe#x(=x9#(6qbh zyr$!QB$Q9A3%v7GHY>E5Qcl6VA8k{cd7}*SY|pGbSZ}iq0*sHJqdan|Mi^e2ZJvdg znT18Dg)2_vCSF_Plrq+s?PJ0<_rDgZeAPTxBy>p?^j@kK6m&>~WQd+JM>wQMJILj7 zktoi*XNq;an_+A8Bh?m^M~sS>TJ_N&Q5cldm@y=+YYjb-qOMb_Q`c_S*k^l>({vop zbquli2Fkv;uAA|zCnw4NVrNM`>%z~F=-$bBx>i59874~5fL|USg;KslRL*&(PY=mm za0po3q+JepmwagW=Y(#9#OBFP;v1@@l5`4jcPQpH{bipdb2P*8ne72;_VF!)TUn~V zkDYURm6T-j?I!660iHLPa3v&8ELARsNR!3C#v#H!c}Ww=QGi}THut67?CfiG<8Kzl z>e%1NuR`jX9}}nniYy zCft-mIv5BO&umB8rP7VWO44aZ;bKRN5n0ZvUlsm1eG>SE0Gr?n^p_?vNYQU2zhez~ zYOt?Nl{9C+zYK*t{8-r4Fu&86zWn^W^XgAdI9cN-9qya+hTnlhH~B-)JrYgTLn>|b z+p~>tWF(Ku^4ye%EjO^bW3UD@hY6`|e{S+RmsS3_=4rUgs}S*|X&rXYVIUTni{5H| zW`qT3%d81%axhneNn3_ZWPRd7iWwY=Y*^0a2{F%!BovA04(FBlW#iJ{J4)JL5j)D~ zF3fq5w%ymb-FgpB`ZU)#&Prx#Npti&>iow0M0u<8X6J?Mdl)4?_h(&e3lo~kk$Cvg zin;ustjY?CT~Ixy1mlXIl6z&na93iOf0;U({-N^V=yO>Hp?{X`AP33N&9us0ptyLS zHQ!A@o&38B6dnz&iY$@9u<^V}N2gxx6f+jS-(JQe%pQ!2ehx zkCZQ8{()1%_D{G`$o9HJN}na@K#4hS0wSUQg*HpTHsLS!LzJ^JE`^FHft?dMRVb)QrbMjt` z?;qm~H;Fnyo@h%tNz3O9yic;Wc>&*Lsk|xonzPr4# z1e~jg+4EAL6Y~_`KTQkPJu!~KVsG2P&jl}f4{~<5J);&fHKcKCq6;Z-S*?%TRQTVt zii%cL4{s4d`V+Q`Qi<0a`y?6&C`ICGG#!y;N%r45%}}o?Y`0BB_0KL97o*QoL=1E* zW2twBe#Iu2ilV+x6z1&LebS_c(^J10qlgG5|Iew^#c(Gsap$PZ68#F$A{E-v7~tVygEL#X&*oUwvQ@C=QGj?~;6fMk@9TTje_nsAFK0!)Hh*f} zR==+fBRTy~`*kQWm6mZ% zF2z#r%Od{I)94M?{}|4Sx_1}6&R$`l60>J(XWVamfhxm2M$ z_tU1iBBg$0U0lD3h80UNTGCE>rlI_iC!>a^@;e%6fKLZ_W2SNaAwFA>PQWMW_B4(af(Z;JPO?bW^!XFV-B|>2mIs-^Bkts=p}6 zy4v=wdy21o6D8DS+AN-6yGl&;&Rn!OaqENe`vvC@eOI;Hg`{joZ@r4Qs=0&iITKbZ z`wzZ~5ZhWE<$~gPJDUee-%5gGQt)KB4?D3?F!9UGon6{xX3?LX-ty5~F)#aTu&-uPKW?l+3s9e+rcDAI;+$hP?d6 z;+c+MB^~_o=s}CPM#R=(6HI-Nu-QUhq4rOr+TnYhxn&8t$>Y@yG?DZn#pLNXDn*KC zl-h21^ywFI4THgfXQZFs#6ur3rT#u%Q%i*kBoF?5#5`I}kEVPdfsA$YEq|)`{eK}Z ze~v#>?hgG2rqdYy@2s3d?0VbSP2}hFepA@l@IHJ0uNv(pp~E~&%!nhzXR7i90TR2? z1w0|-@+7EHOl9{qwl z8xEG2Gv9sART;h;(KhLBvi0l;7#7YotsT%DqK{oRD7yJKPbL>1>uUcZfa^_p5w z3SN_CpmjdJHF9^A&3HIMiOXir%CanDYf=jVa2K~K)o zKionZds=X z9c}&SaNV{2wEdQ~bD`hBSA{=aO;Rwptlq#?7CpyD%Tx?%$=^8hZ$=y#tMw$DF~&uV zUGp!gwogZ8eMg4-_wm==zb?2*hZQ)gU7c}0a_-=pTBNpziP5!|XK|V`Go&!J-0m!r ztZBYXrE5LAKM>*qwJfo!QG-h5WLJ;$l})xRb2VBN+J{`tzn2^GX1>HN6fJR|Ht_l1 zZXEZ=h>?Iq?=ptipZBYaL&OhlNgT#8B~;A+GD_5t%W3MiZ?5u$v$l9U`}LC+*=nSd zwu2aTY#nt6`N~LAcI=$%Vz;(qwE6oRlf3?ob~_tP9M8m^@{@3Xa7V1+lz_A!yHPy=6o+D|cs-dKpQcEi0g~3stG* z8HFDS?KFXz)A0@a3X)XIK#WQRHJZJ#It?f1%Jwv9I9%acMGEKOP?L_`Lqa*n_Jxk_ zBf2tmK8|J_cjXDMR^VnhYR15E21jcHv-*hA<6_z1wRxqgKp^fXzFvI6So&Z$FiD{f z@zBF+E$5x3b;&Ib5fslx1Im+OiDQ{F4y14+7tDiN3CI^hooR4t@W!Z4Qo1DRbO~Ze z9p@QHH4zvg#IQs}Pid0uoLL>o)O_Ukx>5%f z`H`9xhBrlt1!am^BH6<#jvNQ!-%4Qq25|97iZCM>OSMhD;TJOrcq`hOQ7hS@u$`si zwqfey8&D<6jMKm?G-=9q8OHWbu);qw!M5>GAZl6zVr>!r^C~l`Ssha^sdlxNs&Q%Q zK3Z+(^!Cch5p<6X%-Tvu%hq`X#GhUC+V2ZFZ0+mLjKl5;44x4}A}^YLrvFjR-KeUN5TNMun!s_B{?!Zv+zuToty&Kt_Ub z?6O{qA1yH6o!rD(xO|O?j-p=_TqiF+!(t*)I`KIawIe1UcjS=$Sm2rm&#Ul!`vhIS zG=lGyJ5TdXMpwQWyCuCGN61{#tDEMVApnL)strTAK`x_ol>@97N?VgA$SE?c6Zxmf zoCNZPU#t|rUZ(oK!Xi?z@dL!Xm9#1>6f^G>(ly-8=F84z)L!!5WVmtvF!-Ins)chI z(h9wLfAn?kFZNNEEdrG>V>(l}mb2z)grmu&koln?U30*<7!BAvGIZEG9r%Ji5=wks zi4#kHeXgnim(-^io2iKN3*!m{FLKsr)S|<^226heV?^2WD4_~Htp5y+Xo{mtYGt{* zd3+bwM(-ov1eZqj(1zi-aYYgZ5PGLblkT*=o2;ir9^@-04!@WKgWj=wY3LBs^uCgT z12og~PI>7rPZ&026)Ai@z8>iw(sA6_X9@AO<(bS_or=~ytk-i_YSFXUgI=wF-0ze= zcLZxKu&~5VuKu@oSRZog#TKZj{0F5@z1+nJg!Y(&#Q#DB#~vh!wEmU`cTRaFgS*ul z;Yw|2tngCtu`8QO?deRYwtA!+!>n~_j5Zvkxy%@w4k|ZD^JHNP$w~dn$&Sijl+qfO5V-8NA>Axg`SbJyz?BNXkhN%nigHxP2Py z)sBcjt+CGGBxKlbAsBlC4_50g=R5As7*1{3ZZERx<85e{g&RcD)sw3)nPSzE&WPq) z2F1>cT@&AmU6F`qpt_e1$GAbos z`_Kj+H<2EDk~Cau?`&$^8X^THi`iS*zsXFoKc&egzhnu{D@ud>?^~+P?%3~`nZ)Ch z2@+?Xy8fy-30BUxJ~LeP$+BCtDubmKZkiDN>{S8}VV~mWrl?FEFl+)=IvH|N`n`C# zP%f%;%17>o5Ou7?ZxW*xy7);6Uat86NEQ@Q!)mn!m*D-(dzh|Ut&h{yeYD(ETm2s) zBJ`dTBarMV$F2_C0HStz}97ty!!>TIqPe zq1z`|HX|s!(d&94Xb9%4LctSnrGGyvHnEN-?LNh&lc1NLpdViUt^)6~0Xm=8yNrOb z)}^WekD)*3g`;KVM*(AP?lV0hOuxqZ55PtW-UtNwk@W2iI39Z60&e2QngmaI^&52tdI04 zMd2ImOZ(*sr&Y4g*!d~7=K(}zziHD1a1u9CYfhN2<8Y)M>5xL3FAe2rF5<3AKi+YR z)maR7m2l+ykE&RTrbz%V?iKN=e#(8JgQXk2{m85yYUQ;k|TCdO; zpHayyr$CeDSZM@M<|T{Oq0(x^*jP8Q74s;$ZZV~gu^*pN%C2(C zs8BOus70F}D->dG8gQ&+c-SQ;rCB@9ca`LCMCBmG;6^$Q!`wEf-Zq7~{M^ZFNim9z ziGy~Yobtu4I;3?RJTm(QT%XJG#k*uDqW z?|`qjz}j!<>NV2Z6?F9{uzCrsTmnl!fzLmIg$vO91u%0COq~H!C&0`xFna_{9Rd>v zz}Nw3Xcy@J4(izkb*zJ0RzZ!+K;0rx`x&VI1XL^lWphCB3{W@)DwzP44TDNQ0!0Hr zelJka2`X#>S5^b%l|V@aP+SU>76WAkKuI1@oCB)J0@Y@KYEnU!DWJ+EP-P;hA_1s~ z11e&HvKUZlG^i{RR1yv;h66<(fWi=W4CG`!kW!n!olx>U-#RNA^UhWd2o`t-LAnQt4jIGb~M+X@A{O2xZM<$KDN`>Hg0 zEA(HB#QQ2O`l@VtEA9HK9Qs}f3Z?Jc3yoUy^_z0^nzH}DGOf+DsLXIFPIJylbkB%$ zON_Mg^U$}olu(lA;NxRpV<)F&A|Ru~CZfTn;6mYb1*uSX+K~#0GJH|ro({Q2=IOkcs~xjp8#N!AlNhjn+4v_ z1Me3==AQtI1;BCvWW4~`E`aRjL3Xns+Zn)S8nB)QSxp00Q-IY3U^xa@jsh0LfW;7C zH3V3X05&6l?I>VB0yw;C^#5oKJji(--D93BdfB#qBXaIr<(I9V_3f#hAIs-Q%U8daZ|{HHKU_RLJ^uas@8$np z$S*)FG8?xHRVs}vIsq9@g!vdXX1GEEG89=R7N1nD!C(nVo=QyW6~C8uppYi!RboQS z9j%ncVK{pMx}i_X;L==1-`J1BAm?`zD0L4%!6@NRL)5MFidrG&DN+iarJ4Lv&uuf1 zLcJgPwHfxY&u_QPX#<~Kuf}xFrx6w3;YX97a<)rcKg-XvZ*%;SD7e0$YAUWAsQFlw zbcw`#57!=c3b8Z=HMlJXi$=*0&ww$L5!nWP3OAyZK zhlhjz+dVD@BU<_GhC&Gh%n){T^~s@hX$m6{CZVfP$Q3yZ2tgY63k?O=>05YVDPWmG zu}X4i;@?`->;f_b_6Mm71kA%}DtxC_=^$h*i3}Ar`@>8Fn_6oCja)`UQbs~&QN|*R z89UcHi+Ma(9H5TCav6O}l_$^jN>lMWt4PCSxsymQ76bAa)dg=Ck1>PpHEN25c3^hp zLbst1Oa-n9JPe*4*eQm(dqAd+UhtWYo@u1@nZ8YB=9!^$=PZHAi}!+cwi)ZKb$w&> z;j95lUmB;BijF1Iq=4#~FS206nJo+|d^4$!Hbr$J>e@(e@qbrir$0xBTjp*^fQgIDkXCx9jzQ3`m-}bb6$vkby;6s zolWlHi9J=&FbJ94 zZ3u)&*5KpZbr2ZH-qUd{XY4ozXEj0W!Ph54JmWSPnHD{!l=KnOBZSAC8xF@lceZ{& zKo^D55sif6QAH@)NpR#7fvCE;Au<* zOnTme{j+`2?KZ- zF!5|PF0e)6lTrr?JK&YvY6JxZ8CvdPS)Pm>M8+5mO!pH}Iw1+H@RN7NPbW4Auuw!# z0WL-=tS|O$sv6 zmfei#7DPy^XX{;2gdRd=*?*=`$Kui9SL=~0U}`3ASQVT1ldS$vwemB8K82(s}3!ZDD=(N&oOczxA}(pRr5R0n-?Cvt|D)GVa1u9^*TNAkGdWSaXK0SuyFa^5|5a$b4;n|@G<){&rn{a zv&kT(YCLPNx(K$H3k!LIwgIiT_8S-V9@)xfVfXEWtmxMo@kZDpQ3j2L=uWwUqE?EZ z7rS^9U3AOE?!8wEMly@t7LmyIp6|iO=t+N19 zQoCMXjL{)1f16}Z6GIw_HN_u0L*qgcMuE|EC74;E#@&mnm}VkS^taYMq>mNT!7aU$ z(x_A7$Bfm5$0TcENLtnE#LRkMb&eI9pre&ub5Hb0_o>c;i1@jju_EIwm7)?5Diz6~^vjt|+1-kf@(V z-rT;7$xFZnBQSF}bhi=i9W(SY2lsS%1yPI84Z}4b;4$XL zlODubTwxilDxa-Xqq@SnR>LS^##>`{&DbVmAo2VtkZX4Mak&Zqw9l-p_?+x3`&X;P z*Fn^Sg077VX;E6V&7qr-6Uu9bL*ux|OMU6>cZx45!~=xOOGY8la+kr983Wt(X{gf4 zh4=iKtfU@sK`nY_{d|%{x7@7Z0irrmjwf2_zVDg{D0%Oq@jcC15jdIKXl~58UWn*i z2aaV;cyvapE&lRhfva`ULAqH?Sf2Yj?vUW%6*rtEhP7@Sd@d_a?2x2#1$ddBpa#Uv zIwWd2E^bfnev0v~J0v}fsXInL^8kmP5HC~8hD+W?!`-u4TZuQtz+l%Cb=t-P1n+>@ z;t{cSWx$Ig!9(qYlU_y}(?rEfB8+}v4c^|_*ThkL#+{jV6eVH#*kWIK!g*@!CnU)P za?~VF!hhA+pWq~m&}AGpi4apq!#DOE>mqSP4wdp|>7)eJ`bJV-@7ejfL9EkKP)K zzGUgxChs5Bo5p_%SQ8@9L}V z=!=zpP~;MdKnNYr5#q*z7^VtULJb>uSU86hFciF6DhxgO61_{|YdwU6v_u1YL<3r2 z>J+2x9+3$gHh7jw@vcg(za58x@qo24ISfRULegYT`e5KQf0umcmwc`5WBnj@9UlG? z6F#5mpUclpqm?4DEdBgN9bM4nw`Aly>BuWMC$6HITzKT^i>@|)MJfSG8l_;=T`3JF zjE1qzpOKlIQBb|GTl~RO3fqkv@h%NvvTz5VQ?{b$6QX(JvBRY%7k(E&@Ggx*H)gX^ zo8!h@Zid%9ot`nv^>HmDB?rq^CJ5plq+E#wMRGGOV_5piFZCKFp29Y@&JtRJh_~P> z9zob!1!8U)Q?!|a!`xjrLVjj5{d{0zFNKJkf8Yy+>_6ZZS?XtiD@^apO`{-x`EACL z@wu>As&6aah2~5=;?4Hh%rkj4aKpPTbAu!k15QmXcuyzc<8Ij0)cMRY*)1u-mXoeJ21P%}UT=O1J#r zd8p{gE11C@LVv8l?pvWtASf}*s5b1L2M!G<4vntNQJ1W&|B|Byg1p5NX5%!J=_W8C zAtVrB^gpQY81POlKaQsiiBXk-&(I-7 z#Ww#9LFeN4t>8Dhljon*3#jn!jWe@>oJLnFeRDUs>s~hM3XpxaLGSScxlR^TKS1%emgNF;&OjgGf_I`gKX`sMSuE^LuLZHHSKyYL=e|6pxf`8O83nbKY74G7 zrD$7 zT&Nt|FqmzOrd^kic=v?uYdf*0gWXD+@j6}jB(FGu#)x{pzp%&%c0>MJ&_Y7o0=82P z>44PKu6T9UyCEaWFN%)lOmuNbb;Uwm7U!cEDgdX*XNFZ@$R34gns`G%Hz7i20YCXK zW^&+8Q%Yo9&a?P5YFy2-rlVjT1m6$`c1 zg+5@>sxF7zzCePlusyW+JyaMeb{RK)-CMV&Z0@G6^qG>!1)G`56C(tl&O+i%Dgp)d z_ovFQky=7zXT-Qd6k9!5yJt$gge-i7O2}sQmJAvp5bQ0XBm_u$=WM!SZX=kmqXNtr zO4!~&XmLi!XiUU41yMM){ai}zF5pxkH>3Buy9TH0zK8ezi>1Ro8Q4WQmPU5bt;c-{Of zfu!P#C6`8n_Ejo%nQ4Z?9^LYpZ1z@f&iRC#EVLw0&YW%1wY~I*kR=jzlOO~CsY8=5 zcbTzw8Iw>y^Q>O(7_MJ|;LArvA*$)L@(?+aik=$xbH;4G5(J~+__6qk5MJi=QFjFr zyd~w9^7Id4yDehwt5!Za+CupHdHBYXEC#3q()wN$@oQ~PglmrkLv(GyyUJ_pMAyRL z>%jd1m7x$la0mn2eg4qc-rSs*_mMy~M^4h5)Z2(e)geuLL8c8E#{!~(v5(F*df&HV z7uJo$Mz)<65}ZK{Jl&6(>Pf7lUs3!ZZf4;RpKx?G5nFmW_Z%C)rE^G|<&YGG`i{Pg z%Sm)Rm^^!T52!8-6>8cMk@G_Wxap%SzIG#hbmng>Za~VwVUWH+kHHq@WPkUr+&M!7 z{2dlyVOB7)*XW8wJ^3}D(V7mbY#rn}es%@C5vt16L+Gb$4GsglGqPB1X8+KvLby&r z2%*`L=Cj(b7D(TR{+2)t0>8Q5VT!&8F`bOh+Jai?TGTHG#Gmy; zbblUTCRFY3s?;U?AT<=1pUsTiv$+nnH1%>@0x?pt_Tp997lQwNU*jptO~W3_YUKH_R$-w5p-ImR2(>xcs+B>x?Z%q%3$9?pV()2J^@_P&hGm@mA? zJfizNMtJvmO|wWAT6hvf32r+g+Nbo&F{7z0MB#;bHASkLM4O+aa*J%eOK|Cs*JO*( zjQCC_H1DrD<{}rtLw%RVYaPw2s4l$sLxeL%IVfgZP@79vL*^!+R4BlBJY!@kqq4~2 zz!`erEO&i{fQ${bc6;zuN3?l&E<=Uz0KDl?lg9)x(y}m0*x)D}Vf$x5N@AuQIuRaP z5YlOP(r@&{s1!x8m{UHyG1owR(0F46V`6SC$8niSx`nR4K{5gEd zZXf#iffo-HlT)#0(C4~0$T7%qm2*wubxWb_l={mVdyW#V%{$dL=tXk>BEN09m{>4m zKSlH3cFx=!NliyQZzv+K{R!=6w*gi}VU6>Rk zKlhMA^Vq@~-q_+Z16rv@z+q5)G95RGQqb$~CpQ_4YEK%1N@rGKP%L% zhtaEMSq%@v!x6De`Vz3TM^#V==uBD+Z$>}ma=ksMK-q;ukkLshcqBq4w7?KVET$Hn z(pe-{59?lRh z_?uzFkr<@x7UK%olNx*9;t3;WMFVb*mdXhukoV_uPBmZd$@0)rsimTz#Cx)49|Lb@ z0eInIQ4Xci&k@L;wC|hs>od^qzw#+J$}zZWuRg>4Z%#8GksnLp@^45#d!I~$j=tXq zn0Z|7r0xfJkqM3;=WtI<;&PZ39kggdrvAR-EatmYi$j9{@fF+-zd?H08>1d1y(r&B zB*AHr9Dx#=xFHe~BuF9>Sj3nkV$f&6#|U{cB%=t~f=Xp@)xD@?3H4yDvV?{r<_P#! zI+BriE)A`dq}mdoNb(OCT+>vFOr;9Aact&LI!ORDgI%QZTal@Z>q4TocXV!N4tCuook;s3TxrG~*X{Q`swarFQY5#PDjL(Jl^XclM^b@g*#ddi!U^&4?7#M{r2NqUJ0Fx+1P%r{YllB~@ zb>l6(S<0gs%Is?6!~%3z)75_8>Fc0548xI_P8@X9gjZuf=i;;=Q6gnU5)>nej?cw(DJf)iB#I#Q%$k!hm{w-7w`y=CXe~fe&*-lW)c0X z;C}#gK#RZb;W-;{*g=PZZ*!tL=yaIxI`f=p&k6S2(}6$&=PM9y`|``Lz8Z9R!iF3K z+&VtLZ#b~-8V0WcLc?jma6$|vWW2);VG!}d#x0Ee1s6=b+yxd^P_e}oUu<#49BW*` z#~)Ack;foa?~w!|O*pd1EKA^^gb+edQc5kU6v6e}t$b315kUBI%PzSLfypq({6J0T zoqrR~I5(J+PCfCYluu6?ZM0BBZ^}u~Ww{Ua&j}zEG*f3WmDDEpmz}A5n$DLXrt=*b zfC38I8p)!A;yOr0Tt$&t=_)C=dWf$6EE17b9bh0Oc@+dBSQ1|aP+lczK(UCDEcg}b zCKsr{*QAw`2Z*o%qe1{aY!)s8*ux%AsaFA3Wt6W(fCuTiN=#nzm6sIjDEy)qy`WOB zhT-F0WjSJ0{xyJr9n2mO!N9~5C=SpeD3 zpg^*c5g{J*0KyRDILFe+Q3yc*!Vi2S1tHuK9`pDC5Ntz+AIJtWc?{$a zBqS6ZshdS=QVFuuB_{=sOGzpomy{$tE0N$yxa)xNzJ$EwEsuF*>VTQp1id#+Z+g|! z!1dVolk z^tsNFmzp$^(F$UOP1J3(n<*$kH-ls(*cE9@ND6^{&8g0GDk)0pG+ywaG|w+74+P2k z0F%aqCNt@?O&rKT1~~9f4an(EnDSHk9$Ep7c2H4@YH0l;08t8j*n={$Nv5{fVNP*W zSsUf3q73D%{_Rabe-7ARK`hA9nL5OOvWjV~TGi84waOr`VyR7o#nXJvkX%N|pu4Oh zQJNTv0Ti%+Ql~W&1WZfIOuYvJ5MYmZj2Ws`6&G0yFqH;mRS6K-Dp%O$5_qu$h*1%u zQpj4CH8*44LMn{K_FuHmd(p$^R;nc58zz?;d;V>;7v2VYUbSv1Y_Ub6!y z&`}C(#G@Sr$pqXKQtXf<&LpAJzU-7Ifn{eq;q|Uc$0P9V4y?R;mZ`yQda(2=EGOzk zcuzTr00sWU6$(5ws1eBMMne_UQGJ-`^>dV{N)@V}&jbRH5|vCA+7pne&ydHL8N2axFi0;s@)B;bLhA14BSVtXeOJxY=EC&fyM?C6DQIP)T=&vwEjs?X zFH(&b!tzr3h?!omd{xX4;1PtcMQuAGyCWHjHV?(dOlCwtHK;QyGnj3xHSoZK&~!GN zp4}r1$idAUrQqv4<`F!|v3>S!kIUznC)>}#_OqQ}9`lf`ZK_27Z|SX{wy7;}fm=7- zqHqHzyxVSJBb+Ypjqk!uSD5>bfqx4Tev<(hXn_%NoD*RI@nQiLu$<0`rU*PQ7O^HE zp|~J9fr~o!0~2$PU00h$#v{GXgksWg>AsR1`j_}B>=y0~yx}fk^qfxFe~r{IZ?=GC?m9CldUU+xbY`0XYIoIW946tK^+rc^^s2|iHcM(FVvqL9@C?>o@JEXc&fwMp9IhcTe9}KCYgP$tY zAt_5lV>uR6fdHi2l=#^~^r--yv&o}K00dAKgdm8q6GNFwvbc-8oHDY7xFC-h0F*)% zqgV+k6S1C{N~Bt z3O#$c3%+PHZTUpQ5E#FJE4#8H%v8mSNetLqnIa&XGDwX6!TN$C5P~Vtw2;XHEs)LG zL^WO1MOYgGp_zh3nu6s+###e{Cio0_$Rl54nnY?w@CXm=iw7;pnrh6(?&HSj6q`$O zrL9?|_4uvy^MWY2xA;pX9jK2TaDw`Kf&zgLy%~@LxyO3srRdtn1%Uzo`#|HPucz+DfJTz&`Od@i6i?Ti@2!)GDDhT zDIH5PwA9jsK)W$CiGeVRwlJ5ggHokp06mnJ3$Qu~NFjKDmMA)k16T@rp$h_VGaBlO zMQj&$$sm3)3$h>p%p0P>OjOSUy~(tTz6ixrEVNMc3r@_dZOI}ngF`sWX@M00P=;$b8c_iRwI&p3&<$+R z)ajA>`T!3^5);%=FHt$-@e&Tz*pxf4dIC|E6q63f00(%UGueO{^d~t1D4GmX7qv+r z9TlDPxtu$ep|eA->WZVRp9)}79=b`ME6S~^LO7#-kgcX7nF;FrH-)T(+4dx^}w{TI2qi$U`X$+a0n zTfI#+#Q^ZsPi4h7f`W^A48qDR{>A_q?TeaR# zoLX`>ca;z4@}+&mM+%{??Ftcm9l#j)u7V6N@jAE{7+4oj0rQ$b3T(*H!8nDL$P>uG zZ<5%J%UFwLL6hu&mCIO^yV!I};E((OmAj|qIWRIw6PN1%8Dx`w%E39YIV(LDmvz~c z_^82+i60!)ob3t3cLs>cgGBLfoo7$<9XyPiU;_iwb%#)Slp*@3N!;`$&_48oFV}L7s@2$ zyl^W;Ml?=cz0Q?1*z+q*Q;aZZ)_ahLF6g7pD4CF<0xGZqDyRZ0sDfH04Okm2da#+t zh=$IBV{SHmSM)=s9`DkA5go5}` zn{_MCakYUacmnIyUb@*{9Vl0J-5ThE*LbzZ{-am(#Sj>{Pje2q0`%7uf#1t%ffHx} z6?s4cttN)d--G_eK#APnZqm3Gyd9ELITl<=CP|(aJRX(v65=Vaj=fk222llDNeZ69 z=b11QO;Lcd9t$uPcd<#sJ(go3fT1H56kc1GP+A`P3MHiq!9B{GWC;jx0Hw7GnD}5E z3kx5rv#_`^ChcJ#uF@)floI~IEG1J4P*bqgQn%x=nv$UZSwkvL%Od*~C}RKuNJMj) z$}pyhJ(K_k*dj%7AqE(j1UP9syF@qJ;{#aZz`eq%Xv#ar;juUivVz<{u4_ybWJEUP zC<4vZ%c3ZXmO?vZF3QYL1=S-!Y{l@kDWHNsf{ZK3f<Z34Xz1utVsfkcYC?CdgM=_|Cc+0c>m7^FI2r3A-YvP*% z{s5##aC3eNP_(U8SFlXzU zc6)861N<%%S-|%VQ2LcXYP#oxjc*Lhz;SO_hy*7j@c?kz?}82i4;XL`NU)RsY(XZO zCjuwn0yl8xiNSoL;C(t-2#@dzi!htZO0hUv4a)EoegFhO77X|38ir}3m9iB!+@pP$ z$=e{WfEPT5m$=R#f&k(*4U4E;I!4*?l;586*}0+(@*_415T;rUf)|n!2$9!XglOWF zl89LWpa!BKHO;$?hl#mlF~aRTcEMw`JM*;YDRL>)9m?4^Kh%_nM9I8!$po0n?-Ll@OUUsYBtf+#TERh0t9VAYs`8Pf1Q(#TEW!z^6|f>2k!9~gB{&-=WmEZ%s= zrFq7yQO?4T_3Fq*^Qd+AxOFM;f-jf?YF;I^IoBr$H|v#x%vVP$kb?fprvhP@RVQ#) zEf9TYr|!}>{a%6r!r3?Nf}HA-cJ`HaX@7z7=JxR-uW6!Z7lF9^ZCDjx*bHRQa`)d8 z@Bjw=z!GQ@CQ<$a0~3}D0eo6HSN}4Zu5q}q|zv+^106ZRw92N^4Zi@y0hyef?9B9zMfx!k4AW)c4 z!NLOy7A8`xXwgE2j2SIVpg>{40tO%*kaXbDV@HoBNm4k-fB}V<9~IE7X|rYmoC6FP zP{8xR0gxaS2o;(jWI_iEA3%uU6oQ1PPNPbQKvnA0t5qW`g#O^*L4yK3cFWO9KV=rX?`o?*PAm2NMP?;BWu|0TLfZtavfx$dV^ho_yr; z5hIz6aPI7xGZ7+1iWnJfy2ubBLWB%io%(f5M(#EBCqQJy@3;$FR!_*3S` zudjZ~lql+>)Tm*@Nq;uKAQCeuC5z!jNLWGvuY(v}@ z#BI0@m)mT+#>L4c?UKa;MH3^F(88sa?N0c5MCI=*cfss1BV;B zz`_eDx?N%mEXv(ti!$1+!i^{3DCCbl{x~F&NG2KO1|4LX<&qv?xugh7j>)E&WHO1S znPsZUW(R0)(B_+Q$~h;Uq3fCFo_=!VQL_vD+HJRp`g)hUhjuFHrI<=u(n0TDnrNoD zgEeTgcXfMIw@D>LfkqfTgzEAXWrY3#M;2Ugx=OXOgwg~PM3hlO5+#sP_9_7{)J+NS zWK&N*r4KBzL={U@PeO^x=(7u5yA@Q`Vyl(3Tvf^~xX2~Iy?pCj=WS7XB2jtB7}y7t65FM8ivBw%tizcQ%M$OLR)LDaK2va1X5=p0e*-JtdikG6b6fSxBPk7a? zv&AANs6wKYX-R-p%(KV?5FkBgRsfpO>|QmI2R?0TL?YB&mGY`bJ_Ud?0pj$@u)z6R zw#YAd>#U!)qy1Cg`M!Ho+~$O9b0aKXHJFoS=f90}h{h-49>a=a6r=M)iV zLM$Q^olvzfHsOjujp|dII-e{|p$b*7f)%QO1uASo3rWR76{z519akYfQrpfNYk;1r zHmHqfjL=!dilMK1RYXbdV_G%DHYcw&MQhcN3v%?L91Rjidi(O;{x&2O=+&=cR??D+ zB-kl|2~2A`l9(*H*fV*cO^l5bmqyv9PkN4&ptF)?F}q6c1uC|&4T)@F$w0RVk6Q^~ zZSh9i*+P+)wRoZQFg**BpcD%v4ZzhxqT&$eHM4okd&u;Z*^ux>b5#|nEpM|&Tvkq? zRn7ji2%vz+0Gu$lCh1GxHwzdPPCIu2N$DrFpd}To>~C7#tqW&gqECB<_nZkZZ>GHB zt_6OI0Ra{0Kq;u0f*RDm<_-XU(+$zi^tat398GD0@B<>q<~6L57)LEe8;t4uVjx8+ z4OQCGmXb7xKpaaBgveo>-7JX?Cl7g^AXT9L?27V9T2eEfaT!wq3s``0jFGBiE8uvG zPOF-Tr=SHQqtR+ti;#oDrdAF?h^!mBGFq_=WfGm0t!rCBmJLZrM0za4{+gYF#h3>-4`=q74X??!7TX2~GSFB=NRk@nD5txVsS_M9b0IHe~ zX*}j-oxIv2lOno`iAZ_^Z1mlv+GpYWxne~Uc0H?qSb68``{%#9e2UuPT1&N!9Xm#e zwp$PU3%Cg?ZgP)%zVtn}Wz^l!&jg{r?0&atLUTgZ$VN3TOpR@P^KXxy6l5}FFmgtk zM4Gnj2Q)=lS$L2{5a)o2?2&@|jTY4_s(3y*&NxzCoa6n+c;r{O0*}2|{|(jBFinm{ z!H^XQdj!Z9@W;!!(SyVh&4E>tWk}AgO_H6}9#z>M@f?Y)NFm(~Uf~rZ{_zdqpg;*g zotiz8m{by$)LCLp(wT5h*S!f1rU?gV0H2}VoQRTSfzF!HNuA{2Ww~9SSODA|T6OiE zNW= zNS#!K@kaRd%=iV-NcGT%*;M;I9C?t8{JF>cVNu7?7}V$=Gd5%Xj9Ebz#MqAgAB^Rg z6$I&89UMu1!l<2Nf}x_8O~uKAN`z$ z$Q9ibos9U12ADu1L7ka7QjxG(3ucnknTeE8*4BZNL%xaFQI=#)F+3#D)m5V)dDY`-fy7C{6Z{7jZ~;12!4{m+gs_0uz!8L;)mNEK+9VlSp%ovENL%%s z3aE&RyhuOpjdQ9%2h@mkikUzXWC|7uD79dnWeMeE9h0yL=VT6N z0bykcVVx8q+a(w3fMiG(1r>4{b194ZoDWYdKt4^IB;wOc65ezH1@4XIJ>}#p$r8I9 zVpC{Ot+b&w>53b&VNtFjhT7U~1!YFSS_C)*N&c9muSMlK?I-*Y1u>{|NM_gs1JhP-hw7YEv*-Ot%X`<;s6ZaTNdB(K}JF$UtQYex`B{HHQ&LQ1`1gp z^_|cV$i@kwkPBr@#?TNh%8Km@47P*mGsjOZU09wmNj>%pkM zdL;zlMNmj0Q0T?C7=WVfXfNTDT85jr87agb>0C0D@^OYJZiWZxm%(IgMX{p81Xv1T zX$yS}aAXWf)y53rA`q}tOChGql*P>uQTr_sc`%L79HY}9V^ZngXZGxzf?R0^?G<>O z$Nit2=IPL0BNo)D6>xzT%&Ac&&B?`wh#d_TSOFEF#~P_)4QLgCykmyMfQE3$rCzF9 zUD?^P)o`j+Ak__*6`j(F>Oju^?U1Nyk$k6kRzPFXVAr{7nsClTqKO9RYUh+v==5r@ zvgZ&E;phljpM(#s3<~?O&##pzAfD)cMk`vRg}C%Z=NfE)29zXf>$D>5sKmuWkZYn$ zN<_c~>d?w>Wm8dJo~x~EMI3~xqwOq#s6_q#11IMi2#A5M0J(eHAH^R;*`aMk$tJ2N?mqnTCJ)*S$?23%O89 zm8_Ot41zt_NJ&`Bdg;sR)OD0hWfqMw3RTkFUz@_%p7!iD{w&ab9E=5Rof_?)mgb)( z@SHyIpvIWht{Bl^rj7os$JRCoZ(>NMj<7sZnF*_aaGJ0Nj!4_C2$%H;j+9_t)h*qc znceQ0;;0?0rb!Dzj&=rapQ#D1qFqI<=dYd;u(DkS>sN?cE_Jb>zGkGmABNm!od&93cI1OiAzSGc&BCdyZRA=Fz& z?8GiclIGWbX)Gx_=|nl72ua_>TxkpW25#Vnyp=4#eIH5nOvoJEbdXHR=(3qk5z;`x zX6o3W?kvbfqyA?e?Z+uFG#ahY3hkcCX*1*L(sBW!T7eeS>1k$BQaKHy4%r98(G%RJ zk%{ewh_I8Da0+K?&Pka%U)c#H*_MG|B8_U_)Ue%}APsv!1(<;1*eaJ$9p|trUvUZG zep2BQapD$E4%$iDA@O@|00tD{Mrwd6WxxgG+Dd3zeoEqgZtFRHakOSJ@Cn8jH*8^O zvGCqr=Vmb$uSJet3hy<*9rKEyFhIce3LIBYt7T7CaNa{i-X2fH^rRZ9p~_H0PenW) z1WW|n0m}jO+F$s@PV7WU^Jl2kQoBR|UHmJvxl`gT#9bJWIhC$ThD-1DD7Mney~NkJ zePZ!_{&FZP9}W0Z1hQ=#PIdV&IWC8OviMea44p3jD<^`3|SmDFHQSbmFbkZ>aD$*A4c(|FcMUH$(`5jkJ!IHHWOr^r znnbso95fM!PTHy6MKZKQLv%(eF`r;S25gq^Doajiu19O`czv`^uepWt@-68ovzw0V zwZix{D+lIk>|25f0ZDPpZnW%ikjIgSOb+;fagYbiO6C;lhsIUG&|K|{382TtSTd8G z&{8nb8m(#n-_s85m|wvIFD;tSrUh%kmM?9c#`zU&K^0u{dQACw^v4>lk=H%}rOuHC zn(*0{?V$JE*%rE!$yJvnog(?o44W#E*sz&3-E(*6o=whmR|!EIblAy>;U@H*csJ=} z04jAicZ>IUQ;$k0p&x>Dx!maIy0=KfcLa?WefvdAZ)VDBZj_+SX>C(1aC(|88icz!Kkj_((|QB(=_yY)qBXjrKW)y8kcZw?`LFVZYy z?|@>DR1@?76!}bjZ00s@9M(SLp57?~pLv<1c?64gXnR~1Ky%Tqxt)6aHQVXaYQYvP zt;oaq6hUE4Z04EIWHkF|>Z=Z9}pDm0CQmD#pJ^#(4+wiGIIt^cE z36PSlq6wz&Ag)UNbFYagStLfTon;|0cMB^;^9e;m&#lmorr91^r2h4ddahc`I<3e3 zKy5L$TAQ@DD%n7r*fzKk_HP@-IL0H^1{gKlDex^iMzaSHJaNKlW$8 z_HRG;cfa?4Klq2g_>VvNm%sU+Kl-P?`maCxx4-+pKm5nP{LerA*T4PWKmO;x{_j8k z_rL%DKR~<@IFMjLg9i~NRJf2~Lx&F`MwB>_VnvG=F=o`b{*hxxj~_vX6giS)Ns}j0 zrc}9-WlNVYVaAj>lV(kuH*x0Fxszv4pFe>H6*`n?QKLtZCRMtWX;Y_9p+=QDm1zmoaD7yqR-n&!0hu7CoADY15}sr&hh1b!*qJVaJv| zn|5v6w{hpzy_o`-|9ux<6(7F&tMUD_ZxCMocK`nY{D+=~^2rXK`=-K9Km<=i zL!W={IjFw?DO_+NGyL0*!KV})a6{6{$j-xp%Am)@6H%n6yX@v6h@N|3jPaiQvcpHl z8*z+L!w+-nkVnwei-*Pb7%GECddwS$#tNBiQoA2@@)1hTFm$q>h2SYrz$6E{C!a6D z%;&*>^a<0eP~4|17wugmWG{HF+86XNJ00O z#TBA5#)K9?X{}YM+Hwygk5wgcjVH(K^vO}qgKG6pp7z!&qdz zKx4(-HK7g*%%@+0u$?vFjePA@OI|BRabmwFJXN4tPenN4bqxYHyD}n1NMAA^-gu%V z6Bf5wm+wk;AZ(TGcIJhQjd0~-2|@!tiD|Y7=9rz_x#+o8q-VM_8s<`Gh-mb*2CiesU%|B!KPC%g|kEB)1@D9~zpV zpXsqPo-sYnTO_;{zstz~@R53LhW={hw;*`Nqz7TO8~2Fu&g&}Czk6DK18|1Uppod0 z14I(^yG49GFthcmo1oKq-t}SH`T38Zc}fp{BH*QG z>u?s~S#ln(kM}kqGiba=ax>)7@}GQ`%;(1&4hb;fh3Lf(a7lfn*kNS~`9`TSI0vB>X5PqeB z{-Fo=&>)|9*vLd$;@m(c^pAR=p?^oiM?4Z0v=ssPrIl%+J~DN&h9Rj!hit#supVHrzV&XSh3wB;>vnM+;n zl9#>oBpczeRPLrC|wB|LjnN4kOlbhZ2<~P9^ zPH~QtoaHpQRxJRHZJJsZDk2Q=uAF zsZN!uRki9>v6@w_Zk4ND_3Br_8dkB6m8@ko>sis7R<*8`t!;JdTj3g4xz3fYb+zkV z@tRk??v<~7_3K{&8(6^(mav62>|qg`Sj8@uv5j@?V<8(^$xfECm9^|;F`HSwYBYSahqG+?v}T`_3dwg8(iTI zm$=0>?s5K+n_T5Cm$}V#?sK6VUFlAjy4AJrb+MaW?QWO5-SzHw!5d!jj+eaUHSc-R zn_l&NFoL~hnn86Kp z@Pi>7VF^!|!WFjgg)y9A4R4sk9ro~tK^$TckC?^PAxuXF1QA&ULo)o$;J!J@1*%efIO8 z0sb9mK@XbHg*Nn|5uIp7FPhPfcJ!km9cf8Vn$nfF^rbPKX-#jM)1CJ8r$HTRQIDF` zr8f1cQJrd4ubS1ZcJ-@a9cx+7n%1?p^{sK8YhCY}*S+@juYnzGVGo=Z(VcE}ubbWNcK5sC z9dCKho8I-d_r39*Z+-8Z-~IOYzX2X_fe)PE1vmJ?5uR{`FPz~Gclg609&w3JoZ=O? z_{A}vagA@B;~n?-$3Y%)k&m3@B{%uWQJ!*@ubkyAclpa<9&?$`oaQyR`OR^j{&Su0 zoaa6F`OkqKbfFKO=tVdB(UG2Xr7xZ7O?Ud!p&oUqPo3&jxBAtwo^`Eno$Foq`q#l8 zcCnA0>}5Cm+0mYMwXdD+ZFl?I;U0In&z0kPoDCXxBTTXpLxx1p7Wje{O3U*deM)b^rbib=~170)vuoQ zt#|$FVIOac zFbu_T49Tzz&F~D-Fb&mk4cV{_-S7?JFb?H#4(YHC?eGrqFc0-`5BabU{qPR~F%SiD z5DBpm4e<~WF%cDU5gD-&9q|z%F%l(l5-G6~E%6dDF%va$6FL5|6Fu=0K`|6XaTH0h z6ix9IQ85)&aTQsy6)55 zkue#SaT%Gh8J+PNp)nezaT=+y8m;jfu`wI9aT~d@8@=%x!7&`gaU9999L@0@(J>v> zaUI#Q9o_LA;V~ZNaUSWh9_{fS@i8CuaUc1yAN}zk0Wu&3av%w^APw>$0R$iBK_1|t z49dU^5(PaR5+3AX9*&0Y^kE*PLn6?|g658lo`@pQpn}{^AMnT{`saeoZhb<6e9q2? zN&;oZ?jF!+Bs2)@%<5p>ILhTC?+1~>i$TFCg{iN>Y<8Y!VI1z>J|tm z{zU4A5+{oC>GG&0j;QH=5+WoLI!r_(8&W4HA}E!PizFfq%s`FsK_#cC9^%0a(!e5m z(&+AiEE^&XN~A3lh9AHP9_Df)gl6e#vPdoxX{u6Hl&+0XXCBOlZ|XsFn1eaw;YIM_ zG0$fnKBysRr|7a$Ag=Ns_(371qYQNN49b8a=>ann(;>E!=+LquvS*6ONG=(IhScaW zTeBhR^5^t{Dbpxicm*Cdb0N^?9)zc=Xj$&w6PEsUF1dQ8_|F7u6wtj!q%|hDtZIBluKH{Pcc)&P)rUZS)i*){;2_^g81- zN*!WClvE^AC_j?ZHCeSGRz@G3Mp7*zOnK-?=f_AL;tW<4heAR{14K%HPDdY9LGn~o zF+wH*1XG#lJSo(Lq*Eli^FLs;PJM1f3&M=_gIHTqJhP=CTomUnbd5yQX+%OV>7jY@ zL06F!=sp!RwZtSh6(gePGJTa+f^J&{A`PC!M5UD?))FuU73li2JTHblXM#Y1u3yu@ zY}ChDBZ7uDQX;05S~aD9Zm3`v!dQJ&B5-s&zhz1C^ja%IFY(hP<+Wg%Q&oi1VJAW_ z;e)5;x<49*$;e%QNW!wjjR}-#GalwaMJ|(vG;<(H$COSEzu4nF=8Z%H|;VqW50!MomcJ@k|7=^yw}1Wje*rjv1$cl7 zxPT4#fDt%>6?lOexPcw`fgw18C3u17=;05TbslW^h8a{3?jXSMfe-LNOUl3xgjk5Rbq|dAh>_Tc zr}x3;;SaP#9{wPTrT7n6L>{cT5AeW>wOEVCx4q`UhYN%b^uUJ8fQl!`jOhRmvLg?S zSj58l{|^&mg)AP-o?j1O54^nefgK#~1m z4;0yrF$^F4{-BTlz>w|b56rWP1KGZs=Z;H-lLOQ*!{iQrI80&~!|-5-?LdtWxi0D8 z4=&S8vNyiy!47b_hyDN$#snYqAd2$?52kpSrP!4*Y!7q=5A48R_@F|BnVA0|kMWBh z@IaU^Qyx+|K+Yr&>flT=3?C#Jne{-3`&fu~cvt+Ok#QJ`k=MOuI6wN}kNu#T|6>pM zAc^gH4>n95_<$c~cs;H74(6DSGr5To1`qTgoA2wL|KW@6;D!+zK#=)Nw*H53r+*JGs3WT08cjKsZ^V_28pjIuG<G}&bglPfDV*;sqsLjGfbHG08MY&Kk}iaO(=?wdcS6P9*|i- z_F$LYat|IFhvz|~IjoG!Ko9x=Tc$cY?m&_qh7WvrmrI(xW_Xu*MVJ@)XZ*v675T4Y z+NmpyA7VK~@Bt6^0d2{y%h2v(pZ4XAP;mInu)ot56rTg>(ILb|939dj#7lg{(E%J#+{DwN z#a*1mTYMeZVa92^#%FvT(qYD%VI9B$8rDG_n&HOPVI9`N8Hjuxnjy&9A;^>58JwXR zo&g%992%VA8KT_Dp+Om-AsLe48KOZMw7eOXVHt{{7?dH(p~1_cAsUQ<7~DJ8mv4SzWzMWi-8y> zeHbj=%`u%AdZ8JZp&6WE8IqjSnc)^lT^Do#7j7XJnBmA}e8z3T7I489Nc|R=As2LE z7g{0LbKMnq{S{sT7JywAW zff}U2-=!hosi7JG{urcz;0L}M6n^0q-Wsf-;jQ5s9zNhH9?T8C;0<0H_I()wzR@+F z;UE6t8NM1E-r-4J)F zyu!zU96X%D=YGRE+{4iU#8+IzOZ>z`T*X(s#DCnyD?i3t-NtQP9nvAyms}jcA<1un z#)rJfS=||QJk;3%%dOnY75&PcLErg38opf2!JN#OVa=mq%kw=Mh`|_y;rL5|6ih++ zOQHGWJkR+&7%ctxGhG;rAsU{c8?GVItsMIs{n3@--Z5SN7=B?Ge4!V5q5OZL{D*%Y}vA6 z%akQkW=t70WlW_>qvkX!wQ5kMQoD*(TD7fQt6AInwQ5wS$Fz=(=9KBNvQfKwy=E;g z*SOZ;di`4MnqF*svH9i3&97g*b>ZR#OINSr!g2fZy(TzvHf@wCXS=NJ^0sV(GkdN) zx$@@8emPhEd^)x2)vQx*qr5G)?ANa|zs5$Jwl@B5-L`e>?fbXz-{XoC?`GVb^5x8% zJAV%SdAa4}%9T4uj{0&b5~>KV3R> z`|c^jc>!gEIg6uStQ!cqIQ_eWbFmuaI&Rn?8g3dIPAv3uEb)hrRMDt9E zB$im>g+(bdR5Q&S#ndpx5K{~^(3EIYGCCR~j4;6j^NT5@loCuSr3`6glEL`MWRFY| zrOY$eaC1#H(OhX_iO?KXj4;G}`AaUn=;F&SW}fK_g%0-O;D;XGf{QM?=yVG+8QydY zN4n&Ki%;mNlS?ZHwX%spt-Rt2Lkzhh3;v@JK_pQ{7RlmLM;_HOi!3i`bm>PceF{>h z8NKwG9ub=6Z?{pyxm*7O?Htz}tR?5=Aq z>r^y|)kS5n(r%>~Uy=PKm|}WyMUAsy!KJNX;bse2VAo;;+G(1Z_F8DEWm8*booRz^ zx~<)duWPYsGh4s0xqF&#+i(-xZvqb|oN?nIcU*K1KdfDI)=g|(cHNz0PIcyB*WGmA zk%w`{=V3Q;chOo3dFX%>Gl2u{2Tp(ps=AXrkSnefx=AJmnU1LGu1~5_ER;f|k)Ed|-EQfp6^ZInrWRcU zQ%t6ogwvfkxylnymTOLoP|N7JR5F4~gO*stiY3*qR(6HgSAdVztyH&SFU_*dYIT)Y zcg01`Gt+J*zqXG-b}nR#aYZ6m;4W4Ga6pg082z0K8-a05y+o54%+L!nmvI+2_@yqv zY(p@Y!3Mxs6R&(>FkrKRAi-**{+r-vqZ=O-j&F=ZoRl#PIpg5Yb|3~r=`3er8Uqi; zu5%6=y0AJE%VEh#W*?KShdn4;&wS9aGWx{lWd%|Xf!cEp`t+xjl2zcHd`IAd%pGRjc?n6_jr z<7&@X${>wGqaFbR7^VP{k%B=AA(>*5LLyR+*k(9lFl8B1a-TG`bR#XzDjLcl#*cOrQceLzM8V$;HgQD?QY%1y(64Is{+29Ru zh7%lwrBFEDY2kNbh}0QQXQ>`rstY&9vFlXFhaIa}guH_t_(ZWd<*5%6*Tck{6-ONN zdD#;OL?3amY(H77;(@NXGjv)pLA_L`I_m^aUs{eqV-rU?STsft?eas?W6_J60ZM3W zO?qGp8z75O47C1T?P|8VQZi;lqhXXnl9808C>qJgA^pfnJ%Vi7ltGOuRq2z21f|-N zVT?tZQW%Q_#^QX@O3Fn}OtS1nFlPx&c8<|SZ472Gbpbj-x#A$E+e9Z?!3jxZA`^;Q z)I(q)yWv>`BN}1JNVEw~mROS(l;UnUcQ?+Npu`qi7oQAV3oGw-}ik>TXhkshpUCZ zn98exB(_XwP}M+|PMJ8CsE(Jt3>;H*B7oGhRw~9d9qSMf7S(}f_p;Yj zxbSV9=o{FvMMFZ8n_Mq;l8a%)Y8hU0M%kjlXX!CkC|@FqX%9&v8(nQFYBQyogcQk0 zlVZ}QD8(;;@uMHj))-w9hA~d$jeuegMK;<|Y*UHpRSx5}Wy0-kBey5bjp;+V(8YX# z@)MrC6IHut)N&cJ2~7~HP}FtBbYGzf>S9-TvvU;fyonKQPE&Z})m=t3bzW|Y1SQ-? zNrKkFUUkN|O}qSwhk5}v9j(PyO>xRIy0y`I@)LW1-ltpImlggZ)EMehD80Qm7sP-M z{-W;tUjPAft!NzvMR=J?VivQPi-vfl0vupWD@Ym(GLWV6vLHUltBv-Ox~WK|vq zS;HY9mf;M{GBYz4bJo@jp_9xqb7Gp=aVK}a7fzbXB`t z77`k2Tcq1m$x2k<_7{vRedO4LdSDXM7Q4VD*(pR52iZ~=%w2A>HBqQe6e`*N)9rmG zG=Yg%JPH=XFaGc-Qr>81Di+LtRPx37yYQYD+ZQ1ot4vkSb1LstCb6|~c``Z3=IAK= zghu-4eWGRsKJe(9?7yk0v}8gG5ay4&uONN5o|;6Ao2}MNODR zX(m@yG$3c#V2*5Ii7<%wbmx~^(MU#J;i`Z#9$2H@D2WU$0B)0Be60g zd52j-@o6_=J!Byb#*j9{Kn%ceX_TaRr0`jbw^@%@B$)IiXm}!V@kyLlNCL$aoYse^ z#CWRI3#dSPXtFrOG$y`4ImiWysyAQmq&c=`3&dnPf+7pgg?pXwd%g#Y!50e*!Ft7QSL7{S$z40f7ET7!OBM1!Ne9fjx)eaCZSvec>4P zV?Y*%feaKGD0nT^LO~-}Q#B=m5R@Chu?^(FFS2oh1eAi^;QkFP2y-hab1cL{P8WkX zXJjwR#v%=o$Zy!wJ|hBP@92LH^-zZKK2yS-+W8iN!!1)GKi5fd{pc5sAyN@XQ5Xnv z6DUCx=3xanay#{q{W5|yHXAy2g4sYqyit)YcN{3>f*LtiMc9!KvmM@1LrKL{N|iAp z^JGATgFPrjR8~|)s2&CyA1LE=MaX4MXmucJW@uJ*BZ^LCmXkSo6U)F$T!?4CwI_;G zYk7j0xb%!F#aDccauKNs5!h9W()Os! z78B+*snb_p$QNE1!ELvrAkN5ba8hnkqd8bvSVy5F2elRlB@M833`#*tBf?+c2rL+u zD_DX)&$%P9%729fVE%WV&k{cGNG%X}fMMY*y@DcM5v?7zkAfkO_(K>5WIxzaVHqcp z?kRyYwJ$r>K_Y0bHWeHLv!DIx4eiQuD%gTUg&Z?^pdSex9rG|prE}wkkbo7L59mP48p)iro{|DN+!Qxv#U0L} z%+L;|zzV8RrvuTps=y1lwMO3%4oQPc4w9oW+9t@g3#Jnbg3_o7kr2Cgd%gDxnE(rz z5DUr%slM2YzZemvX{n@XsiE=_-4tG*3Msf)eZ&|NGGR`pTAQ`tM)E~pWruE9Iex!s zS+RNyYO@xyyB7P@e)QBV$o>fxS3*$CxfNAGtFf9r^X705B^T~0xtv2a=f zU>GJpC6X7}8ZP3ZKh=_f6_#)T*;D>#aWwTW800SuIU6MeRJ|b_6WOj6*{&Apg7mtP zPDgX~T4XaggC2Qv6q6lFrl2cXbUw6_?eQMxKvwTTRxhbm^!grY)vy;UGZDO#Jejd& zCNm*>q8XgQ97{%Jv>+Lhn{#@4uofq{6eqoq3d3}Ilv5^g*OqT66lT~;G6J-67+GbQ zBcJ3AUhB2CvNk=!c)wsIkv2)2wWUUaX?mlzvYRzn^N3f16hdowi-d`&@FS!br)|m# zsh|oYJZq7o444y?{y1uDdvc0H={lw}UC9Ouw?}LVvBthfe6;9`b&OrZcZ-)BxujWM zp2Ccr3aYA!i?btruSrfO(QS!r66~-`%u{x=gq8T^s!YKY>NdN}!f%(HEApm|Si!rw z%1=|_6!|Bs{e_*?8*stGe~p2y+3H~FsA$geU)4ap5mlaw;ZhX$7rgrP;9x~Pslgfi4I#_1z0^i( z0$j`>!mxJ!db&VMu(UYC@C$~Cn2Q5}b#wF$_UsB3(CqM0apY>Sjje0XfRdCbS)6uP*R5wcSe zw|J?}XH6`zjCE~J>SZcD0bFIbs*okg_(jP_fnb>&yG4;-fEKIQ*golqPq}N;+W5)W zcozF-%Uz+I+(K~KTD@Pp1k(*PM?k+p&F^c?8Ci4J{9_#|4o2oN51PNoJuxuEL&%L)7DH7g>0|*s zq2>XT25i9fv9RvJz$@c)4Li>b%O50KAQekyX_lf~XGIL6MH$Qv1O49Z6*RKv&=f)@ zc{^*wMAd8p3}mtl-%t#!AUe9h3bhq^gcid>8^ehR!#qNGvC?;(R8O8Q4O@~nlcyw; zlz5`BS(8QzKw=7w7YsA)C7%7Y)ENzG!)a#7hn5D^xP=O*pbDp8mHE*HyWYx|)_+UjE6K z5}%8Fa9xX%tJb-L=G>NjHgP;C!4rIvn|!jm#qigFO-jm;V457elYHmGIh>H4J?`d> zw9I}^!HrR2D=Ll_26Ywoo<0f78-(maeMwER6AcD=*=7$5f+D;JO( z$i3bBarUDb`f|*%VGj9Oa`^c{xvjp^{M+wakut{{!!2{)-Jvd&bHMJPP8IAPiLV{w z9sVkGMO895#DgkRz%psDV`XJC*|6fRRwe2(Y*nHuy3hQ)4s|861kFWv@=K45XSyId zjPtf`s|us13qD&8=zt0YjtXwWO1S`c!eFy`x8Tv!(LxJZoW>M})};9t{+2xaoX{{m z${-9#TxlSlc!{TYd4p+7apn^Sq}C#7E_f`nY*4$dAkPcN`0w^45e* z=41}K>9yu|rRJvlqOznol9v>(Rp*}N;upIkm^LCMXc;^^03 z|7G`sei*?b7oFr5m&Z?^{n;4?QS;~(7Pq|@MI{!6Etk>S15|(t6oSBk%pFvpG-kg1 z+04Vi4b(i%zU{ugZrsv-+}e?I!M+_!RUO_Dk}@Qc*1<6#V=~PCeq~P9k}WBdR#xo= zYM@5wG7al8DGGJ^jH2HD?IMd493rw-LB6dLv`v@s#BdhS+tl6m8w;&c(qd1i{u^ z)p8fBR=ZlwoVm-@O;@dMX42I2RVJX4HuVIGiDxEEu#{%P=?YdXrBS8Adi8YbRHsT~ z&5}iH7A>!{o^F*D%j{XSW@XJ{yY?$sTD9QTs%5JdJG}mQ>)NGz>sGE@xBv^*)vK37 zhYArIOV-$NGRBRS9b23Xnlj9dk8S46S(>zgpsNieUG1|pWsZ+w#yn72G|;d?$0l9d zwzO)wspaNf&0212&#wLU{j6HS+_njlhF03QHR!poNxyatTXpN$xMAboy*sz<+O>Df z7M?qJ@87*|&!$b=Huvtg&4)if?St=oM60_?9FZwmB=K>rF9CmaLCaqz%# zA{@uT2_1CM9COGiXG3$!>98CPKlBj84#^?$L=-XP(8LYNIp@U}%XyI;8qXQ$9CXfc z@f>j^94DL!(Gk)|B85Z;$ORV!2b^%i0Y@Em(*BV$ohQ?Q63TC`v@*(d)=`HYFW1S7 zoo2ekYaMdHX@(hgzQoI~TyA0JFT-@PvoMcXNktV^cIlrHnPO5h>{7&nS*S5$hABoF+`hR+n%zD-#MX0E8cScTq>`nqeYbjxt+UEX>)=@a zUCS-F8U~9lTgJ?buD<@#1+c(!DeN#${u5K^)5jW%OtZxFTsSe z%yi6T$ChSl$Ez73ooR-hzrd^=FgXqDv=>%-=~ES&RAGe`TTa@gq*Q$Qr5JLSNz^c4 z9DQ^dVJKbZQbki*#?gfoJC+#!Vi2XL z!eJo_NvKD^{1Jyrq#+s^b44Ixk>V1^p~fi=L@&Bgjc7y;B1y?fCe;<0UGudBpQ?{hA>>p zEMUayRrwQzts(*pm$7j;re zxMl*bRd|pWE&j;~P23g3pw!SPV09rZGNBYr$U-h>)ygaI1r$IpPI~f_))6i! zKY2Cnq>^j*p^q%vrl0$mV?h2HP<5%ROIuo~K;I}(lYmJf2mR7Q;mDAOG(Xy}qNwR8L}3d3C7D?+U5GKDah!o%rliW4 z2rz(QjA3;2f6`N)DwayErbj4g-m66Oa^DvXh4>slzo7t>}P4MvSoxOXSGQVYLC_%rU4B)mV}P} zaco=LVLft@w!OwTtPu^~Vn^H7iP|T*;SEk6_dLesMmNSYZti5`xvqR}ePn5N}2Gii1D}iV!h@**9Q@1DZ9`QR4ttxM;dJMd@W6GOZao{PsJW;~*zF9fS^W zQ0Q|A21kGo+@#VmSaoD_usri(Pcp4ZPPQ8pKldqN-T_ZAb<)LFOEO_pqyi(SfF3Jy zu5(oQ;v%dli7#R-yf6>rQrZ(n$A*C{mo`>_n_5P(U~^K~_!J?>3I+iGSBja6Vt-Ah zRoDO5^(upAvX~i`GKK++Q~<*v9F?Ha_k@u>aipnE)kvGIC6Y@S^q_I}Ah`ZKn8KTE zA}2&43Q{of=f?{=hLZk?B)Z}Xw*CatkS@wts{-jt@AWAR1IxeCa>ONa`d@8X{lnx^ z#kyE=OoRR6#b&N*;i2ziuSSSuU>%vNe^z8CWlhy%qter?#@Cc}%=QRKTIaaTXT~lz zL3~rl;W*pb(|&esxt~bnv{u`{;jM3f>uvCW8~y9&j(@T?Zu~g6-R(Bzf9!wDdgIbW z_?Fu)34}Sj`7R6jrf(uI6}hGvk*~pVxW_>eXcCbTX&lMHul*`8b?_$42`AAxhmPw& z&&jxsTMz^TIgneD5;Psw@e*|?6L^}Z*};npiV*UnQxCLF9lMMr? zOVJo!&;?Z(26bqM2vP+T}h3AgV6kMc03{=g6FT1fhE zzj9m1hRnYRxutTzrExfryAdz(0;gaS2W+~KW16O9N+uamkq9&qJe5rVs% z9ucR^`6eS#2XYFBbMPFD<4KJ3ua8@jZ%D8w!IGkkC!}nhlY>EKu!UfQhGwt@X3!me zdXs%ZwF%1w-r+%9FbTjYs9q2TW>|+_C`48GIgmgFQ%ICl=rUlC!?$FhjtaA-n-m?> zy#?ASWAMUW+YHRGGK5eF^y#`Jo2ge3yZUJsHS99}s7sA!I3P4Ch++r^ivR{P^M$p{ zIaTloi#W4W-~^4}gjMJSEFJiIkr)5DONlsx3D*eJ)NNj72AnPkJqYhaq%dPne! zwt^_BM;aDKf-U42zijiZWm~_1{KxfEKlA`d^cc5npf3Jcn}?jp>Y6U>+9eC=2L7|R zZ@QZY2|y9_$Oti<1z8*xk&zZbCc|kQ_FDcpX~K}lxu)~NCTz+t{=z_jBd48o5^;c% zBViJZW0G)y5)&j!B~`F@%8~{XlPMjOIiaxHVFqXr9B0@fWw^mxum$Z@EWg;8IO)o% zQi+xD1hXKi4m+{^e`~Oy^cW)Pe}+@<2`S5jAx97;EN1g zV~yHKBbA9YGEx~iS|8LhE#5G#V9^;(`i(@YhHn7SqKP&FU04BKj?%a-VEK)0+s99W zNN^iBfkcn=tI(_I8iWLo=fXem_)wC~w-Pl`1RJlEtx3)iIP*F{W`bEAO{SFuocJ=h z3@J%!qOTGihm8BKjx#XRDbglU2P8FGjKj$$6-uLp(gtIvcq)@I*)TTQoi%ZW+*$@) zV1{LYFstN2U1)|66AWhP1t44$gW3f}VW=H~(@xO2M3KW@zy%fa2vk582ns2VVwCUX zsII%HmI|{~X(@Mz2X|1J{((pak`fs`T#U(l)JKif!^|Hg;~!=T1~M{+W-zkVfV)o^ zg^D;!2_i&asM}QKxoA-+Ynh1-dWk(bJmk?JT7Au|N|>%%1s3wvc!8H;ojjmO7o$K$ zT6hO}xQBa?hvGfncc=wec*V_|G`gxZg}GMg1(>mDJ+H`KxR?cDEVW@AtT6q>I3ZV! zsY}633?owv^Z83?oVDJQM$$MSZj1(FfQNXvU;NEq{ng)gprg>B2Am-zrqR#Yvc667 zhDC~`XH!^}nk@lsVC#!5@6#=B$hJ*FE^zY(@hC|3dr)t~*Z>*X3~d{FleY~eS$WH@ z9wCSCT3G_~t^ox8FOY0NW}>G1GPrYqCWb37Wr{$TbU6G9CyJ}MjuZzaEifxd;w`C? zDTxvi1cztv2BKurcXFL66_X8fovO_XsRWD+^WqzvlUp#1G5)Z?kP{EHlS}D^ROkgo z@rCCxp3QVqpL^psR!cAYgS#N~P0 zR9J^}K(TOf7oAw$9qMIzVHe!=RXqzt>Ty@LLU-o2_;g=q^<1FUWxtYIuHyC_CD(FJ5I+aNrQsY49GEFX7u*H^n&@~o`a zAfTlg2zR)Lclc+34rqX0)@7B4cPOdmfW9o-=hCW%l5!6ItfXc;*n=$y0Odo4MQDT` zGL;HHU_sd2x~&CWKlJOQQu<&Ctyq#CVX~=@4b8uj#if7yE(P((@Di^H!D(iauZN?Y z9M%zVw_u5D+z2V2?^4ZkMM}hBt%w#!nNe6km}Pg(?UIk zp#DM5+jp=BX7=X+Vhn69e7Ront=v zh-b-&R`rCC7|m5UD4F;>TWANK;~^I6)tmUcS!IP-V7zq^R!!Km-`+EzpadGSgrb0j zckpLuZQd7pq2zvtYkuBr_Ln6xJ*g;8yZUCX2xoDIJ=rTPiXqeM+@gyCBN|JLyYv)= zKpFTnBQazMJX9;5N%;8b`T}~{w@Oi zx12>lm~0WrxuzJkaiXSC63J2f>d|vB2O(MNpbgpzF%r*_5_F)FaF}W*H67BKYH;`l z47moQ_3C&669>DUl)J$#=cfv*un8l%A1n;=))+haC&9SA!WcqtIZHQH#EZDoIVD6> zh`YB0&%n-Gyw#q+9R_!h2YYyjW$5R3K!|-_RFPqfkLfzXgcV1>WU&(kQ22!UX;i|@ zp7YU^Fhd2;9Nj|HIlETEJ^2U@;-DSUpyh#yRHsBX^E)~#7ua-#PM8Tv0N!?)m)}m8 zVh%J*kOX!)YeQEqyhMGe1-_`4ef&@VBv6wclZoX>2eDyZr^hh&-&8|m?xHOU`d9F)xQ`LeJ5nkFL&9iI$ZpJZyQP6sDxlA%nn zDGB-~5r=|MK`4HOXStw_ zC^|p%IaP2mHobH03G9w~2&NN;c7TU_h=+FYLP95odlea?g5>_iaEMhQ2Ev50`jPZd zNc_Z~bSG2H|G_DtVwI-jsLlk13d*@(5M4Ld6P-H+)>bHx011)sppb|KYl*5;Z-rUk zAzj8Z)}0CA28vCv=EfsdOE~6!re@v*iqC5_RLp(fbUZ=Zt7x5ygejO>v@2@8ms$+x zu;|4uiaqe&i!gmb#oECyVwAG%6fS%eM}aJ5$kX&OcgOYQM86D#Sm@?(cf_UNc#jMt zQR;hNSI)w@quwTE36)P6Z`!Hg{iU|V-EZDGM@9fQUM{JldVeam|Gp1}AG-c6} z855u};h}e4F!c#jN-3m_GKwe;iV{jFpoG#K{wScBLJD=J1XId^!Hn0-FTrSdN`;_k zhl(oMp>m3gsj%4MDXXl~33Q!w(h77s;;17hHMU}7D?fI^$tFj3a^xmSZepY)n@EyL zCQ5FSi6&A?SxF_7#4^u2SYje&n6SJ;CYfQrGY^(pTGA#aZ(;&VEM~$|r<}3iIg2cK z%2{WecD^#_ow3Lwi=Kwgl4zo|Fgi;uw%GD0F1D~!%cHfha|@)j;Zj>|zZs{?ZN233 zOL*XcS4^tt5fk941PZ8(G0D)n46Xh}qYSS1;i@aGzX}*2fC0wy&acVnstmHxNFxoi z&Mw5PK^ZZ`5J3(Nl+iO2X{&8P8C~oCA2bJjE09A1aa+wZ>aN=^yW6T1l0+hz1ky(z zoy1K_DS3nvP&@$))Hp;PHB>j`bhA`9-W0_!Qh14j)nXGb7O}-pDV3C1a;cS;T4cRt zmRja~EY??X#RXPcX^BM+UP|@lS2*J!)>l>Fpc4+xI7gP4V~*+kvtyNAMp-(US!P*g zuXX0yX|9P@nrhA5;#z2+y|x-Nw%j7BFSvdETQ9xoQkyQp^@59Ty z(u<1LrRd8q!VI&_GQjjQ41M4U17a}l#DiZn!>BsneeVb}psao`6Cg3>v07j$g?GrH zD4%~m;f0<}qqWdt>7$xP%72iO6mNdxo89!LfWx`m&AjRY3t2tAf5-R}xvsv)-! z!mf8!qZ-#>$qeV!k&xU=BK5M@IP^sml=SOgJ=s^njAAgPSTQE%$XHCW;zgxQEMgQ3 zLTXQZ|ar;(;L&1g+)mS!5R{f2hD7?r5TmJ3{Tt!$>W&8V)k zolnT^6uU4*Dtxh=?a<8^zMv1^hVcs#6)rr!Y{xt95f68$3K;bf+~b6SxmGFbJm$IF zd7Npu4k@S<4GLW-MDd9eeUlX8G(|SYV z$K#!iptFh~X~K9o!jbYgVbCF6NfXjrsP!aqB_(w)6I+tUJK7Y{Ow>t!Wy0P&Q@V-~MQk3rj_6QvPEHr2_aHv-u_$yVyl3 zZ&RKIqN;%dYTV@}D8UW_C|SNz2Ct-gEDur;g!!2jfNrI$g-8R1&N9eCrnQh9Myp#K znTQN$sMdk7@T}&lp|&=%k+-UAh}4YvUT%!k46+qc5=?OwT04 zm%vO$9fuj@A;0mMLi!dnid2nePV-3831ArxtcMfUW>KzoPJ zfg03Co;Y5OTFeR^;d7q`HBu{DF{M{DX~qVv(vdPjy^B_YdhNJJJ1l`cFuB4Nt#Cy~ z!_EGLrSH`y}H(xylu=RP|J26iZc-o|Uqc#UK7$ zowZtJRpc|IaSVuzHHLicp;~XakY(jiTh%a0sred_d3B4eMjVMr=mipcdE<#oj7q)! z^)GMy1lT@VqOkLru+8Q%E8q~vvahn3bO7xsi=kN_KMPto!qFTj>zHS|T{61VrHvue zOJDXP+i(Dq*@&s_IwS*`oAEYiLVLF&!GRgbI8q&?u?#bA(OjlM4K$odt|Zy9j?!Q) zG|cF?E_T7Tp^nOIzq!S5gwya-l9zU=u-l7J!HO1TN8`Wn#df^YonNS87kU#$I}!(v z#eK+d!&uMb=7XLA4U2HrJdmnDGzc& zMy4{A+lNv36)Nyn4xg2?oGAFg)PH53#cu}qs5SF6Q;-s>0UMs(-i)ozzYyGa8tBaP zI66Se0#M}wG-zWK+NsIVprJ?KXbKLiSkr9aRlll?am6)<-@v^J5AxPnztz;y`sxl5 zB9wRiep@6_7p#?UL?wzuiQagIN3KEaS_4~OCh>Jlw(o0VFSaPiPBvGT9WQj9WHGm2GNxIbq1$DE1GGtoz4ey8{^=IZphIQ+4AL|b zX>0~_`HgdN(!%|lX*Aa(NzK7!jb}s>#Tf_N6q1-dg`C)t*e48Bji6YG`A*nrohS4dlt_Y(83~kZLL@v% z_K1}CXo)+>LnUAW_kam3ND1N99VYak-t8UVaao@L-b>lt{FI4G86M)98UHK_ngx)h zL>^CZjVBoThnSOND1P#mn>fM8)!Q!zzRqVY(fhg50 z(n^2uUJFG_qMa34VM|0PpE3SkTqz^EaEtF5V_T`!^GV}0USGY~S~YUt!U&sBU{SDj zQC5)O#4H=ls9(+i;ATl1&4|M}bVbX=-~HhQw>5Hr!#ZoAe zRfq#*7zQ9khGSgCWd$Sy{tN>a7YCjOYc#_$Sl}jQ3MX08B&mkMd4_0chSIEtEf5vN z-3Bl4LfDWB)tu69&_dcg9CD1Rd!$Z%jNEz% z1Af#;Fc1SYPy;a}L!MnzR5IbuDM*KmLexoEg?#?ggj7g_Y>0<=NIH2Tg&4vi99<`% zNONS}KyjVc(a2hwo!0RVTqcPm*yZu;*py6(^h62uNJ5Z>ltl5N9|B_ckcme5N!<0| zk)6+!8QGMPl%2%Mn2A~6h0iPeiJcG%C7M~8(Sj??!g26|08t80X$k^?qHo9D@iBz9hyyfCL@~bAG{V}v)XNO1#PuzV^nsr@4oo>%kz_Fp!z2v(HHP}JUmk@K z0J7gxSj;-g(YM8gQh1viwZ%T(5w_h?S^m6CY?&jqshdy?O?&%5y_FYpF;olx>*v>e4T?oH0d1fAy&AsK zq3C3YI8|jSY+=wv2q73kAsij)xJa6wLhld{U83QPnO%y>C63@F9rDhTJQUj5rAP&) zmPkq4`C*nwl$2bFmtm%u;GLhg$)bW3-?`oT*xjE5Uj4L>lgW=}A|9c1CQUI)CYB~o z36N0n!i%nEc8yYNj>^|OkTVeo{!{gte)!65a#dBi9FRRxRe%?E-Er>*`X4kg68 zPy@E4)mj-VbV38Iu+Xw7V={OPTm9aPg)}bFt6gI?if2)TA3A0cS3rz{4ibEV zYgRx-W7wy;wj&*ZOlYZ5Q?SulC$ZZc)ZJtb@JzR=vra z(&*NNW(H{(TqX6}!ciQ>O;W`A+a@g>Yc$s-eFkx9hH0=y+4w@rjgl>02if>SZ+r@E z6xDIOAd1@P+pK~Z!pL@*f_k7rkbcd3_2_-&mwNathj0#)_L+G+sWBLccnD=xI^lwB z$W?yfmQEOjoC1cS4w#buljnp2A!x0co~b<1Qz{S-UY3}S@ebK;9b3|=lf)q>*dZO- zW%T@|Bv1k-1ZMX@S)lsZ+F^o|Ny*)c38O+LocJN67M?8hiDW+F_>@$pk{PG&j{pG> zPobGm1y!knVs@D#opqk8IvNr#6`magp&i;i;3lw??r$M8HSEw0 zeG9jcTDRbyvc%P|M1$1KmAOD`@;Tr0DIc@>*1UwnRj?X0nuH?RS~!%aPlPKLf#XtC zn;2b|w4ozqvEOT91vt*kf6gO6eoS8ABfFaK%kU>0-6LL{(S1rx#JHP;exy41*1H*z z!aAU3u*Si0;3obp!*JLFDxpTEWJ)eTtiK^}b1{Qzc%Ww(-2ZNkEwGJl--U>@y|mzt&mj--MN))OwBlisK>-K@ti6jKkTQ%)AcHAq7+;KzZ0hfWrQG9;zX zb%^1VQ#x6#I8g{F5JJ{UVbpy>gAAQEjlzO}DJi^7))GP?l%-k5PMU&kk#OCa8q|sr z4_nG97>8|~c0weuttUuAA|%4wzHK5S6eY09 zAF2;w5^`o@DoXi@n+W2Vl$4l_nVBsLP3?yNTuK0WB2gg_EtIO|jZ)^`#^&DH0|5x* z;Mum^%KqqjEoTwGi(WV-G#2sVT!m?guazn%}5~@|BhF zYRfus=Q2MZ!(7EQBBT;Q?-F%U7eP#V8bz`t#lvVX`(X@IRF=d*MPKLYrXX z#Zsg*KJsT9F@^f-MaF3JAW6oAHd4{p?*Qsn{_1aKRMNpw5<36~FAT6P{9AK*B5P1w zE&xMoCpQZ^OO9}P79h{KQJ7B`x{^1-uW+4wYAun#0Y1u|4;+tG*oj`KnVMo%v*#0GSYPPNh^b?7MZmV&}oc2k2$^;C-!S5|SEUiH!K6BmE=ijDPGw<#xl zLd<3z@p$=+xiK3jf*r1L+d_$tSpp?Y!Xre&kpN~TOahmbk6jOH_fT1y#NFDl$)XM} z+({JoJoYOXE}z8D_plF{KzgRaRG~O-nMHV{q?x8z%4&+@YJRc~hI0N6iuS6s>MRck zX~&APAlfS9X0GPqe9(GQwd!rM5OGJR@Zp|tzZF>Z?(Ip{RQ+~!mRj;TXRXMAR>n6Vtb^in1RJ==8W(ag!-EI>b6uo@vqRdj5=F{JMPK-4Fat$09548e zhi4pau+4Rh62$gG*NhiR!;^B@Q<{PtEVW2^%?&E(;K&8Td+pLN7y~>QQ#)|jFW^VA zrVh~3M^uI-SY}htZ`0F$!VyF5Q!ibHq|+!&aTRNA6`Q4(hyMA~o8{Aw^%qk;@iYk< zvo#yfn47=(n?HgeuW=l=Z6rWKko7qwWWs&814!j@L}7y3ubq^D6r(=s+YO>53JRY@ zqDsjR{4iolDTvS%_LaR87{iDm*doJpD_=7Msal}9Sd^5qDQGtsgv!g{Q0)lf5# z>ae~3%A)X*^tFLx&IbT_lJ*FJTRQLlaDWJ%Vy zdvp9Y7QezLdJ7U?ko(G*`@4GEyQ(jJTd%uI|F`d!ya|nP2`oP6Gj;}-0}@v=0JLdz z>}WjKaG1ZpQ7mwH;>1-X!ez~8_|0o9957t4?_}J@{*f2sXM6wyM=73chyw&FR;fOD zI&~@)s#B^?p+c1kqAFFtDEdC7l zPKgp><>V>Srbv-EAwrahQ`|&v$&y9%h>|2pk@iBORB7$rzneBydS}nwBuSYVH*So{ zoxOLCDQCiD2{YzOmN0c@3=7t)SD`V%iWLjA>C~q|qh3AQwdvEbX33IOn-;BExoPS0 zt?O3sT(xTD%B73fZ(PWCHRrX97q4E^sZ-bfNO2f3?c22%<1UO?F=OM6C3AN#S$g&B z*^@68@16JT+J|`$PmFx|@#&RC^Z(yJXp~70z-XX>=9vT)T#&(NoN*?a{*>u2!U>mo z#+hcCiRKvu6|9EA5Z8I;n{~c95yf!4LGeU&Sp4Rha8mTfn{Z^5u|^xk*>T5ieC&qD z9mg3m$Rc&*@knuqL{iCcltc#|aG;EG%5b102TO9!IcJ=6vLt87A;~ER%rLQ3vdb{X zL6b{0)f7@38^H-j9d**Vv(7y8Tu0A!{QT2I6#rD`Pj(3Plbt~|yoDWRg1aS`TX2E& z(Oew8rI+P^V}_YVnOSF2SdmDTT~tBE)#;jJ#TQH`?IjmqdeH@< zh9o+upkGsANTGvJk?1;yesKsDjd}^@B8(23=e&1-VQH9^QmQE!n^dx?CYfZaNfc6k z@+p);4hcmnqmbI^s8Y%u<&;lA>4}g-rW(YMLkPj@kb<^Sw=1o*vPu%N*t&|7L*QD= ztwc5%tFB1unkx~#H0G-kO7fz_uSz!2gt2!-n#AKuGO2`ROfoU~9hV=YEVIlu>rCcM zM$;MR)>JcXG|@&&4K&zdvkmFnZkuJd+nt6wq~;X@(tkH00D#T&$*4I7uPZzZa0QRHy9M3;~5I zR1adtba3&Dh(u&ntUyICRKW{YNGDUdn2vFJ;R}ZhYaplaL?{lD3S%|ISF553vm649 zUu*;zF~mqPj1iA}{)j||DhUSKz*UNI(WE9hQ3@%7fs;{y;wL?+%21>-h<6o5C+4!( zy+V<%LO{h3h3MB-JW&v?ROJv}u?ko`!3m3DEG}!I7+f$Gv5Q?yV;+-ZBs``ujj^l} z?wH3s-qDV~Fs2>v*rPidQ!~w2A`^zR#AYy)v(k{JGp%urEPVC~Y@PL2R9)P+&oFe! zP(#ZMHFP)9okMpG-QCDdHwZ&_Hz*(iB1(5iw@QP6N{QgDb3Z)q``f$Tv%cpqID4J7 z*WTCX`mEh+i@i)yS#n?2*g3@Ym{?5kt9K@{cJ&gknN~x<_v4Y^fm6(@7%{eFH?rJq#Q{Ewxeb!l_rnTSx&Q}Zx z+gzoGWFA&Igc<%OzpehoCZO{~OZjX`vbTYqZ|G~qr+16e>k6`09X@)eN>3|G_2F`> zQ?!v=^?%P!8g-kx48}pazI-Z8S|FF)%y8Sp`LJ{Y!5W&{TNP#O>*kntlvMK;4tKBu zC#fz66*w$eQQkhwo)NpHK2)6x)yU&)JPKzN#1YWeH!vqjrY+h zA%G%;WnyvEBN8~HmP{iPsyX6lruBDmR1BD}D3rcVQ4tB|DYM9V$n5i`{UPb) z?L?MKq2uCFYrI*Z%5bclM=xvwCX+Eo*~X~5)2yF`^;edf=aC?-S!;TB=;*;Tb(5tk z94*KicgSLVKxj@QPF?Lcw!oL7Va7a1Ri;hn6Ra?OOvB+mFqN?ED5YuLj`sNIN6Ove zP|^2ksW6iMiOl|@&94v850_qe+uwzsqE;HD4`VEariEeuT{ieGq-TkUHb{85BkI21 z)C-Ap5j%xa(BW(E#F2K9Vh_10(8m`7=)ud-##R4r;YKQdg;@B2Kd!Wpirt5J z;e!>J>+F4fcNWhcsiJOJD)cCw?QU0*#36U_qEvJhOhXb(JN(o6_+gGZO+Ymx$JMGI z(Fq#?RcY2_RRyVE*~qi9MqU4QZmoXrCU2=zmJa`#8EjNfUf75|ZBQ@trL#4=Z4P@X zlzOTrTE`#aqpvtSBHcmu>a^zeE}(Cq7XKTVTX(oF@_zhZ137@ zZD)A*QXoY&keMd$^yCMz-~_zuBh0XKbaXfva;l6Xp+`dt$?X2sGwn&4C|cGL<+S1C4Z z#R)k!Fs>-rkXFGPmQP$iYYeO0I*Z>dIX%C%^6_8y|5i?^Vs45m!uO~pbK^Gd(n(ygB`0kvE&U#`#CA;1B)?eoxjJILlSC#-$2BlhOby`(o6u{}PvjJi^?G+K#qrqjFO9@5|A`5a;GESng(seeU~05Vd4g@#f65( zPzOJ@hkNgJvr7d!LB&usQ86@J@ck|anJy(7#QeU=Wnr%ajm;&_4-aW{$}@JyBJZq2 zT%KaOB%|U=Ee(IG*bgs;mr6ArH&qy-(eff}JPETC>zb z@y7Fc#+_Z%r|s1i>@^mKLOf^B&@K$!-?h3kwWB<>qj@ey=ZSLSFXnaiNv^Z$il?5St{dvdQ`G+9d4V!?5xD}1$CiAemaW;*{hOnH(DMQCAy;L zDj7%Nxh$RrkL4Llv;na>#WCIYjU!>j>?{Rhua+Ug|37p%J9`h!D<0XsX z-HGL!?sycOqRwKsfH-ovJvljSn-#?LE0$m8_^(-7&+QAr(G1~mj~<#D2mf>D`;Xan zd;b9oF35wYf-u+JjJIM_VukGDh2wCJ1yD+yM0LGn?J;CP3rv*>wpM}5W_e;1FQIn6 zxL;Kdj0C(*e4q7=;GD#Z1!^TSr3{?8nKt!hDG}cYL+? z$+bQ&Xdf=Zwg%dVeP$i@Im610YIE6SRK>C^qe*Z(kZl`$jL# zLO*L8h`Hwas^l>pQS)UBf4q3kB@C^eUNEw!LVSdoRZ+?4Uo*Q(F|&Cla#2~te6+ga zIKyd?t%Bu`nep&bq4W}?_snmnm!cGY@x;25H;;LHEvW+Jk$vw>? zt;{?m&dDTQ7OClOh!~9--wEV(ndQxC(C+(A^8O{?Rqk0WMmM;A;lkNPSNEi>k}Qaj zDze*%@ib|A6i@4|r`8uWeCayFQu`=!QHqbPQNSyA=A&F^4J!JM-1`XwRuyvTF@x|u zsL|d#Gf;xmkcjDxh-np-(GXP3$5h1CG|)**$946h?p1p;%wQ-^c2b-lo+ySzWfV)Z zWlxK0Y@K`zN$9_tc2D*lPEJ3S4BMyiQ+((Zmd0!00M2bX4aFn&Ibu=tK052ejkcqR zjkVWyh;s;eJwx7{J@F73*$`Q-SC=X`gxUTz++LVGk^grNKepKR?T!4WAAdUMoCpmZ zMXE5nKb#lZn0aGRkFkGJa+g1^vUk3HLMg$tz;KKyShSFcMQ%mOWr)f@4yxHC9yx*~ z?jtD?1Xb;%(p-u)iiwQ`Ed(AxQ)8qqd1Ov;i^d&jgF7{z=RTXq-B)avLZE2BD;;d9 zdiSRcaAj%~d>wM1_oxc|(cCpZdUte|G^5V-oD_#pL3@7ZYoHOf_8W9LN-Y@KI%Uxs z^!-lzN<%$yqGBAa^T~*}&2hZ@u=2R;98P#aZaPVBTAfZD8r{HuQaklIe`+u$^0(u( zZgb7j-t*B5Pf(ri1&7c{gFX$v(E^X*ly+XEQXJto33ioekw#%Xs*ilxv{4Fi@-K{^ zz)hrwC`@Ch;(tN0bc{pl;)2CsHiF#Ic^GQ7kJk)}NfL_Y)d@7-uOw$QE!1LGas@f# z8xfIMuTaCZZQ0T-u5=V>WXUh?nTV_js!}dR)9{@)c(fQ^VL`Tr`NpwiS?aBqJNRx5 zH`QA*TX~t*vHoI>ME{K4iB2OQopa)I$i|=)$4EZm8fAv33Cn<8L`Iw*1I|J*uJ9&D zHUc0+%jsvETkwH|f1EqAtIx4V(sxazMoAP;(bOo%#VJ<`QSHt-?}-*;&rqO6E$zn} zQALE(&ueDgk+@#Y|C}ZWZ?JFP7uF1<;97d@KlPZI7 zCQecguXA?ZSav)_D%sn`Vs-9{uXnnpkvhx1gKxYX=36q~#1zP`F8-^m)x`vpGbGw# zj^V#BkNMUS{pE$=?i1LL7dy<9!UDZJ3vF=^K5;2puoTsJA^{P0AyF$(!p}J|KD4;A z0*l^CZgYz}GEmewhZW;xwwDNP^4yCJ%{R$5RXt&myK^`&x=gWdhf6g=ZOEiehCkeL zA9k(ztgu{tAkch%sR?_lnL>xJBp!9^nEok+|HoQ-hY(W1GmGdkJ2D%wdq0*n8ahj+ z*-ZLkKx$$%o`i9|>Q86{x-|o@i2uK(CQIUMf+O9_+UF~KhL~D>ygDt2lc10HkNm1A z=A-Y&E=Hn3yM(%)-#u0JopQjZkfNbiB~>&`f}Z{msy=*fT?)A3RgFU~mGo(l`B;1= z8`XCe@eCXqzqbYAC^N}emefTSO`V80A?&$fceM}J(>?8(u0>^jRwOa^t&I=ARk$zn zWdGLD$6?v_Twzi__-#bBaj$IJGpLf!KK$MacwEEf9nx|?Z|wH6GcOQKIv(=+$MV8M z@`lF_g57@+aZcm!7j~Zx-^LjZ_1o#qG4Y1T5b_WMUlTty!jf- zI`K?N@i}Pmp*IScg|s)?1bdu%gn9lIQq$uT{GaZdm+5qlMnjTE$17X)7Rg$N=q|c5 z{k8?F=asA5+g0UTM**sUO`7uhh4Cjv0jnTJ>LO$+lD1by33E8Bb5zH`KS#qRAv1P` zaFWDeymx(Zpq?@H;>l8fG7aN{V+`0}@=vJttMjZMm+=cxQztWa>1NjCm)IyOLR6mC zc9(5}IrAK})VPHep9KVO&2|0=$_xv?F1SN>YZ?wh_mj*AEe8CP+;ME=t&2a(|HQ4)+Ndli)hz}P9ME%Ek`W%UPfOvfUT7a-|EeUDyGMfw z|DCd|RBFJ0{-`kyVVx;Ozp~vi`u_d<21k>gW9sLS_k<27L{uV!zNzQ1@thC&g(v*C<@q|2zYf{D?u35%Hx@` zKns-2#f%uS>Kniz(M*d_n>%We;dj1lkAG?R9iGN=cjjt$D*X2p5};5AQA#JO{1S&G zj~A4GEMUJsq)S!VXucCOKZRBu!Shw16+iE0H6`O-L_B}N@jI2nn||%nn1vk3hE#z* zFCywqvTdg;_m22)-7o8I&)44Uck-R1&~2Um1J6PRY`$RGfkosvhirctR_J+P1ZU~x zh4W)R{@5~a5%yI5M5mNF`K|xicpO!i!$(Fy<-m~^3}QsXKUr5BiVfx{&3!M+y`50@ z31;P2he~8qu)#4QG#<`P>h`|w=LfrK!7_=Ukt1B@bOKhBRy#q|Nb*mM`}6hoBmxLE zJ^O-LXBv&L`)F@#O{eo*X-qusT#-gLhha7LX1cj>aF5joN43}WeL?5m$D=8RWgjbK zhZ4YQU8l$jrAIdOu^nkSP<62iEKX(JTV?txm54)kr`ON=Z7>yw=#D{?>vFU83^niD zp2O*(=l=$ITlZRjjQJ#$duluoT@-6*nv2-;5ik2})u-#GS1z+DxlMp6V%M{T6}`>f zhnHw@8*FDTUA5v`l#r-UfR5h_;z+g6!^;Ot(w>YD7mPK-Pvf2sRZka@y~aKu zGiB|L*VEkX7gHP+&&RJdc{(XA8o86%Q%`xiW``U3vd+*mygj?I^nBgBiS)ehE|xU8 z`{So)`1;$gOSzVs(1c!PAM$4e25zs(6z~X?X4`N`ay8Qy^s(*j8*43GP-5<(jl| zjTH6AOij$MM5%2L;tfqK4a&fmg9h0*s}i^@+6BWtVL?!{h`lr_yZD6V6}tr5?woOD zQQQ@&gJy>!shn@Dw7M5|-I>nCdnOdUtr_F#ZUyd`z6D;QxiupGtUENJ>pS(nh1yQ) z5#sp|Jd|brBUCP>9A!LEQSO#jRC80;LuVTQKqYFLbL*Lom0v?+GgoM1@TYQ4lI(R+ zu0eppR^W2cnFk2m-~>-6#NeewQN|ENh=o-e`soOC~<2-P*&XSsKo4%n$-~cNCFd$~jxsUW)EQ9$(OI3qngH z$>{Ug$nYNzYx3pP4|hj-|3K1twI$(_eL@BCu!|I38Jf|1tkLQVUxCwTsJ)O$rw^qw z%_xx2_`N(;)1x3j z@iVTt@N1nlWL;{bXq$wC#;FQMWRo+n*3AX{P{5tuB;xnuyG@7N{u=ktSiGm7O zpL1&OUpUQOkzS;-0%1D{-zT0PQ@R^i#EhgNr7XXvM=%}2CKUMmi_b9G4bfLu)!m)!EW1M%CKx=}aEqKRGmu@wNRd4Ea*-v!i!Ge) zM|n|}O zQ~e2}-p-d1knCiv*Myk&o$98sY=U-fDcn-G1_c54dG@~9D7%JUK7I_2&F&@FcqI9F zfI_{4%K^C3=L=rk|gx#voz- z4~K<@+p(DR!I)y?Q0if0taK@Gw46#I+Q`=6Ug~(rXBImsy%^FFM;}}$Axm|9&uIy5sre{}{yf+v)5_j-$Kl?@86$Zy>B>*{lNku^P8s*fJd1tj8*`O~#w-^Yr)B&twQAH; z4^>gQobp@ukDyiNfHh7KpAx(auBwu*&_V(iU?FCh)JuUFwGphEOZ?X9y| zSnwMBIkzTvZr6Ph%wxkaEB?VRcU(fHBMI`;;g5`x|CMrrFK!V*7%Cmzt_0&&GA?FmP!u5V_`upc3uYr5V&zFf$zg;%SLCCE*C(|kiN#MR<&4p;y7>PR+ z!k6LNDhZx63n7VBE{Z5kvg(2@y~S6pe2qL1>#-xIO;ITuxsQucmfk80(0n>?om`Y# zr|wD+ay`n(cIhVb^$~yfky=hQO=p)FnmYDR^;2~F!*SrGSN)k{r4l9h;b{SXjUwq* z9nyh_HSLk5t{l^lqdNNgd|I+2Z?3WQ8ND@YEwfzPq|Q_P*4l2`Z^Q2DIR9jeh&=T$ z8M6~EEC7*z7?Dg^hgTVmjBOT#r3rJlY7oEs-SMh;j5F}rW5Gf7T2*V_VutQ*-^xCQ zpE1+nRn~xqWuV!5w~T&jkmO&}!_M}X%EU=ExD$<4v81n#9Xrk|FHqAsLY0vRw6bov zQ&yd%KJ6XC!!Ec}x!FQGZixmpRW)vQ`ySb|+9JYnlw1~X-fUfVzi6hZW-XRS13Wr5mv3A3gED4$r?^IO*MqxM{h(ir7^mTWRM zUmW}@S_ zxFDT1!k2?`RwrJ6D7acHJ=<0-_j*KoK->g=!4|597S6=>`SRXS-i3wW-dM800ujss z(IC=j@RCgBjdOSiM0+)4wbPuXmYk)Q_p@SXnP2E`b?8emC6QbuJ14;eXA{d@W#=ka zLw&)FV5*$Nv?vuSHwbAsTX>zgTSS7X`<_7LPXRn7s1FPp;m2QdNAj7Bv?ejb(uigi z5y2`6A9uQpOiRzDt7z<}l4iWyxl3ePjS-O(7WUN_-&9JAy z^uw938Jp=I^0XEpJV=zNUw9fCCs7gYQ+4U{A&~hUwnT+5{?iScL2PC=by(GFNjORp zP2tCO4V$c$s(TI3I3R$o>(KOQm%WBF4BLrg=_&|GTNL4UQV?{430%1DEaDx{`yv88Wm}Z(|u5GR(0Rz;Upg=+&tI z+Rm{XNu;W3U?48{CqUHLfh)&I?*1Ujj6z+?P-J-Dup5ImoNhOo5-7%6gb>D%y;Ct# z{3%BYBUV#+tn!k7AyLe5rLe4+3ine)SMk18b4mF{{(hV^Q?fKnj8BL%?Ft@d&Kj2d zGt^v=Ml4>rwt(8PidxF3Y%OOo7;E~3pPC=cHgh;Az|$1jWWRm4f3WO z5ws4r!vzrpV7|=1kjspv+baOFHH+I7$1^OTB7dHcQyH5}vL;N=+IUUW%*Yt514#N%bo>qsk=X z<0bJDXM`j~)#jFDA4&QJDRj1BCI!Pp20ZHZ{V5`xUHBJ6)=fG4vN$hBWP8~xd_+7Y zlsFS88A}|wXx+t{$!ZE7Pa(5KJ`6faDv1v1TV;(h>KS^?C}_AiWHs)4;Ukzx2t>ug z2`lB%hl@Z4-N&Ua6OG{d<*gh7qp&_ zK?8UU#Wfy)&6cBL#-DYKjFP}!(u|5|w4*4Hus{Qj%2z+7m! z4t56F4VC?>nY}Xk$E=9t4zrvq;{9d{c74?xee&ICas*iE3?Ns}C!MdPJ-aktSeI2B zAsvkt?iEmb1)+F5NP36he0Csw$6;B(n%s!RP>vF_iX+r?$YO5d(jFl|oQZrI>X?Bs z&OjLUOrkGMMQIqcVSlXZeukA6)7bNd)p%E-q!^A zS*$$)_D)mwPsi)S2=%s5-QectSBm)9~B1D1-TbZPSsd~-#uqmk6o zqe?Scvx_BVbtkh^Y1H930yePnk2D$U9s>WuU*0`Lur5-36mXA^$vj8C{9-wOlAhV~ zhj_huX5;~r*>IIPY)&lbCsH}&Q4Oa{_a0f4E>blIt1596UCdtCtRpJw z;%X)ry$R{0k6>uoCD>kLAfxkM=_VYa(tffpLiH{C5W-Z~H7uM;$VU*PN*MD?%;rLc zS+*}nA+=WOD*+Z>j(|CgLMXTNb=OlY9gPPGgTB#fFiR;gmMtK~FEnNp2CF`(lT@^C zS(dU&(S4ocuiZ&djLbLc)b*V5*P{uTu0gTn6UYwliQlY=B6n*MQw>o< z`Ysy|GHVX;+le$s2&KD8<}uF9{>jin1X^1(*GjaaTFx=)t@&|NFF6lx7tiZv`L`Xy z1sIRMJcRtquwX*v5N}g?j5zemb&%_Fo zH`k-y>$9tDyt5-hqYPT@Hj*R$f(VamT9<=UXBos!SBypUnHqqPC~bzs~M#FK%rw@lXx$sU#dAg>>PPm`%YPok{V&JOb+v(VbOG$(~2eB5ktKi=G8~ z|6B7OKg*f~N3|Qen@^VGsweBRRp?QMjn9@3Iztny1lfQU!1vFv=+s>sMw3wHdzFz5 zO{TvyM`EH+Bc{d6@?*Wi_zooHsJE{-?M29KY=K3s*~g57n<%-`%`%KGPdC zWVa?q2B44JXbFsI^k(A<*zVSpe-TC#9&f(pAPeFMdse7Dv7RU`dwMhZVu!F6P4uRH zvOe~40c)gqoy_CP6L*}NJy|m_C+l(?KV2K zF}d^~XT|svk68g#&bZQ{KY}H){cm)(-!PtSNX{<4+n$`HUiJ)M!_b?RJ3|{eNNb&G z-r10!hJKitJ71_gKl&Zfk16pOC1&k7A43Yw+kN_>Mf}vBZmyDeR6y|yN<`#MzkRgy)#uueXCtpyzd-`DkL%rJz~WRah7^Zt>k}^ToI|nsYfZhINfb+(XsjE9C5t$szq} zqp77eZA)Gal@c*7_U?9@_tWv5UKXaW&bES9r&m9lwEpRIXY*KVHE9cGHj^vr(70!lwu==aKMEZEj3-};?!@Td3x*g|dkL%z*nQYLPT6sb4o-kfOkznkr zGXoJnD~A%%6m8N7i6FxXJ!BxPe$=s&^NQ9LX>~$Nj%kTWRHm&;VJ~(mRqz{gs8-OY zWvKE?oN%qxKc?|5UnCKCO?7iFa`q2cD*BY_$KLIf_%KF`it_sgJ+CiqE3}W6{022b zN{&H=m2PkfmyjUbJn=bY6)F)uNt`^p9pd_VW8DYr1wEOocnZBs85~OaE14Tg69Wad zJX>uLE{&l!3};SH?5`uGz8Fq|p^*$*0;RSfwzyL>;(p*JQWli6kkuBF8 zhdg23Cg|@Q(`3c4NoI$j_r@kDJOUMXa(RN7MKYmzV^yxaA^}T+*nT%lqCnqib&k~U z)2$2%&3I0wb+%jzT`7h5g)FHU@%nmrOfB0=AsHz3b@@(E4~I_dbc%3DOe`0L4z=?} zLz&2?<8CsvJIy}%FR$mT`CG15ev?pGri6{^aUFCrP*NLelTY7vw5G$2J0MFwKEMNgR4Fq3* zgHC<}2lv3v9kB5eSic3!qp2sF$CwR1rA3{Wuzludvt z$3WGCpsM#kc|TC{7ASoKDr?88YXEBMfXZ5+q6(<00IExY%3`3R5LBBFYRUyQW`pXo zKy{g*x(rZlI#8Pm)TRK{$)KtvP;~;RG7el31C;**ltlrhkw8f}P#g#pc>onIK(igt zXAXXc!tV$pYECC<&W1EUV&>Vo9zIuo5D%;m(79Ay~FAGgx7W{w5x+xD; zm+M`D_A1Qq%T4voNN^1GH+6B4*Hq&d6JzJ$V`M>4Gq6Hv;1DK30#P3Kn((@0l;wpa2f)fhX9vhz-xCr>q13t4LuUTUMS;3?wmzK?hnNM{q+r1k*6T4rQ&X1Qae=ObJeYyK} z@$hi}=g(iv|NG!$fE0WlA!X)lxC${f19`mt2#hpNJslq#Upa+}Uboe35l@X-Rxy^C z6Md+TmJO`5q7_QgMDv?ZUx04dGIIs>mxwnH5=j`veI=^=;!a5_#nHIN&4G!_v?Ar2 z&!^$zD=k9K{aLVsg!NZ;@B2dcsy#QU_)HqDXM)=ZsocN34Am;|PJPGq{p{0>cme@M z2&jQsun^mRBvGkSezsR|ACg6@#010YOeTYCh64Jramh1`vhjc*-RSWGqd~}SyFK`P zt=(ZJac=L8CkdVN`pa)pcitPlaYXA`RlNxZ)O-xDkRZt$0tj5aP_{}cfnb)+%nlPd z9CShX5@Tq`^jRU4@R+ug|4Zd_FzzL7{|o+sAuOExoAWONa-e_y60x=qMxU1@F$QmY zO_av&_%&4GoU;uMKL2m;qyh`qF?25)n_9vKXV=)25t|jQJ_JTcT}Fd18SQ{5ywT9; zXsl*aR3Mo;nKd?9Wg$F`7uC22C{w!~W~)Ta?0l%Es_IZ@nqh^57}yrMS*DT(6d@JDc4W=oC;Z>m_twUcHx9H z@($TpA+>AgS|fEE4JK6=9HS%=*|qyhqURT$XJqpH%*ez#!RgG@xi0U_-0RIWwG}34 z&Z)qL`_`$YE$L|5jGzxKpy)6_cX#eMtn18!&+K{`gGZNcvh{j0csHi2MaN^?bK`S2 z$a~wH-m0gqgWcPwhs1@?kJhe|!GGHrulk)t{>E2~?B3|~Z*BMT;3x4t2Vm)I_3BL7UmN8h3X9UJG~7}Aic~V}Pa-cQK1U8l@>2-N zCz^0Hy~)<&({Nn3^WnVPFoQdG7hwHeh*!bND?%2!)pKGi`}b`sm-ym7+UZoE`Z=Cx zN*+-n^s>>8N~AHr-5U4Pg_+!HB`?}X_N6Zc!boMznBE?y9SgV_NV{xj0_6N z+0M?)?M1<+4b^?k&CYMnxLSkW*O}V*D-tj2SNCZz5^g!hSp%O?!$-(zTU1YRZEYN7;Y=vUMf=t+_OjCdGguGQ-xqD z6KG8Gx%ptq?>8O);1EB>3xSm%JN8;>M%i5j>!uoPpCI&? z)mh6~d2E7c(Nyb8dun02#p9Z4GA8DD44fE+udiH>&F{B>I$SCV3kO&1vtUfCyKjbr3V)lb_Q(xW+2 zpK{6!KzGHkvISA9i%xUYzRT4w+|O;aYtAjV_|#})+PpFMou{eulhqEqVCO3zKPOUw zATR_9&*W5T`fN6OSLov(dH3EVo+t7Aq6Z};J^o+@pCbOK zFR41-y_+R>&u^@5457HJz61Y05dXt+vFXQ}#S)x4DRqb0Hw6Vy3q(T%?7ls?Ja23q zBrslZ;_=v2fQE~(lTx}MFCfoi#uX3Mcd?d>8gSIrm05%aRYYov$a%-{21?k?TD=|-QC);KB#7r^c zfpQ9y1$v}je$9-uGE~`$?~%koxA44O*1$f(R^j`e1xul1rD`x?R43KX*rBL~8*8W? zGy8|M4e23*DCsw%1C^U7&yZ@lhQ&f$qIRGLSF&c>c6qM0b4_kNQR>c0Cu7&CRvxDW zY0J-NufqjFc(V7cqPY(;a~_UF`efGAhMMgj*ypkWe2@vO2B#{vTSk6__p)Kw$v8d~B()*IC92w8$E|0a7rqJTGV1LB>1M8S* z^s8)}3qVa1>3k-TG(Dll%~(ALu#XTvVfL{2)0Es2&&F9)*r-b7pqP868b3(V?11W! z{~ns12vq5yinqy{xh6kU)#}*)1UqrU-3VtBNLg ze-lk0KWM{2_#(LHoGJS4$ustZ7emAE0Ib3;dm^t_*lwY3k~Gp2Nz*oGQGc1pUY^Lq zQS1I2V~mx5pQupy%13i;oYS+n4GT6yz~SmK6{{2p@JP-i63yk>DOWe`w0$xdnZUQq z^;qW5#W}c_%av>YY9e&6HWreNpf$Xi_V8r-1hNV7lqtA3T`UvH%S*|;T3w;H6dGtN ziSj>9eo=kgr0%{sZ@A8IbrCH&7)ZkUT+oBQ8tg5J`$A(zoMdhTx28Rbhvu+i0sFiZbJ{#|IKYTGsToJF(JlkS?Y@^0kT+b_R} ziEb^|*Ri~J(;fNIdps>7^%3(Sus&^hI-9TYg%`h3jcfGxV?L@T#AoxkU$S7V!En>W zuDmxPPFP3;sYmfH&78&B^(Pugg$d&~t4b_r?;!S{nc?|m3akUZ{#AJ58~U>aJ5i6z z3|U6+keR?M;ZMO&VrclE#$>7Bf8%_w_DG3uZ;$?7`;|I#$`(&K`o+icihkfxa@FWI z5!9kS@-z98DJdQg_AvD17Bfnb#!ZT!?x8{2yrZ7J%xa*!OHsG;8zI|dt6v_FYx5=C zl(Bb|E&MMxVj?n*Zr1A9(b-H~jk1P-0=wNnspLFrkidk=>Iwx|s`++$x9_AMy%E0uzj2oR^H zkch`3RBiWyBjU9woH>V4dOr-|sCZ8SYB#ZYC#FDiE5sca{>(_xW>&1R)Y~S$T%NC7I0wX2Y&v1*_V8geXWO_ zO3+aN5|vq_9#d^1i3IyPMI|n!rtX{EO>q3|iOPvZ^dy_+9g_1wDf1Ma1=XC9egUrx zHAS<`%=Q8ZC!JBCm@cpjB@K6XZcIf2*1&7%c%a4RBu&Ml3`b~eYfwXxJ<(oWL zrpnk7i0ryZoJgbFm;!@Dp|1RC+>b`LQ}P!wg&=%iP-#8i^rC^zhL@xg=$i=>Ub|Oa zw>7aOl0s2nOVxv6Ka>)kz^x=m3if?N3w*gQaE@qD+8TYF(Qqlx7cEUF@& zICp41C5)1w;Zp=k@%MoU8&<*(P=u7DNNl6`wo|gSn*u$hkD9;F2dFA)IpRejo71R| zt)j8BW2BD|8DWPwaYqXAqJu}Ln!EDz%2QtvKL=@0l;)aaR{V3RJ@uET5--4#-a)3U zza;uYO;i0PLOC_~_DpqmO=YY8(GZl1$B7;-loBEXn`cYaVVk##a0v{ilc)!_*O~{2 zWdv2lto1@au+a4H)ASo)!LlrNdS%AQd1CUlEB3UT!d&^yEc=}-8SOwcS#&S$>3^98 z&;ESzGxWukVX)IL*{irXOmf_8URaU15ZoY3eo5)~iXO3~_q9TTuu{Thi~xm(jcQ!N zSB$YCRc$sk0s5(A;?F8LsU4i7GmL|ikwa3itVixwfFi_K2=^x%XS{5eN+@n z?Zo|?z93aMKrM{sH%{KFGvvRqSDg~I&tc=p_qkuo%_<~wQH})rMQYWNVdME)SFfG?OQwS2&Kw(yPRg6RnSN8|el$n!vn7Jz%i+VVm z?!Q*UE;hr6(E9hQ@jU)dFR2BUv2rwOvP2*3#0ji*C*hJtp^#ezyk={;r6gLn7FirN z+uU3eMWea1Wb$Sn5IGM21RQAuh)U)PMX{Zz^M%wJQ%lNEbLbBG6=Oxm(MBiL73wL} zwX78Cg223F(mVp@%01LpbWmyu?w~a-cuCO*k@{Fc8P(3A`{CN5Q zy4=Br2|_pe$8~lDYfbcT%V@%obdCx{DoVA*-OHOHR}kbUTv3)dMe02L`3}b4ZxlbT z@!x1v&^ih>CRKDzv^*@w>mKcnLzQ%5REUtsQ(wEsQ=k=K?@m z(RS`=Qkx4)%E&KOzg#1FLWun}m{?Feq*mPGr<(Y5wzVnNPMs*f;Vk*ZVM1J~~Apu`j&F zH{d|+sl6|&R5cUKQKy|kPQdZmAXq0_;=6m4(y<99DM#|v{kv~?2;>#{*VztX@eD>=(77;fQ@?R6 z;_$_?oBmL-8aQ%W#CFO3wsa<1m1hu(X9WJ*7)rZ$%Cr8OHo)C=8Ev`28aFN~M~xiP zD+!a98G^KytVPbHr_Mn<8|nKMC-&qT@`VQ;-R~M6_6XKgyygn2Zq)hkg*G4{^O1cu z1ia7m3@z6h-UG#XQ!38*gOd^XsjnzAsv1!7HE~qeq4yQL2Xty!`qmxWc$7X&LCyTF z*5=qUmzc&8s?stNlbC|-VvPNZj74WD>J|fj?g;TW5ck*SVA|u@3i0dMo^bv-acPQp zF)H~AQIiob`EVAMW>p&@X?ieGbA{I)r7|Te7^TtS&)qXs87PGcma1f!Hd!=l1A`&k zQkgj5oHx@s8bxhb(5_l6j%euXRw(KW%3(>veV)NR!#xx^Ft8(2NBii#k?C^EYON4FoK`_rs+>}%s3&Ku~?#^#@m8}-ucvN>Ajl7e65WYx`vmP`bc2}@xj(MiL` zIm!%0t#Bt12pAwTY@z=;d@b|Q?OgsRvCTD(@`8e*~ z#R*0dYyvGIIf|?z&o}JXsTDLZ4uZ&5!^><~wRNugKI_t%O2PKq!t*gz73|6gRePRs zpVw7iq#W>IFD2Qq()%G^}opTh3 zRpM9-rj4Z4Mu~Ff4Ew3mQ7&q=*W^4ZQQKwxRvm*24W+0|i>WLXxXcKtl}rPf($+dX zp=<6nWz_bO!X@ zBoUj+9;Gz>Bk#Q$O+Ig@%xzf64()i(rF((cMSAY@^fI}J*9k(wzBX~c=E;q=aNFMs z?0d9*%HdbCDWofp4jIObs>*l$vicp=)2}l(P^Rxn!zd087h+4QUGKqr?eRq#c>9_K0xCkno+B<6U~Adz!`eJzh0iS^`a7m;)kWj&sjzXL|@;@Dhb zE7MJ>^*LGBx9ffDm-}rRW&Hh+G`;>{PrEt&3%$9V+H_vRzVlVIgLRT`z>X? zTN&2h&ub#(MQF%Ckswc5%K8i#D|u+7!}THC%6Q{4Hi=%6`t4^qBSI2=wR2HT`lG?6T9yr&yiGGzU)u3vJ+aWdx#jfiDwu ztdi_cvxQ`~h10#e)bx4c_2WM?NX>@nk9e!bi@<)OMV*pFHT0zSzsLwAYegpSNE!+n zBb9H$tE9p$M{|cJa_h=bhhEr+UaD7@IQS53C*NNodbrNQ=gQ1DzknxQy8i=nK#adf z4gn`4Dknf@5=iC|d6Wa7h{tNR1^2K8lOy1h^Hx3}NjwlKkbe(hPzLu<4_aU-DY2sx zZpn`H1laxr%d3A9ZlsZ1;p86s<^GqmzrBAo6ak2sq~ch*Z{of$zAx~Y@g8*a9!qSI z?`;vw9}BW|k!O7VLF4S3veKU!Iez1iQT^PQ%gY1t$b=beikkmBr?|D`O}_CxD^5Z9 zv>06S$1(CH@6S(<91Yy%kUh=DIUVbALJM-+5Wv~nHeLX+Ai)BH1Qi@qa6q8}h7BDu z9AF^gLjwvVUZhx{z(WNK7%Bt_lHh@YB~6xOz`%in1`u4jj1W`8ObHewT(DX5!p@m7 zE##yL;ei7P3>u^~K!89}0s{sRD6mwa$_FrGM);vbYlN3Bs|sDovVj4O3^hiDT9$!< zlx@v2@MyNFQ@R4|-VKmfuYdr2_v!`gH?Ls8g$)}nV#G)h#!%wjix-5-J$m!z(W4iH z2;<9`=~4dn9GVM}Awq@(8RA7=y?gV@0D+z5o|qq6?!g1%Lw66@@#+EL{iDZlAH#uf zxmPC4@-SX@Jm1lSM-Lm%b?C?e=HB*tUUKl@k>h%F967}2m@>u26E9w#F>Ix)Ba13Y)y>8A?*{3+0%E~v?ZJ`J@g0-FB(QvyIM7?jVQ_RNz{Jtf77(4T0U z$pS_>tzZHPAedl+p%!33p#?}<0HKcJYRFZKVs$E`hbE$Esfs>&Rn?PD^7U6#3u?fD z2Po)jR8Bk9iO-o5um>LpmW39d226DT9((Sw2LYu3xJ@Zt51{G+uCUTdiL1K$>H&9G zI?8|rG*Sw!v(943qk9>+7b?2yvI_usxCIP=ZMg-&FuS6~r{R0_GI%?C5lAc6?fyr2vocpk$I2-(EwLAH9Z{?P3Q zp}DxH9^rTpnup?g_<@HVh~6&hcye%Jhwq&3;W-;{*g=PZZ*!tL=yaIxI`f=p&k6S2 z(}6$&=PM9y`|``Lz8Z9R!iF3K+&VtLZ#b~-8V0WcLc?jma6$|vWW2);VG!}d#x0Ee z1s6=b+yxd^P_e}oUu<#49BW*`#~)Ack;foa?~w!|O*pd1EKA^^gb+edQc5kU6v6e} zt$b315kUBI%PzSLfypq({6J0ToqrR~I5(J+PCfCYluu6?ZM0BBZ^}u~Ww{Ua&j}zE zG*f3WmDDEpmz}A5n$DLXrt=*bfC38I8p)!A;yOr0Tt$&t=_)C=dWf$6EE17b9bh0O zc@+dBSQ1|aP+lczK(UCDEcg}bCKsr{*QAw`2Z*o%qe1{aY!)s8*ux%AsaFA3Wt6W( zfCuTiN=#nzm6sIjDEy)qy`WOBhT-F0WjSJ0{xyJr9n2mO!N9~5C=SpeD3pg^*c5g{J*0KyRDILFe+Q3yc*!Vi2S1tHuK9`pDC z5Ntz+AIJtWc?{$aBqS6ZshdS=QVFuuB_{=sOGzpomy{$tE0N$yxa)xN zzJ$EwEsuF*>VTQp1id#+Z+g|!!1dVolk^tsNFmzp$^(F$UOP1J3(n<*$kH-ls(*cE9@ND6^{ z&8g0GDk)0pG+ywaG|w+74+P2k0F%aqCNt@?O&rKT1~~9f4an(EnDSHk9$Ep7c2H4@ zYH0l;08t8j*n={$Nv5{fVNP*WSsUf3q73D%{_Rabe-7ARK`hA9nL5OOvWjV~TGi84 zwaOr`VyR7o#nXJvkX%N|pu4OhQJNTv0Ti%+Ql~W&1WZfIOuYvJ5MYmZj2Ws`6&G0y zFqH;mRS6K-Dp%O$5_qu$h*1%uQpj4CH8*44LMn{K_FuHmd(p$^R;nc58z zz?;d;V>;7v2VYUbSv1Y_Ub6!y&`}C(#G@Sr$pqXKQtXf<&LpAJzU-7Ifn{eq;q|Uc z$0P9V4y?R;mZ`yQda(2=EGOzkcuzTr00sWU6$(5ws1eBMMne_UQGJ-`^>dV{N)@V} z&jbRH5|vCA+7pne&ydHL8N2axFi0;s@)B;bLhA14BSVtXeOJxY=EC&fyM?C6DQIP)T=&vwEjs?XFH(&b!tzr3h?!omd{xX4;1PtcMQuAGyCWHjHV?(d zOlCwtHK;QyGnj3xHSoZK&~!GNp4}r1$idAUrQqv4<`F!|v3>S!kIUznC)>}#_OqQ} z9`lf`ZK_27Z|SX{wy7;}fm=7-qHqHzyxVSJBb+Ypjqk!uSD5>bfqx4Tev<(hXn_%N zoD*RI@nQiLu$<0`rU*PQ7O^HEp|~J9fr~o!0~2$PU00h$#v{GXgksWg>AsR1`j_}B>=y0~y zx}fk^qfxFe~r{IZ?=GC?m9 zCldUU+xbY`0XYIoIW946tK^+rc^^s2|iHcM(FVvqL9@C?>o@ zJEXc&fwMp9IhcTe9}KCYgP$tYAt_5lV>uR6fdHi2l=#^~^r--yv&o}K00dAKgdm8q z6GNFwvbc-8oHDY7xFC-h0F*)%qgV+k6S1C{N~Bt3O#$c3%+PHZTUpQ5E#FJE4#8H%v8mSNetLqnIa&X zGDwX6!TN$C5P~Vtw2;XHEs)LGL^WO1MOYgGp_zh3nu6s+###e{Cio0_$Rl54nnY?w z@CXm=iw7;pnrh6(?&HSj6q`$OrL9?|_4uvy^MWY2xA;pX9jK2TaDw`Kf&zgLy%~@L zxyO3srRdtn1%Uzo`#|HPucz+ zDfJTz&`Od@i6i?Ti@2!)GDDhTDIH5PwA9jsK)W$CiGeVRwlJ5ggHokp06mnJ3$Qu~ zNFjKDmMA)k16T@rp$h_VGaBlOMQj&$$sm3)3$h>p%p0P>OjOSUy~(tTz6ixrEVNMc z3r@_dZOI}ngF`sW zX@M00P=;$b8c_iRwI&p3&<$+R)ajA>`T!3^5);%=FHt$-@e&Tz*pxf4dIC|E6q63f z00(%UGueO{^d~t1D4GmX7qv+r9TlDPxtu$ep|eA->WZVRp9)}79=b`ME6S~^LO7#< zxD1P<4T}j7imDJXKoOJ%z^Du}sG@ZMQ~^UaRH?EIQ-kgcX7nF;FrH- z)T(+4dx^}w{TI2qi$U`X$+a0nTfI#+#Q^ZsPi4h7f`W^A48qDR{>A_q?TeaR#oLX`>ca;z4@}+&mM+%{??Ftcm9l#j)u7V6N@jAE{ z7+4oj0rQ$b3T(*H!8nDL$P>uGZ<5%J%UFwLL6hu&mCIO^yV!I};E((OmAj|qIWRIw z6PN1%8Dx`w%E39YIV(LDmvz~c_^82+i60!)ob3t3cLs>cgGBLfoo7$<9XyPiU;_iwb%#) zSlp*@3N!;`$&_48oFV}L7s@2$yl^W;Ml?=cz0Q?1*z+q*Q;aZZ)_ahLF6g7pD4CF< z0xGZqDyRZ0sDfH04Okm2da#+th=$IBV{SHmSM)=s9`DkA5go5}`n{_MCakYUacmnIyUb@*{9Vl0J-5ThE*LbzZ{-am( z#Sj>{Pje2q0`%7uf#1t%ffHx}6?s4cttN)d--G_eK#APnZqm3Gyd9ELITl<=CP|(a zJRX(v65=Vaj=fk222llDNeZ69=b11QO;Lcd9t$uPcd<#sJ(go3fT1H56kc1GP+A`P z3MHiq!9B{GWC;jx0Hw7GnD}5E3kx5rv#_`^ChcJ#uF@)floI~IEG1J4P*bqgQn%x= znv$UZSwkvL%Od*~C}RKuNJMj)$}pyhJ(K_k*dj%7AqE(j1UP9syF@qJ;{#aZz`eq% zXv#ar;juUivVz<{u4_ybWJEUPC<4vZ%c3ZXmO?vZF3QYL1=S-!Y{l@kDWHNsf{ZK3 zf<Z34Xz1utVsfkcYC?Cdg zM=_|Cc+0c>m7^FI2r3A-YvP*%{s5##aC3eNP_(U8SFlXzUc6)861N<%%S-|%VQ2LcXYP#oxjc*Lhz;SO_hy*7j z@c?kz?}82i4;XL`NU)RsY(XZOCjuwn0yl8xiNSoL;C(t-2#@dzi!htZO0hUv4a)Eo zegFhO77X|38ir}3m9iB!+@pP$$=e{WfEPT5m$=R#f&k(*4U4E;I!4*?l;586*}0+( z@*_415T;rUf)|n!2$9!XglOWFl89LWpa!BKHO;$?hl#mlF~aRTcEMw`JM*;YDRL>) z9m?4^Kh%_nM9I8!$po0n?-Ll@OUUsYBtf+#TERh0t9VAYs`8Pf1Q(#TEW z!z^6|f>2k!9~gB{&-=WmEZ%s=rFq7yQO?4T_3Fq*^Qd+AxOFM;f-jf?YF;I^IoBr$ zH|v#x%vVP$kb?fprvhP@RVQ#)Ef9TYr|!}>{a%6r!r3?Nf}HA-cJ`HaX@7z7=JxR- zuW6!Z7lF9^ZCDjx*bHRQa`)d8@Bjw=z!GQ@CQ<$a0~3}D0eo6HSN}4Zu5q}q|zv+^106ZRw92N^4 zZi@y0hyef?9B9zMfx!k4AW)c4!NLOy7A8`xXwgE2j2SIVpg>{40tO%*kaXbDV@HoB zNm4k-fB}V<9~IE7X|rYmoC6FPP{8xR0gxaS2o;(jWI_iEA3%uU6oQ1PPNPbQKvnA0 zt5qW`g#O^*L4yK3cFWO9KV=rX?`o?*PAm2NMP? z;BWu|0TLfZtavfx$dV^ho_yr;5hIz6aPI7xGZ7+1iWnJfy2ubBLWB%io%(f5M(#EBCqQJy@3;$FR!_*3S`udjZ~lql+>)Tm*@Nq;uKAQCeuC5z!jNLWGvuY(v}@#BI0@m)mT+#>L4c?UKa;MH3^ zF(88sa?N0c5MCI=*cfss1BV;Bz`_eDx?N%mEXv(ti!$1+!i^{3DCCbl{x~F&NG2KO z1|4LX<&qv?xugh7j>)E&WHO1SnPsZUW(R0)(B_+Q$~h;Uq3fCFo_=!VQL_vD+HJRp z`g)hUhjuFHrI<=u(n0TDnrNoDgEeTgcXfMIw@D>LfkqfTgzEAXWrY3#M;2Ugx=OXO zgwg~PM3hlO5+#sP_9_7{)J+NSWK&N*r4KBzL={U@PeO^x=(7u5yA@Q`Vyl(3Tvf^~ zxX2~Iy?pCj=WS7XB2jtB7}y7 zt65FM8ivBw%ti zzcQ%M$OLR)LDaK2va1X z5=p0e*-JtdikG6b6fSxBPk7a?v&AANs6wKYX-R-p%(KV?5FkBgRsfpO>|QmI2R?0T zL?YB&mGY`bJ_Ud?0pj$@u)z6Rw#YAd>#U!)qy1Cg`M!Ho+~$O9b0aKXHJ zFoS=f90}h{h-49>a=a6r=M)iVLM$Q^olvzfHsOjujp|dII-e{|p$b*7f)%QO1uASo z3rWR76{z519akYfQrpfNYk;1rHmHqfjL=!dilMK1RYXbdV_G%DHYcw&MQhcN3v%?L z91Rjidi(O;{x&2O=+&=cR??D+B-kl|2~2A`l9(*H*fV*cO^l5bmqyv9PkN4&ptF)? zF}q6c1uC|&4T)@F$w0RVk6Q^~ZSh9i*+P+)wRoZQFg**BpcD%v4ZzhxqT&$eHM4ok zd&u;Z*^ux>b5#|nEpM|&Tvkq?Rn7ji2%vz+0Gu$lCh1GxHwzdPPCIu2N$DrFpd}To z>~C7#tqW&gqECB<_nZkZZ>GHBt_6OI0Ra{0Kq;u0f*RDm<_-XU(+$zi^tat398GD0 z@B<>q<~6L57)LEe8;t4uVjx8+4OQCGmXb7xKpaaBgveo>-7JX?Cl7g^AXT9L?27V9 zT2eEfaT!wq3s``0jFGBiE8uvGPOF-Tr=SHQqtR+ti;#oDrdAF?h^!mBGFq_=WfGm0 zt!rCBmJLZrM0za4{+gYF#h3>-4`=q74X??!7TX2~G zSFB=NRk@nD5txVsS_M9b0IHe~X*}j-oxIv2lOno`iAZ_^Z1mlv+GpYWxne~Uc0H?q zSb68``{%#9e2UuPT1&N!9Xm#ewp$PU3%Cg?ZgP)%zVtn}Wz^l!&jg{r?0&atLUTgZ z$VN3TOpR@P^KXxy6l5}FFmgtkM4Gnj2Q)=lS$L2{5a)o2?2&@|jTY4_s(3y*&NxzC zoa6n+c;r{O0*}2|{|(jBFinm{!H^XQdj!Z9@W;!!(SyVh&4E>tWk}AgO_H6}9#z>M z@f?Y)NFm(~Uf~rZ{_zdqpg;*gotiz8m{by$)LCLp(wT5h*S!f1rU?gV0H2}VoQRTS zfzF!HNuA{2Ww~9SSODA|T6OiENW=NS#!K@kaRd%=iV-NcGT%*;M;I9C?t8{JF>cVNu7? z7}V$=Gd5%Xj9Ebz#MqAgAB^Rg6$I& z89UMu1!l<2Nf}x_8O~uKAN`z$$Q9ibos9U12ADu1L7ka7QjxG(3ucnknTeE8*4BZN zL%xaFQI=#)F+3#D)m5V)dDY`-fy7C{6Z{7jZ~;12!4{m+gs_0u zz!8L;)mNEK+9VlSp%ovENL%%s3aE&RyhuOpjdQ9%2h@mkikUzXWC|7uD79dnWeMeE z9h0yL=VT6N0bykcVVx8q+a(w3fMiG(1r>4{b194ZoDWYdKt4^I zB;wOc65ezH1@4XIJ>}#p$r8I9VpC{Ot+b&w>53b&VNtFjhT7U~1!YFSS_C)*N&c9m zuSMlK?I-*Y1u>{|NM_gs1JhP-hw7YEv*-Ot%X`<;s6ZaTNdB( zK}JF$UtQYex`B{HHQ&LQ1`1gp^_|cV$i@kwkPBr@#?TNh%8 zKm@47P*mGsjOZU09wmNj>%pkMdL;zlMNmj0Q0T?C7=WVfXfNTDT85jr87agb>0C0D z@^OYJZiWZxm%(IgMX{p81Xv1TX$yS}aAXWf)y53rA`q}tOChGql*P>uQTr_sc`%L7 z9HY}9V^ZngXZGxzf?R0^?G<>O$Nit2=IPL0BNo)D6>xzT%&Ac&&B?`wh#d_TSOFEF z#~P_)4QLgCykmyMfQE3$rCzF9UD?^P)o`j+Ak__*6`j(F>Oju^?U1Nyk$k6kRzPFX zVAr{7nsClTqKO9RYUh+v==5r@vgZ&E;phljpM(#s3<~?O&##pzAfD)cMk`vRg}C%Z z=NfE)29zXf>$D>5sKmuWkZYn$N<_c~>d?w>Wm8dJo~x~EMI3~xqwOq#s6_q#11IMi2#A5M0J(eHAH^R;*`a zMk$tJ2N?mqnTCJ)*S$?23%O89m8_Ot41zt_NJ&`Bdg;sR)OD0hWfqMw3RTkFUz@_% zp7!iD{w&ab9E=5Rof_?)mgb)(@SHyIpvIWht{Bl^rj7os$JRCoZ(>NMj<7sZnF*_a zaGJ0Nj!4_C2$%H;j+9_t)h*qcnceQ0;;0?0rb!Dzj&=rapQ#D1qFqI<=dYd;u(DkS z>sN?cE_Jb>zG zkGmABNm!od&93cI1OiAzSGc&BCdyZRA=Fz&?8GiclIGWbX)Gx_=|nl72ua_>TxkpW25#Vnyp=4# zeIH5nOvoJEbdXHR=(3qk5z;`xX6o3W?kvbfqyA?e?Z+uFG#ahY3hkcCX*1*L(sBW! zT7eeS>1k$BQaKHy4%r98(G%RJk%{ewh_I8Da0+K?&Pka%U)c#H*_MG|B8_U_)Ue%} zAPsv!1(<;1*eaJ$9p|trUvUZGep2BQapD$E4%$iDA@O@|00tD{Mrwd6WxxgG+Dd3z zeoEqgZtFRHakOSJ@Cn8jH*8^OvGCqr=Vmb$uSJet3hy<*9rKEyFhIce3LIBYt7T7C zaNa{i-X2fH^rRZ9p~_H0PenW)1WW|n0m}jO+F$s@PV7WU^Jl2kQoBR|UHmJvxl`gT z#9bJWIhC$ThD-1DD7Mney~NkJePZ!_{&FZP9}W0Z1hQ=#PIdV&IWC8 zOviMea44p3jD<^`3|SmDFHQSbmFbkZ>aD$*A z4c(|FcMUH$(`5jkJ!IHHWOr^rnnbso95fM!PTHy6MKZKQLv%(eF`r;S25gq^Doaji zu19O`czv`^uepWt@-68ovzw0VwZix{D+lIk>|25f0ZDPpZnW%ikjIgSOb+;fagYbi zO6C;lhsIUG&|K|{382TtSTd8G&{8nb8m(#n-_s85m|wvIFD;tSrUh%kmM?9c#`zU& zK^0u{dQACw^v4>lk=H%}rOuHCn(*0{?V$JE*%rE!$yJvnog(?o44W#E*sz&3-E(*6 zo=whmR|!EIblAy>;U@H*csJ=}04jAicZ>IUQ;$k0p&x>Dx!maIy0=KfcLa?WefvdA zZ)VDBZj_+SX>C(1aC(|88icz!Kkj_((|QB(=_ zyY)qBXjrKW)y8kcZw?`LFVZYy?|@>DR1@?76!}bjZ00s@9M(SLp57?~pLv<1c?64g zXnR~1Ky%Tqxt)6aHQVXaYQYvPt;oaq6hUE4Z04EIWHkF|>Z=Z9} zpDm0CQmD#pJ^#(4+wiGIIt^cE36PSlq6wz&Ag)UNbFYagStLfTon;|0cMB^;^9e;m z&#lmorr91^r2h4ddahc`I<3e3Ky5L$TAQ@DD%n7r*fzKk_HP@-IL0 zH^1{gKlDex^iMzaSHJaNKlW$8_HRG;cfa?4Klq2g_>VvNm%sU+Kl-P?`maCxx4-+p zKm5nP{LerA*T4PWKmO;x{_j8k_rL%DKR~<@IFMjLg9i~NRJf2~Lx&F`MwB>_VnvG= zF=o`b{*hxxj~_vX6giS)Ns}j0rc}9-WlNVYVaAj>lV(kuH*x0Fxszv4pFe>H6*`n? zQKLtZCRMtWX;Y_9p+=QDm1zmoaD7yqR-n&!0hu z7CoADY15}sr&hh1b!*qJVaJv|n|5v6w{hpzy_o`-|9ux<6(7F&tMUD_ZxCMo zcK`nY{D+=~^2rXK`=-K9Km<=iL!W={IjFw?DO_+NGyL0*!KV})a6{6{$j-xp%Am)@ z6H%n6yX@v6h@N|3jPaiQvcpHl8*z+L!w+-nkVnwei-*Pb7%GECddwS$#tNBiQoA2@ z@)1hTFm$q>h2SYrz$6E{C!a6D%;&*>^a<0 zeP~4|17wugmWG{HF+86XNJ00O#TBA5#)K9?X{}YM+Hwygk5wgcjVH(K^vO}qgKG6p zp7z!&qdzKx4(-HK7g*%%@+0u$?vFjePA@OI|BRabmwFJXN4t zPenN4bqxYHyD}n1NMAA^-gu%V6Bf5wm+wk;AZ(TGcIJhQjd0~-2|@!tiD|Y7=9rz_ zx#+o8q-VM_8s<`Gh-mb*2Ci zesU%|B!KPC%g|kEB)1@D9~zpVpXsqPo-sYnTO_;{zstz~@R53LhW={hw;*`Nqz7TO z8~2Fu&g&}Czk6DK18|1Uppod014I(^yG49GFthcmo1oKq-t}SH`T38Zc}fp{BH*QG>u?s~S#ln(kM}kqGiba=ax>)7@}GQ`%;(1&4hb;fh3Lf(a z7lfn*kNS~`9`TSI0vB>X5PqeB{-Fo=&>)|9*vLd$;@m(c^pAR=p?^oiM?4Z0v=ss< zAJ7{iLqzyPuGGtQ2`SaM6oMzLy+LFc%;7=K;I9AVgL^_O{zwq5s1;o$P9a`;P(JQq zyn@UFSm5KJ?GyqJdOT=#SsVx!-G~(eY6LoST%J7a2tqiPrIl%+J~DN&h9Rj!hi zt#supVHrzV&XSh3wB;>vnM+;nl9#>oBpczeR zPLrC|wB|LjnN4kOlbhZ2<~P9^PH~QtoaHpQRxJRHZJJsZDk2Q=uAFsZN!uRki9>v6@w_Zk4ND_3Br_8dkB6m8@ko>sis7 zR<*8`t!;JdTj3g4xz3fYb+zkV@tRk??v<~7_3K{&8(6^(mav62>|qg`Sj8@uv5j@? zV<8(^$xfECm9^|;F`HS zwYBYSahqG+?v}T`_3dwg8(iTIm$=0>?s5K+n_T5Cm$}V#?sK6VUFlAjy4AJrb+MaW z?QWO5-SzHw!5d!jj+eaUHSc-Rn_l&NFoL~hnn86Kp@Pi>7VF^!|!WFjgg)y9A4R4sk9ro~tK^$TckC?^PAxu zXF1QA&ULo)o$;J!J@1*%efIO80sb9mK@XbHg*Nn|5uIp7FPhPfcJ!km9cf8Vn$nfF z^rbPKX-#jM)1CJ8r$HTRQIDF`r8f1cQJrd4ubS1ZcJ-@a9cx+7n%1?p^{sK8YhCY} z*S+@juYnzGVGo=Z(VcE}ubbWNcK5sC9dCKho8I-d_r39*Z+-8Z-~IOYzX2X_fe)PE1vmJ? z5uR{`FPz~Gclg609&w3JoZ=O?_{A}vagA@B;~n?-$3Y%)k&m3@B{%uWQJ!*@ubkyA zclpa<9&?$`oaQyR`OR^j{&Su0oaa6F`OkqKbfFKO=tVdB(UG2Xr7xZ7O?Ud!p&oUq zPo3&jxBAtwo^`Eno$Foq`q#l8cCnA0>}5Cm+0mYMwXdD+ZFl?I;U0In&z0kPoDCXxBTTXpLxx1p7Wje z{O3U*deM)b^rbib=~170)vuoQt#|$FVIOacFbu_T49Tzz&F~D-Fb&mk4cV{_-S7?JFb?H#4(YHC z?eGrqFc0-`5BabU{qPR~F%SiD5DBpm4e<~WF%cDU5gD-&9q|z%F%l(l5-G6~E%6dD zF%va$6FL5|6Fu=0K`|6XaTH0h6ix9IQ85)&aTQsy6)55kue#SaT%Gh8J+PNp)nezaT=+y8m;jfu`wI9aT~d@ z8@=%x!7&`gaU9999L@0@(J>v>aUI#Q9o_LA;V~ZNaUSWh9_{fS@i8CuaUc1yAN}zk z0Wu&3av%w^APw>$0R$iBK_1|t49dU^5(PaR5+3AX9*&0Y^kE*PLn6?|g658lo`@pQ zpn}{^AMnT{`saeoZhb<6e9q2?N&;oZ?jF!+Bs2)@%<5p>ILhTC?+1~ z>i$TFCg{iN>Y<8Y!VI1z>J|tm{zU4A5+{oC>GG&0j;QH=5+WoLI!r_(8&W4HA}E!P zizFfq%s`FsK_#cC9^%0a(!e5m(&+AiEE^&XN~A3lh9AHP9_Df)gl6e#vPdoxX{u6H zl&+0XXCBOlZ|XsFn1eaw;YIM_G0$fnKBysRr|7a$Ag=Ns_(371qYQNN49b8a=>ann z(;>E!=+LquvS*6ONG=(IhScaWTeBhR^5^t{Dbpxicm*Cdb0N^?9)zc=Xj$&w6PEsUF1dQ8_|F7u6wtj!q%|hDtZIBluKH z{Pcc)&P)rUZS)i*){;2_^g81-N*!WClvE^AC_j?ZHCeSGRz@G3Mp7*zOnK-?=f_AL z;tW<4heAR{14K%HPDdY9LGn~oF+wH*1XG#lJSo(Lq*Eli^FLs;PJM1f3&M=_gIHTq zJhP=CTomUnbd5yQX+%OV>7jY@L06F!=sp!RwZtSh6(gePGJTa+f^J&{A`PC!M5UD? z))FuU73li2JTHblXM#Y1u3yu@Y}ChDBZ7uDQX;05S~aD9Zm3`v!dQJ&B5-s&zhz1C z^ja%IFY(hP<+Wg%Q&oi1VJAW_;e)5;x<49*$;e%QNW!wjjR}-#Galwa zMJ|(vG;<(H$COSEzu4nF=8Z%H|;Vq zW50!MomcJ@k|7=^yw}1Wje*rjv1$cl7xPT4#fDt%>6?lOexPcw`fgw18C3u17=;05TbslW^h8a{3?jXSM zfe-LNOUl3xgjk5Rbq|dAh>_Tcr}x3;;SaP#9{wPTrT7n6L>{cT5AeW>wOEVCx4q`U zhYN%b^uUJ8fQl!`jOhRmvLg?SSj58l{| z^&mg)AP-o?j1O54^nefgK#~1m4;0yrF$^F4{-BTlz>w|b56rWP1KGZs=Z;H-lLOQ* z!{iQrI80&~!|-5-?LdtWxi0D84=&S8vNyiy!47b_hyDN$#snYqAd2$?52kpSrP!4* zY!7q=5A48R_@F|BnVA0|kMWBh@IaU^Qyx+|K+Yr&>flT=3?C#Jne{-3`&fu~cvt+O zk#QJ`k=MOuI6wN}kNu#T|6>pMAc^gH4>n95_<$c~cs;H74(6DSGr5To1`qTgoA2wL z|KW@6;D!+zK#=)Nw*H53r+*JGs3WT08cjKsZ^V_28pj zIuG<G}&bglPfDV*;sqsLjGfbHG z08MY&Kk}iaO(=?wdcS6P9*|i-_F$LYat|IFhvz|~IjoG!Ko9x=Tc$cY?m&_qh7Wvr zmrI(xW_Xu*MVJ@)XZ*v675T4Y+NmpyA7VK~@Bt6^0d2{y%h2v(pZ4X zAP;mInu)ot56rTg> z(ILb|939dj#7lg{(E%J#+{DwN#a*1mTYMeZVa92^#%FvT(qYD%VI9B$8rDG_n&HOP zVI9`N8Hjuxnjy&9A;^>58JwXRo&g%992%VA8KT_Dp+Om-AsLe48KOZMw7eOXVHt{{ z7?dH(p~1_cAsUQ<7~DJ8mv4SzWzMWi-8y>eHbj=%`u%AdZ8JZp&6WE8IqjSnc)^lT^Do#7j7XJ znBmA}e8z3T7I489Nc|R=As2LE7g{0LbKMnq{S{sT7JywAWff}U2-=!hosi7JG{urcz;0L}M6n^0q-Wsf-;jQ5s z9zNhH9?T8C;0<0H_I()wzR@+F;UE6t8NM1E-r-4J)Fyu!zU96X%D=YGRE+{4iU#8+IzOZ>z`T*X(s#DCny zD?i3t-NtQP9nvAyms}jcA<1un#)rJfS=||QJk;3%%dOnY75&PcLErg38opf2!JN#O zVa=mq%kw=Mh`|_y;rL5|6ih++OQHGWJkR+&7%ctxGhG;rAsU{c8?GVItsMIs{n3@- z-Z5SN7=B?Ge4!V5q5OZL{D*;Q@1xr`2 z;=*zJ^1UWFayD(0DQCN^?eey4f-`%rJh}4b$$mLk{(L&M>eZ}MZ=<{|w(QrhGrz`0 zo3=LoZr!$Z>+Sou@ZaN#6Ypl+obu(&n>&9F{du|N{pFD}4%5rWw8T(oDAGa*~2J(Zs4xKLs@ul*Sx2qB3Yb zHP%zrICa%iSpDjjTh{a%)vaY&S?sQBE$dV?h}A`9u+na&7+;b7C75D*aYc=@V8NxW zVc}*ASzy;<1KMetnf6*}sby1JW}Rt+Zn~}Ai?3_3X){~DvAKJiZ`*Ja+iwC7C!BHP zAa`7J4nM42bJk64U3T4_V@`GEVAtJr-;sxL#^+%-a(M2k_a1!XgrgofEZ>J;I_mI; zpLytj6ElGW?gvhQ2&%fEi#OrI4l&_G)69oKuM^^ixrE40ogg}66pGQ)pCCbf()#t`G9DM6Z9$|y=EDWi|2IJu;k!bJH@wAX00Yc$7P9jljJ z1~ZH8?+z zQ7n`~q>-f_*@981E8TACrxl6nQl=JN1XE0=mW0!tIJwFbPnK&=j8MzyxKuKNOM{kJ z#EK==u2y!1*H?g#)vZ*wVlU0I%xZO&S9irl%`?+(CBL?hL3S==i*ZFFSKuyI82z0K z8-a05y+o54%+L!nmvI+2_@yqvY(p@Y!3Mxs6R&(>FkrKRAi-**{+r-vqZ=O-j&F=Z zoRl#PIpg5Yb|3~r=`3er8Uqi;u5%6=y0AJE%VEh#W*?KShdn4;&wS9aGWx{lWd%|X zf!cEp`t+xjl2zcHd`IAd%pGRjc?n6_jr<7&@X${>wGqaFbR7^VP{k%B=AA(>*5LLyR+*k(9l zFl8B1a-TG`bR#XzDjLcl#*cOrQceLzM z8V$;HgQD?QY%1y(64Is{+29Ruh7%lwrBFEDY2kNbh}0QQXQ>`rstY&9vFlXFhaIa} zguH_t_(ZWd<*5%6*Tck{6-ONNdD#;OL?3amY(H77;(@NXGjv)pLA_L`I_m^aUs{eq zV-rU?STsft?eas?W6_J60ZM3WO?qGp8z75O47C1T?P|8VQZi;lqhXXnl9808C>qJg zA^pfnJ%Vi7ltGOuRq2z21f|-NVT?tZQW%Q_#^QX@O3Fn}OtS1nFlPx&c8<|SZ472G zbpbj-x#A$E+e9Z?!3jxZA`^;Q)I(q)yWv>`BN}1JNVEw~mROS(l;UnUcQ?+Npu`qi z7oQAV3oGw-}ik>TXhkshpUCZn98exB(_XwP}M+|PMJ8CsE(Jt3>;H* zB7oGhRw~9d9qSMf7S(}f_p;YjxbSV9=o{FvMMFZ8n_Mq;l8a%)Y8hU0M%kjlXX!Ck zC|@FqX%9&v8(nQFYBQyogcQk0lVZ}QD8(;;@uMHj))-w9hA~d$jeuegMK;<|Y*UHp zRSx5}Wy0-kBey5bjp;+V(8YX#@)MrC6IHut)N&cJ2~7~HP}FtBbYGzf>S9-TvvU;f zyonKQPE&Z})m=t3bzW|Y1SQ-?NrKkFUUkN|O}qSwhk5}v9j(PyO>xRIy0y`I@)LW1 z-ltpImlggZ)EMehD80Qm7sP-M{-W;tUjPAft!NzvMR=J?VivQPi-vfl0vupWD@Ym( zGLWV6vLHUltBv-Ox~WK|vqS;HY9mf;M{GBYz4bJo@jp_9xqb7Gp=aVK}a7fzbX zB`t77`k2Tcq1m$x2k<_7{vRedO4LdSDXM7Q4VD*(pR5 z2iZ~=%w2A>HBqQe6e`*N)9rmGG=Yg%JPH=XFaGc-Qr>81Di+LtRPx37yYQYD+ZQ1o zt4vkSb1LstCb6|~c``Z3=IAK=ghu-4eWGRsKJe(9?7yk0v}8 zgG5ay4&uONN5o|;6Ao2}MNODRX(m@yG$3c#V2*5Ii7<%wbmx~^(MU# zJ;i`Z#9$2H@D2WU$0B)0Be60gd52j-@o6_=J!Byb#*j9{Kn%ceX_TaRr0`jbw^@%@ zB$)IiXm}!V@kyLlNCL$aoYse^#CWRI3#dSPXtFrOG$y`4ImiWysyAQmq&c=`3&dnP zf+7pgg?pXwd%g#Y!50e*!Ft7QSL7{S$z40f7ET z7!OBM1!Ne9fjx)eaCZSvec>4PV?Y*%feaKGD0nT^LO~-}Q#B=m5R@Chu?^(FFS2oh z1eAi^;QkFP2y-hab1cL{P8WkXXJjwR#v%=o$Zy!wJ|hBP@92LH^-zZKK2yS-+W8iN z!!1)GKi5fd{pc5sAyN@XQ5Xnv6DUCx=3xanay#{q{W5|yHXAy2g4sYqyit)YcN{3> zf*LtiMc9!KvmM@1LrKL{N|iAp^JGATgFPrjR8~|)s2&CyA1LE=MaX4MXmucJW@uJ* zBZ^LCmXkSo6U)F$T!?4CwI_;GYk7j0xb%!F#aDccauKNs5!h9W()Os!78B+*snb_p$QNE1!ELvrAkN5ba8hnkqd8bvSVy5F z2elRlB@M833`#*tBf?+c2rL+uD_DX)&$%P9%729fVE%WV&k{cGNG%X}fMMY*y@DcM z5v?7zkAfkO_(K>5WIxzaVHqcp?kRyYwJ$r>K_Y0bHWeHLv!DIx4eiQuD%gTUg&Z?^ zpdSex9rG|prE}wkkbo7L59mP48p)i zro{|DN+!Qxv#U0L}%+L;|zzV8RrvuTps=y1lwMO3%4oQPc4w9oW+9t@g z3#Jnbg3_o7kr2Cgd%gDxnE(rz5DUr%slM2YzZemvX{n@XsiE=_-4tG*3Msf)eZ&|N zGGR`pTAQ`tM)E~pWruE9Iex!sS+RNyYO@xyyB7P@e)QBV$o>fxS3*$CxfNAGtFf9r z^X705B^T~0xtv2a=fU>GJpC6X7}8ZP3ZKh=_f6_#)T*;D>#aWwTW800Su zIU6MeRJ|b_6WOj6*{&Apg7mtPPDgX~T4XaggC2Qv6q6lFrl2cXbUw6_?eQMxKvwTT zRxhbm^!grY)vy;UGZDO#Jejd&CNm*>q8XgQ97{%Jv>+Lhn{#@4uofq{6eqoq3d3}I zlv5^g*OqT66lT~;G6J-67+GbQBcJ3AUhB2CvNk=!c)wsIkv2)2wWUUaX?mlzvYRzn z^N3f16hdowi-d`&@FS!br)|m#sh|oYJZq7o444y?{y1uDdvc0H={lw}UC9Ouw?}LV zvBthfe6;9`b&OrZcZ-)BxujWMp2Ccr3aYA!i?btruSrfO(QS!r66~-`%u{x=gq8T^ zs!YKY>NdN}!f%(HEApm|Si!rw%1=|_6!|Bs{e_*?8*stGe~p2y+3H~FsA$geU)4ap z5mlaw;ZhX$7rgrP;9x~Pslgfi4I#_1z0^i(0$j`>!mxJ!db&VMu(UYC@C$~Cn2Q5}b#wF$_UsB3(CqM0ap zY>Sjje0XfRdCbS)6uP*R5wcSew|J?}XH6`zjCE~J>SZcD0bFIbs*okg_(jP_fnb>& zyG4;-fEKIQ*golqPq}N;+W5)WcozF-%Uz+I+(K~KTD@Pp1k(*PM?k+p&F^c?8Ci4J{9_#|4o2oN z51PNoJuxuEL&%L)7DH7g>0|*sq2>XT25i9fv9RvJz$@c)4Li>b%O50KAQekyX_lf~ zXGIL6MH$Qv1O49Z6*RKv&=f)@c{^*wMAd8p3}mtl-%t#!AUe9h3bhq^gcid>8^ehR z!#qNGvC?;(R8O8Q4O@~nlcyw;lz5`BS(8QzKw=7w7YsA)C7%7Y)ENzG!)a#7hn5D^ zxP=O*pbDp8mHE*HyWYx|)_+UjE6K5}%8Fa9xX%tJb-L=G>NjHgP;C!4rIvn|!jm#qigF zO-jm;V457elYHmGIh>H4J?`d>w9I}^!HrR2D=Ll_26Ywoo<0f78- z(maeMwER6AcD=*=7$5f+D;JO($i3bBarUDb`f|*%VGj9Oa`^c{xvjp^{M+wakut{{ z!!2{)-Jvd&bHMJPP8IAPiLV{w9sVkGMO895#DgkRz%psDV`XJC*|6fRRwe2(Y*nHu zy3hQ)4s|861kFWv@=K45XSyIdjPtf`s|us13qD&8=zt0YjtXwWO1S`c!eFy`x8Tv! z(LxJZoW>M})};9t{+2xaoX{{m${-9#TxlSlc!{TYd4p+7apn^Sq}C z#7E_f`nY*4$dAkPcN`0w^45e*=41}K>9yu|rRJvlqOznol9v>(Rp*}N;upIkm^LCMXc;^^03|7G`sei*?b7oFr5m&Z?^{n;4?QS;~(7Pq|@MI{!6 zEtk>S15|(t6oSBk%pFvpG-kg1+04Vi4b(i%zU{ugZrsv-+}e?I!M+_!RUO_Dk}@Qc z*1<6#V=~PCeq~P9k}WBdR#xo=YM@5wG7al8DGGJ^jH2HD?IMd493rw-LB6dLv`v@s#Bdh zS+tl6m8w;&c(qd1i{u^)p8fBR=ZlwoVm-@O;@dMX42I2RVJX4HuVIGiDxEE zu#{%P=?YdXrBS8Adi8YbRHsT~&5}iH7A>!{o^F*D%j{XSW@XJ{yY?$sTD9QTs%5Jd zJG}mQ>)NGz>sGE@xBv^*)vK37hYArIOV-$NGRBRS9b23Xnlj9dk8S46S(>zgpsNie zUG1|pWsZ+w#yn72G|;d?$0l9dwzO)wspaNf&0212&#wLU{j6HS+_njlhF03QHR!po zNxyatTXpN$xMAboy*sz<+O>Df7M?qJ@87*|&!$b=Huvtg&4)if?St=oM6 z0_?9FZwmB=K>rF9CmaLCaqz%#A{@uT2_1CM9COGiXG3$!>98CPKlBj84#^?$L=-XP z(8LYNIp@U}%XyI;8qXQ$9CXfc@f>j^94DL!(Gk)|B85Z;$ORV!2b^%i0Y@Em(*BV$ zohQ?Q63TC`v@*(d)=`HYFW1S7oo2ekYaMdHX@(hgzQoI~TyA0JFT-@PvoMcXNktV^ zcIlrHnPO5h>{7&nS*S5$hABoF+`hR+n%zD- z#MX0E z8cScTq>`nqeYbjxt+UEX>)=@aUCS-F8U~9lTgJ?buD<@#1+c(!DeN#${u5K^)5jW% zOtZxFTsSe%yi6T$ChSl$Ez73ooR-hzrd^=FgXqDv=>%-=~ES& zRAGe`TTa@gq*Q$Qr5JLSNz^c49DQ^dVJKbZQbki*#?gfoJC+#!Vi2XL!eJo_NvKD^{1Jyrq#+s^b44Ixk>V1^p~fi=L@&Bg zjc7y;B1y?fCe;<0UGudBpQ?{hA>>pEMUayRrwQzts(*pm$7j;rexMl*bRd|pWE&j;~P23g3pw!SPV09rZGNBYr$U-h> z)ygaI1r$IpPI~f_))6i!KY2Cnq>^j*p^q%vrl0$mV?h2HP<5%ROIuo~K;I}( zlYmJf2mR7Q;mDAOG(Xy}qNwR8 zL}3d3C7D?+U5GKDah!o%rliW42rz(QjA3;2f6`N)DwayErbj4g-m66Oa^DvXh4>slzo7t>}P4M zvSoxOXSGQVYLC_%rU4B)mV}P}aco=LVLft@w!OwTtPu^~Vn^H7iP|T*;SEk6_dLes zMmNSYZti5`xvqR}ePn5N}2Gii1D}iV!h@**9Q@1DZ9`QR4ttxM;dJ zMd@W6GOZao{PsJW;~*zF9fS^WQ0Q|A21kGo+@#VmSaoD_usri(Pcp4ZPPQ8pKldqN z-T_ZAb<)LFOEO_pqyi(SfF3Jyu5(oQ;v%dli7#R-yf6>rQrZ(n$A*C{mo`>_n_5P( zU~^K~_!J?>3I+iGSBja6Vt-AhRoDO5^(upAvX~i`GKK++Q~<*v9F?Ha_k@u>aipnE z)kvGIC6Y@S^q_I}Ah`ZKn8KTEA}2&43Q{of=f?{=hLZk?B)Z}Xw*CatkS@wts{-jt z@AWAR1IxeCa>ONa`d@8X{lnx^#kyE=OoRR6#b&N*;i2ziuSSSuU>%vNe^z8CWlhy% zqter?#@Cc}%=QRKTIaaTXT~lzL3~rl;W*pb(|&esxt~bnv{u`{;jM3f>uvCW8~y9& zj(@T?Zu~g6-R(Bzf9!wDdgIbW_?Fu)34}Sj`7R6jrf(uI6}hGvk*~pVxW_>eXcCbT zX&lMHul*`8b?_$42`AAxhmPw&&&jxsTMz^TIgneD5;Psw@e*|?6L^}Z*};npiV*UnQxCLF9lMMr?OVJo!&;?Z(26bqM2vP+T}h3AgV6kMc03{=g6FT1fhEzj9m1hRnYRxutTzrExfryAdz(0;gaS2W+~KW16O9 zN+uamkq9&qJe5rVs%9ucR^`6eS#2XYFBbMPFD<4KJ3ua8@jZ%D8w!IGkk zC!}nhlY>EKu!UfQhGwt@X3!medXs%ZwF%1w-r+%9FbTjYs9q2TW>|+_C`48GIgmgF zQ%ICl=rUlC!?$FhjtaA-n-m?>y#?ASWAMUW+YHRGGK5eF^y#`Jo2ge3yZUJsHS99} zs7sA!I3P4Ch++r^ivR{P^M$p{IaTloi#W4W-~^4}gjMJSEFJiIkr)5DONlsx3D z*eJ)NNj72AnPkJqYhaq%dPne!wt^_BM;aDKf-U42zijiZWm~_1{KxfEKlA`d^cc5n zpf3Jcn}?jp>Y6U>+9eC=2L7|RZ@QZY2|y9_$Oti<1z8*xk&zZbCc|kQ_FDcpX~K}l zxu)~NCTz+t{=z_jBd48o5^;c%BViJZW0G)y5)&j!B~`F@%8~{XlPMjOIiaxHVFqXr z9B0@fWw^mxum$Z@EWg;8IO)o%Qi+xD1hXKi4m+{^e`~O zy^cW)Pe}+@<2`S5jAx97;EN1gV~yHKBbA9YGEx~iS|8LhE#5G#V9^;(`i(@YhHn7S zqKP&FU04BKj?%a-VEK)0+s99WNN^iBfkcn=tI(_I8iWLo=fXem_)wC~w-Pl`1RJlE ztx3)iIP*F{W`bEAO{SFuocJ=h3@J%!qOTGihm8BKjx#XRDbglU2P8FGjKj$$6-uLp z(gtIvcq)@I*)TTQoi%ZW+*$@)V1{LYFstN2U1)|66AWhP1t44$gW3f}VW=H~(@xO2 zM3KW@zy%fa2vk582ns2VVwCUXsII%HmI|{~X(@Mz2X|1J{((pak`fs`T#U(l)JKif z!^|Hg;~!=T1~M{+W-zkVfV)o^g^D;!2_i&asM}QKxoA-+Ynh1-dWk(bJmk?JT7Au| zN|>%%1s3wvc!8H;ojjmO7o$K$T6hO}xQBa?hvGfncc=wec*V_|G`gxZg}GMg1(>mD zJ+H`KxR?cDEVW@AtT6q>I3ZV!sY}633?owv^Z83?oVDJQM$$MSZj1(FfQNXvU;NEq z{ng)gprg>B2Am-zrqR#Yvc667hDC~`XH!^}nk@lsVC#!5@6#=B$hJ*FE^zY(@hC|3 zdr)t~*Z>*X3~d{FleY~eS$WH@9wCSCT3G_~t^ox8FOY0NW}>G1GPrYqCWb37Wr{$T zbU6G9CyJ}MjuZzaEifxd;w`C?DTxvi1cztv2BKurcXFL66_X8fovO_XsRWD+^Wqzv zlUp#1G5)Z?kP{EHlS}D^ROkgo@rCCxp3QVqpL^psR!cAYgS#N~P0R9J^}K(TOf7oAw$9qMIzVHe!=RXqzt>Ty@LLU-o2_;g=q^<1FUWxtYIuHyC_CD(FJ5I z+aNrQsY49GEFX7u*H^n&@~o`aAfTlg2zR)Lclc+34rqX0)@7B4cPOdmfW9o-=hCW% zl5!6ItfXc;*n=$y0Odo4MQDT`GL;HHU_sd2x~&CWKlJOQQu<&Ctyq#CVX~=@4b8uj z#if7yE(P((@Di^H!D(iauZN?Y9M%zVw_u5D+z2V2?^4Z zkMM}hBt%w#!nNe6km}Pg(?UIkp#DM5+jp=BX7=X+Vhn69e7Ront=vh-b-&R`rCC7|m5UD4F;>TWANK;~^I6)tmUcS!IP- zV7zq^R!!Km-`+EzpadGSgrb0jckpLuZQd7pq2zvtYkuBr_Ln6xJ*g;8yZUCX2xoDI zJ=rTPiXqeM+@gyCBN|JLyYv)=KpFTnBQazMJX9;5N%;8b`T}~{w@Oix12>lm~0WrxuzJkaiXSC63J2f>d|vB2O(MNpbgpz zF%r*_5_F)FaF}W*H67BKYH;`l47moQ_3C&669>DUl)J$#=cfv*un8l%A1n;=))+ha zC&9SA!WcqtIZHQH#EZDoIVD6>h`YB0&%n-Gyw#q+9R_!h2YYyjW$5R3K!|-_RFPqf zkLfzXgcV1>WU&(kQ22!UX;i|@p7YU^Fhd2;9Nj|HIlETEJ^2U@;-DSUpyh#yRHsBX z^E)~#7ua-#PM8Tv0N!?)m)}m8Vh%J*kOX!)YeQEqyhMGe1-_`4ef&@VBv6wclZoX>2eD< zf)qFOBk^t^hqy8E6wknp&qx&A$RBA^7zQr_>yZr^hh&-&8|m?xHOU`d9F)xQ`LeJ5 znkFL&9iI$ZpJZyQP6sDxlA%nnDGB-~5r=|MK`4HOXStw_C^|p%IaP2mHobH03G9w~2&NN;c7TU_h=+FYLP95o zdlea?g5>_iaEMhQ2Ev50`jPZdNc_Z~bSG2H|G_DtVwI-jsLlk13d*@(5M4Ld6P-H+ z)>bHx011)sppb|KYl*5;Z-rUkAzj8Z)}0CA28vCv=EfsdOE~6!re@v*iqC5_RLp(f zbUZ=Zt7x5ygejO>v@2@8ms$+xu;|4uiaqe&i!gmb#oECyVwAG%6fS%eM}aJ5$kX&O zcgOYQM86D#Sm@?(cf_UNc#jMtQR;hNSI)w@quwTE36)P6Z`!Hg{iU|V-EZDGM z@9fQUM{JldVeam|Gp1}AG-c6}855u};h}e4F!c#jN-3m_GKwe;iV{jFpoG#K{wScB zLJD=J1XId^!Hn0-FTrSdN`;_khl(oMp>m3gsj%4MDXXl~33Q!w(h77s;;17hHMU}7 zD?fI^$tFj3a^xmSZepY)n@EyLCQ5FSi6&A?SxF_7#4^u2SYje&n6SJ;CYfQrGY^(p zTGA#aZ(;&VEM~$|r<}3iIg2cK%2{WecD^#_ow3Lwi=Kwgl4zo|Fgi;uw%GD0F1D~! z%cHfha|@)j;Zj>|zZs{?ZN233OL*XcS4^tt5fk941PZ8(G0D)n46Xh}qYSS1;i@aG zzX}*2fC0wy&acVnstmHxNFxoi&Mw5PK^ZZ`5J3(Nl+iO2X{&8P8C~oCA2bJjE09A1 zaa+wZ>aN=^yW6T1l0+hz1ky(zoy1K_DS3nvP&@$))Hp;PHB>j`bhA`9-W0_!Qh14j z)nXGb7O}-pDV3C1a;cS;T4cRtmRja~EY??X#RXPcX^BM+UP|@lS2*J!)>l>Fpc4+x zI7gP4V~*+kvtyNAMp-(US!P*guXX0yX|9P@nrhA5;#z2+y|x-Nw%j7BFSvdETQ9xo zQkyQp^@59Ty(u<1LrRd8q!VI&_GQjjQ41M4U17a}l#DiZn!>Bsn zeeVb}psao`6Cg3>v07j$g?GrHD4%~m;f0<}qqWdt>7$xP%72iO6mNdxo89!L zfWx`m&AjRY3t2tAf5-R}xvsv)-!!mf8!qZ-#>$qeV!k&xU=BK5M@IP^sml=SOgJ=s^n zjAAgPSTQE%$XHCW;zgxQEMgQ3LTXQZ|ar;(;L&1g+)mS!5R z{f2hD7?r5TmJ3{Tt!$>W&8V)kolnT^6uU4*Dtxh=?a<8^zMv1^hVcs#6)rr!Y{xt9 z5f68$3K;bf+~b6SxmGFbJm$IFd7Npu4k@S<4GLW-MDd9eeUlX8G(|SYV$K#!iptFh~X~K9o!jbYgVbCF6NfXjrsP!aqB_(w) z6I+tUJK7Y{Ow>t!Wy0P&Q@V-~MQk z3rj_6QvPEHr2_aHv-u_$yVyl3Z&RKIqN;%dYTV@}D8UW_C|SNz2Ct-gEDur;g!!2j zfNrI$g-8R1&N9eCrnQh9Myp#KnTQN$sMdk7@T}&lp|&=%k+-UAh}4YvUT%!k46+qc5=?OwT04m%vO$9fuj@A;0mMLi!dnid2nePV-3831ArxtcMfUW>KzoPJfg03Co;Y5OTFeR^;d7q`HBu{DF{M{DX~qVv(vdPj zy^B_YdhNJJJ1l`cFuB4Nt#Cy~!_EGLrSH`y}H( zxylu=RP|J26iZc-o|Uqc#UK7$owZtJRpc|IaSVuzHHLicp;~XakY(jiTh%a0sred_ zd3B4eMjVMr=mipcdE<#oj7q)!^)GMy1lT@VqOkLru+8Q%E8q~vvahn3bO7xsi=kN_ zKMPto!qFTj>zHS|T{61VrHvueOJDXP+i(Dq*@&s_IwS*`oAEYiLVLF&!GRgbI8q&? zu?#bA(OjlM4K$odt|Zy9j?!Q)G|cF?E_T7Tp^nOIzq!S5gwya-l9zU=u-l7J!HO1T zN8`Wn#df^YonNS87kU#$I}!(v#eK+d!&uMb=7XLA4U2HrJdmnDGzc&My4{A+lNv36)Nyn4xg2?oGAFg)PH53#cu}qs5SF6 zQ;-s>0UMs(-i)ozzYyGa8tBaPI66Se0#M}wG-zWK+NsIVprJ?KXbKLiSkr9aRlll? zam6)<-@v^J5AxPnztz;y`sxl5B9wRiep@6_7p#?UL?wzuiQagIN3KEaS_4~OCh>Jl zw(o0VFSaPiPBvGT9WQj9WHGm2GNxIbq1$DE z1GGtoz4ey8{^=IZphIQ+4AL|bX>0~_`HgdN(!%|lX*Aa(NzK7!jb}s>#Tf_N6q1-dg`C)t*e48Bji6YG z`A*nrohS4dlt_Y(83~kZLL@v%_K1}CXo)+>LnUAW_kam3ND1N99VYak-t8UVaao@L z-b>lt{FI4G86M)98UHK_ngx)hL>^CZjVBoThnSOND z1P#mn>fM8)!Q!zzRqVY(fhg50(n^2uUJFG_qMa34VM|0PpE3SkTqz^EaEtF5V_T`! z^GV}0USGY~S~YUt!U&sBU{SDjQC5)O#4H=ls9(+i;ATl1&4|M}bVbX=-~HhQw>5Hr!#ZoAeRfq#*7zQ9khGSgCWd$Sy{tN>a7YCjOYc#_$Sl}jQ z3MX08B&mkMd4_0chSIEtEf5vN-3Bl4LfDWB)tu69&_dcg9CD1Rd!$Z%jNEz%1Af#;Fc1SYPy;a}L!MnzR5IbuDM*KmLexoEg?#?g zgj7g_Y>0<=NIH2Tg&4vi99<`%NONS}KyjVc(a2hwo!0RVTqcPm*yZu;*py6(^h62u zNJ5Z>ltl5N9|B_ckcme5N!<0|k)6+!8QGMPl%2%Mn2A~6h0iPeiJcG%C7M~8(Sj?? z!g26|08t80X$k^?qHo9D@iBz9hyyfCL@~bAG{V}v)XNO1#PuzV^nsr@ z4oo>%kz_Fp!z2v(HHP}JUmk@K0J7gxSj;-g(YM8gQh1viwZ%T(5w_h?S^m6CY?&jq zshdy?O?&%5y_FYpF;olx>*v>e4T?oH0d1fAy&AsKq3C3YI8|jSY+=wv2q73kAsij)xJa6wLhld{U83QP znO%y>C63@F9rDhTJQUj5rAP&)mPkq4`C*nwl$2bFmtm%u;GLhg$)bW3-?`oT*xjE5 zUj4L>lgW=}A|9c1CQUI)CYB~o36N0n!i%nEc8yYNj>^|OkTVeo{!{gte)!65a#dBi z9FRRxRe%?E-Er>*`X4kg68Py@E4)mj-VbV38Iu+Xw7V={OPTm9aPg)}bF zt6gI?if2)TA3A0cS3rz{4ibEVYgRx-W7wy;wj&*ZOlYZ5Q?SulC$ZZc)ZJtb@JzR=vra(&*NNW(H{(TqX6}!ciQ>O;W`A+a@g>Yc$s-eFkx9 zhH0=y+4w@rjgl>02if>SZ+r@E6xDIOAd1@P+pK~Z!pL@*f_k7rkbcd3_2_-&mwNat zhj0#)_L+G+sWBLccnD=xI^lwB$W?yfmQEOjoC1cS4w#buljnp2A!x0co~b<1Qz{S- zUY3}S@ebK;9b3|=lf)q>*dZO-W%T@|Bv1k-1ZMX@S)lsZ+F^o|Ny*)c38O+LocJN6 z7M?8hiDW+F_>@$pk{PG&j{pG>PobGm1y!knVs@D#opqk8IvNr#6`magp&i;i;3lw? z?r$M8HSEw0eG9jcTDRbyvc%P|M1$1KmAOD`@;Tr0DIc@>*1Uwn zRj?X0nuH?RS~!%aPlPKLf#XtCn;2b|w4ozqvEOT91vt*kf6gO6eoS8ABfFaK%kU>0 z-6LL{(S1rx#JHP;exy41*1H*z!aAU3u*Si0;3obp!*JLFDxpTEWJ)eTtiK^}b1{Qz zc%Ww(-2ZNkEwGJl--U>@y|mzt&mj--MN))OwBlisK>-K@ti6jKkT zQ%)AcHAq7+;KzZ0hfWrQG9;zXb%^1VQ#x6#I8g{F5JJ{UVbpy>gAAQEjlzO}DJi^7 z))GP?l%-k5PMU&kk#OCa8q|sr4_nG97>8|~c0weuttUuAA|%4wzHK5S6eY09AF2;w5^`o@DoXi@n+W2Vl$4l_nVBsLP3?yNTuK0W zB2gg_EtIO|jZ)^`#^&DH0|5x*;Mum^%KqqjEoTwGi(W zV-G#2sVT!m?guazn%}5~@|BhFYRfus=Q2MZ!(7EQBBT;Q?-F%U7eP#V8bz`t#lvVX z`(X@IRF=d*MPKLYrXX#Zsg*KJsT9F@^f-MaF3JAW6oAHd4{p?*Qsn{_1aK zRMNpw5<36~FAT6P{9AK*B5P1wE&xMoCpQZ^OO9}P79h{KQJ7B`x{^1-uW+4wYAun#0 zY1u|4;+tG*oj`KnVMo%v*#0GSYPPNh^b?7MZmV&}oc2k2$^;C-! zS5|SEUiH!K6BmE=ijDPGw<#xlLd<3z@p$=+xiK3jf*r1L+d_$tSpp?Y!Xre&kpN~T zOahmbk6jOH_fT1y#NFDl$)XM}+({JoJoYOXE}z8D_plF{KzgRaRG~O-nMHV{q?x8z z%4&+@YJRc~hI0N6iuS6s>MRckX~&APAlfS9X0GPqe9(GQwd!rM5OGJR@Zp|tzZF>Z z?(Ip{RQ+~!mRj;TXRXMAR>n6Vtb^in1RJ==8W(ag!-EI>b6uo@ zvqRdj5=F{JMPK-4Fat$09548ehi4pau+4Rh62$gG*NhiR!;^B@Q<{PtEVW2^%?&E( z;K&8Td+pLN7y~>QQ#)|jFW^VArVh~3M^uI-SY}htZ`0F$!VyF5Q!ibHq|+!&aTRNA z6`Q4(hyMA~o8{Aw^%qk;@iYk53JRY@qDsjR{4iolDTvS%_LaR87{iDm*doJpD_=7Msa zl}9Sd^5qDQGtsgv!g{Q0)lf5#>ae~3%A)X*^t zFLx&IbT_lJ*FJTRQLlaDWJ%Vydvp9Y7QezLdJ7U?ko(G*`@4GEyQ(jJTd%uI|F`d! zya|nP2`oP6Gj;}-0}@v=0JLdz>}WjKaG1ZpQ7mwH;>1-X!ez~8_|0o9957t4?_}J@ z{*f2sXM6wyM=73chyw&FR;fODI&~@)s#B^?p+c1kqAFFtDEdC7lPKgp><>V>Srbv-EAwrahQ`|&v$&y9%h>|2pk@iBO zRB7$rzneBydS}nwBuSYVH*So{oxOLCDQCiD2{YzOmN0c@3=7t)SD`V%iWLjA>C~q| zqh3AQwdvEbX33IOn-;BExoPS0t?O3sT(xTD%B73fZ(MAh|j8Sj?&5FmZmwc%f@i$`L&tqy;rZxgK#; z9P&<@YRrE?=}I-k;?Gf`zwzyOvA;8>L!EJKGho6u>H;;vJV7rq2@g5A(hNveHJ!SEL6{`&Y0N>IBY9yOjiWvb#;frg#Wvg*p(OGeQ$eIXdF2G{#JfL&X0}roQf) zm%Fji_z?2v&$24be~4p)P@*3>rAp!hiOjBXZ#eR;{bO$zZJ6HH<{!p5p$gRtE!_%T zF%g$a}7218N_+h+l5+A|SDTwMxO1aFHAiK~YNl0Hg1-5s=2;OR)myQnX0Y~k z)o7cx#9~56m}=4JzP3nXf{U(*@I7<><7)n{S&4JqBVF}n`r|c(sE^p9x(>P62C|F% zblbPsrT1g>%^aj= z6KoBdrUoq5a7r7I@WjRD7{%;yJ#CyetPx2LgQ#&Gb*{fv&Tdmy9HUG;SvQk2qI`)s zq_pcGv5*@gPIKfJ@T#P<5u)u#v(bMhmqL<90605l4>86c#@YRf2uc%c{ry!)l zxhn1*l(x5U3rfe_=|HOVvUXDIrSNgd=(Q(V;i_<)oChy#A~usbN7W9|(`hll#{M%) z!~0N}-l8QvJA8D1nzqqe9gY@ek3V2D-6yf6lccQ*7+VlX(XwEjgOutr_=PG>AJK7n zzMo25c9zk$ZAW{32%z9=b}H}xv{Vqq_(*PV(eCFv=(|fF!tHOOkC7|&vInu&BGaO< z|1RtO7t*uD#OtNJJh^L6Z|X$Ey2)I^sTqiLKgLsZQ{WA`tJ0xR<(gvs5oO;-cmi!p zJZb8gbEPV9nH!`AhuEQQQkv_c+!$ByTAo^5W-A#D>B$3*vlQa0N2{MQx18lZ*{+0g z=6%W-24!B>j!Yd|fBAPK+xVB|FQq76#GlU^3fA2iBkZ}mdTk4;+1j7ic%l*E?>a@c z@83lK#Ue+nX!n5}bE03N(o|+8%7*rMHm*JutqEQwt&>rOTmQ&a#v6X%uR~fK4mH&( zAY^GaqZ}@+UP7p=6JtshIssU|rQYu8o3jMYC^b!!5|Ib#Y)`wIG(OnPhep|5IL(lF z+UcLphX-@mX$GnuIjU0sfKJ>9s!X$`tjte6&>wDxF| z3asX~y5pOS5zPFiU4G|3ewJc0eKq`;XzoACNIb ziQti&bjYcYVL5S1cdvccJ`V3(3Zc1(89aVkj`@_t{co+9Qmu(bZlmt| z-yGB5GPXGX5|p~ysGS-0JB<6GM|iY<3>OEW7B^$I(rrT88=4**+N|iTB>s}d0r$j> zS&8(HMmVI|fmR7|m14(Hl$c`&Eyp+`^5XB+N9E>v*^{5%kx_szrgjtuVpl9 zmgdMpBCi@s7p@9QH4~P9X`aZt@LJtsr-#OqH>ck%KFMaScKseF{9W*wpf~#rob4)E z>rzdSMddv^=VJ8F{}Nr&8w+QJuJUJotqGr$Da;4D7M4+w136w|aw=}hDnQb>*qxqa zOB%F+;7xkGl$i&#h5#BKOB?#I9`3u_!zmN&0+m40MaRzkA7|Q=W1<7y4!$5bzfBDDgI&tT)`Lp9W*oM;0cgEmE21)1#C9YYAG7XJ@6RFK7##^3vI)DBFsA zJm~q=R2U9#EF4YEKtB*J5IL$wvex)0M|##oXmlmCs_B|&k5$nRrawf(um>|cNyOAb zt+-J(4ICFuEry^wA!OU^8Qk>|munoSzFx8}h%Fe&1wLQhaA_wZwF5}oFH(Pz?eg>p z^OpFf37tDo96d??`h+s}$;UW>>5d1%De^3C3y2599l>DOHam#rXPlti(O-+S-rE<# zqZy)+UcGeHPJ!pHzdmF;?EVKVxEbz07KXX+WW1J`k|^MmEEtD#Er3$urK;+rYmTVi z>)=8%ac$M$@>$+kQZs2>x+AM-oV`Z-0Mjgbq7Xc%ZKQYyZG( zo{;*2F#a<7==c!aqN0g!I1gg_!#?w;Mr}>$WQQlD{aWoMrB>i*`OyPW!uNCQ;NuI26YQnb=f{y6&Q?sSJ|i`wL? zQG#5myIAVm>14&&RmE6Jf^(j_EAF~QsIFuC%agV4MSI^?N`bWB4T9++q|C)nz#oSl z7lf&XxsjjuHYWF|Se3TehrnyfTYE-etV!l=$6szo@ZJZOt4XkC9Tun4W$#h%{1ee% zA4L8RfI58gn@P$wL%Mk!4#sCT7wo{FccF>a-km#zq;P6a}$M_?`@ zJGwt0=d0jO$$hWmzl6K*N!-%D|IXJ#E)~ShHoC{+{j?-yIQ3d6A54@BCi2r41{o1c zw$K-4@m4PA*e8&TU{10qDl!kqaxy8F#j1PipN+>{D(zIsvH*4_j& z9*UQrloW)cByb>zIJzxIdSpY(iqsBPLa*?%}W{X{xqk1jy@zE4z^u$c=ux9c>K ze746Ghh+5ATOV$)ALZUy>vG^ervle8<<2>h4N+1KQDS_$)%mDc9lPL;qF|KZ?;Jrq ziS64P#ZTY=bk4bu7(0tqVt2l~F0`^fiA6rt{wct2f7-G?e*J`0f$8AFvF5nq1*B{W zD=Kb7kidATcB5p}2#%zmv{VRGy%VCn6o-h7ivleKA3{@OWiI*UP6!Ieo#;b5wVq?1 z&J*k@x65!N>A$J$Z>jqZq`c?N)XF~{@|^do4F2BKJwJMPc$PGy$@`oFpF~M_{^Myd z0#El9x(uliYS=Pm)e`dUPWMVn6E#sjj@J8xc+%=T-g8iK)O`*oxd59_g3YVa$--mm z1&?c{KIcsh#zy^ip4M-wUfO*=df^SK)xY2pIj%RN6GSZVn@s8EMybS;e3jxVXj^H-u3&_D5*oOpaN3Z=^sU*l&F&1;X_Uz?ezB0+5?7{Nil-5|Zt&|cwc${0 z4GWCp$g|biE_Vprnrvz|XSO_HS;zT{GZOP7?qf_Ecy!K1z$qJxR30P$M1aVQOcRyE zbrTzLc_=uG#Ja;9ojHhs3>}vrtsbHKQi1WFhTZ+nz0&?`YSk*@gv#cK95)w?40n|$ z&%8HUf-^&j9=WuafPg#;r^|y8$m(-O7zg4VYj8|}A;*N3V$UaOhbCzaU-Ac^Cy-1i z86H3MR)lnY4t%)QpIw^?7V`)4n4gu5hL0O-B(sx$$6AnAPms6P>%XPY8iwLu!3o7_B0F@H_c(k`dI9uppD+Uap8Gp+2-oUYzlWy`-saF z+jh821JsUE)@=CQE#E=+n%@fB)jMMC=a<^B*V-uzL@JWex6bLGQUt%RrFV!JDtTv- zK6FQBpY8k_%Nh-zrPOYsc=29lVl;uAdA;&a_%n1%24SJ#e@l(lWZA@r`j<7&S9VRX zHAIB9I#e#ge!k!HDx+Bsza6fGLM8{~o0?<>K3%};d`YB*bR1jiBAd3}vsYo9n25WYd)w*W_DuJ} z(f}Ls*k3IT_rKNnE_3Do)-uN9*!NyxQ{M$_M7Q#-Y&tTjgJQ?N|$(-$ABa^uv}((d_wTkucl=Ny~EM4 zB!mQ+tFzs0pJ>TC2Q4veW+#Fm8`#8bd!B3ZG|@lE7_48wWy*Ra9m1T3mnlSE9kF$DE8jn3;oqAm>D zoCs>Wt&t*$ZsGS%S)d1s=VC_?>_*0Lsu-3fcG__D(Qq1jys$VF(pe9r*o07WpkNS;ccc{iiY;uymQv* zs_PFq_dOa-F)95}EU8Sg!KGhCZw#EeESFR^m!RZ2KzB+fqrn^gs3m*uD;h zaEX63ZggL6vYnxQ^1An6dg%GTA-=YKwjW|Y$zV=Q-^UcjnV4g^cl{(wKil-{dl;0- zZAxzwV+%PAtYL+(F`N9Hb2k0Hhn_wBP*IyI=v_aAq5Gv>+q17{hor%6Hm?z1IL)@Y z&k&7!Zo`V?YvLHtH@Aw|N_MHq=<2L%E$*tAKq6QrQ=ldc zN^6`9V*ppdP^@6(Nmh8KMO8A?Dx3(;%h`#9r?e*%!G+^2h|>7x!!^^zcAxAv;EQ*qNiy|GtL9!D@*k|6wVLn8O`eh^;Hi zwOBgJv5!khDJhsGo+)j2zMkf5znJ1Ge?ES#&EH95)xej`nR>$CJv-bWkadQhdD6QR z$0*RVgJOL0=3+^kZy;fMMqr@*x`cPB5l!M#`Yvxq=>6?Ar4k{r%4{n>ImSzPn!hVs zk&r6*yuC>r&q#Gdw_8_j%A$L*YbtnUQF}hi*;tcnkp`^uv2z)%BcA9*?=1f`kJ?aP ziDShcMSQnnqR^;=K`0xInVVT&iPPHeCzzO78<*l<4jO0QtV$8E>E;jnMT9^tp6#YV z91;?jR~!=QdveBA#R*nq_M4mvWpci<)9YV2^kljg?V3^dwPcK^d*pj!`xl;&&aIIO zX5FDl+}~*SFVu9>j*!j2V zns~z-LO+%9kY}%p^9};k_ClA7ZjX7$Wr$#(|HJ>4!cD9kz7q`)%^Un@6U%ENil*XUX9Zv$q@2bL43H zro3T)aq;rtn;qIxtJKfc_=t0|y0G?o#+?4B*wIQks?=eRn3S{4dFi+;0!vR?mOQ7O+a&)7=a7L>x z{Dn?pppGJDoqjZ~%wMt`Ww=$;OKL{bcihKi6gxXV-^MZLAyI<9AZmMWPRX2UglBk9 z8X}m)^sOSK@j(!v{Fy*fv`cTzur{?pyj9A{dY;!xcuMQxSKeVIIiE4C>^k|F`ZKIJ zJcg~zr0=WGv632ZziVpWUpU=ep+S_Y5=lFV$S;8rTe1^e$ZAMOK~wgNk(=cJHlZXC zSfs*N_8^vm6fCSYYr_lPxeuW-zA~ zLK%#?Tx84Z=7?nYURIc8SDLQDspSpV%d;pe;;uB{QfsU5EwU>W>UjI@hn7K1+}KYX z7w&5gZQ69@$4}fln}b+{3$+IRjwszC2qGE*qu{Kg;Bb2`MwOk6(?x=P+o@?D$06+Ck-{f)Yn&hSE7#FK8|hHr zCm@K$x7)eo9ghN!2PxG#Isch*E>RNk&NY0H6%dM9?LAo%+Lw4Wq$X(S)L4+rF4<6s zX^t5ou^SMCR2wJG|KYOI@;H)^-5*nq8cIEAh?6Y=4wqA@#Tz*4JxiPq1T11nE`#Ax zB^RSys+(H+(G!>^viXR;{j^^Lov`~tgLri+lF@rN8mgsQf#>uj_Ot>tLw_Faff31j z?A$60ah$0l&Q;X46oom>t`a(u{qry+^>#Yvq4Vg@`dbRk_8Tg8%4~Kaqd2YGZag`z zZ1y9yIB@SaxKO0SQ0T{vZf-$BDz-~(A-*Ri($VT9hj!ZV+h(|7;V(P>Q2s@E)9$Fm zt%fW&7>{+rEvWkbnxj8?LUFuGCBp7h)r0nlwnELbMXE zT1;H?C}Eni?E;#uxTo^y8?A=t=My-@BZ!&b{6Ggj8ShZIIx``;5g0CbwP1F&ZXZ_w z2{tt1+h^6aTH0M_v$A?({O8;j?AosXD3srhX;$)G0A^fDts{x*htnT9mB1_2M1O)p z;s|6qx?KgzKQqVlFgy`j;%dB8w7JL)DL&y3bBp_!*o2c}{i*3lTxsO1K-1CWZe|8` zL!4DmR<(l3tKiq^?1wz5SkX@g==z)!m>Tcfwdrr4lYHL)a{hdYdi?dWUV#d1!!wyy zF-Q*g$JJhlQID0nLvs5wUE3tVlV+*N<5UZul_c48!Ps|306V?#P{MD0#|g%U;8(&^oF2n5dhlswS9dsEng%J96$g zued-?8?bFM95KP&0QuwuZhz`3EOkuJ`^gK|;)s@vA4trkNv$|rU@ie?vuU>6k z_Pl7Ks}Mkszen_mA^Lye3l+c=%vALtqYy@}nzhNM`%p9%7bOs$O>&T|0okUqsYsBT z3t>4SU~0r8s~yz-Wkh0+D^X6Vb1zI%Pf4t{VP}Inc8jv707$<$_VZiz zZ=;U9C|RuP9$PjghrbA?Phb!+#L#0HIlUjGz{O>%i40QaB75Z&UB&er&9zqjRPQ+W zaG!);oK#MfM;qn*H9kadjpXH^g3YndA8Ou~3h&lc>)l@QUJxH~K&X|viIppvW1gZf z^vS|PXkQ#;~~zIW%FFUD9x*G@3eq;~F+uBU9T2&)6r1uIthD>XvrFnT8!CarBi$WUUH`I;n{} zaf#j0#2VL*Pyz!@xZ{h3K*Iud>o_^?JOjr)Isf4Vz9TjZ94-Qmr|T+CjuwXDodz4r zhGD~8TR~j=%P5})qb>*M9z#-fbz@^mg+D>!rcS&$2!&t!Nfy+aGA3ffdnP?tw8?Zk zVoIn8XOW5|mhz1nLivXR1&mBX?P1DG@r6_o)0NV)awxmHc7Y^o5E-ro6&r=J zQHHruMn}GI!jQ!(5xpZqWgslm6%RbBN!`0ZHkOrH8X`6#fRtAF>!XLIK1HBIsercDAZD(S2b9M5ihJLvDe#}Hte>tTNYjcQ|Vex4fI?j9 zk{lTZxI^-e*voymv~qxWA6s4!8y+fGv?^D{Lcd$oAX|uY+9^*PZg6v(;AO>OAj0W? z${7~HY1tqbN?fmK&h?Dm$$mKhnHDlZx*!^C2@r zY~|oJuVyGM*e#~V_r-Q=HHN+!eDTYG?lvDE%}}y#TP@7vkeOw7&a>CL9ZW3{mj)(a4~G% zoTopF=VC;@kHgAO%v(x@Cy|D^*qN8!Q=*BoI{)D-WVYD5L1$?d@gXCdtWjnI6Q3C+ zEjOpEhCLr5ZWeN4afwKh3Ptq6B1_YXO&xo6a?s<3tj_Y7>c81iCx@}(9yyOK;#5fd zdHZu1>U9kxiArLKSdefqRIffBW9nJ^(kY&Qsa8)$dZ&i17S~ZpS-*qLG0Wc|S19kD zQ@%OeKw3S94oHt;j9#~nlRjtAj!pw@$eFosAm+6MQ@r?JSV?GD^8+qo1aNRvAo zl&ElmBivDx zcuK|Oqb76#CVC;w+i@ZYh)QEY_&W(|b#>}lf74xM`Y|gN*VU4Vvyu~55BH(cQR{)V z$kwgXQULeuslU)%c%&X)2IURJan-_675pLVS#pO(&K22S6E&xidX5ozCkD)ot8xZ_ zHS;LuE9lQIEf?11HAW~#V?_IeG}@@BUk_5;aq~Rg7ro=M&Sy_$p=@6lab6aCZ;+$Ql;h*^x(E^jpKT5_JLJm z39*^yhA+QZ&mX5}_WmJTubLUT$7a@FWe!`C2?vN(40%<-tR9P3^a)$FQ8BzVEKC=x zoP$*sJBu%7FKpJ57IyPCfyHmaIvJlaHSZ8_uQ5?F_^$Mj3_)}s?TJCYW*< zD$b+xTti`ELt$@^$a;YfZwL7{+!zLW$kwSCME6Ns9bZ&keUM^X7+U1X8Lhy5y_nlg zQi6vrMK4fj`J@aI7Y{OLt}sJBk(6GB%uzAp6*A2jF)7Q~@}6a%5bTOX`fg=Q@}3db zB6jNrS^rzq`O2~Un7byntCkkM{HV&m_(tkcn2bS@Jrj~hP)ge5UdHgkVfR3qH6L!8 zLZqF-#_qP7Vi<_kMH5-J67##|8OH_kbID%Qa6r{LT%L2%uF3hx$ho2OtficuYsrn^ zHashSx`oT_>c0L|q9A#5J^HN?r`pCF2U0ZBxW!>3Ib#E3(^#qOBIH8ZjT1&WG(`)0 zLJ+XoiWYBdX`Jn$q`KN{wx*otnu&3?o5Y*7yYmb*1_~fhZ=Uh+$@(WpZyE_7ie5_g6}*VNE%&lIvN$M z7W*G)Ua!8ndF6U$FlfSQ3pNZwA9~Oeo6;G~#^-a~t*QPbi6J@K?Bb#f;fi=#pgXaS zl9fNXnSAk)qy|m;s(rF9?%@DyrT84r6DX2(oLCZsxvw`(8ImzmojCl*Q2(!jX&vKp zU&_i)R7G(wYM#(uhPv3RO9y>D3 zRgjGeDSttViS3h>k?~djCH=|mJ?8N9^&ktFsgfW*1!BW4t;4Gam5DaG z8_jL?&1s*wB8%jg??2nF!*lpCi=e;w$2xrX+2U!o^)ZjRq9i-<$nXeR>xHCb(ne4w zmx>JCm5MO9F$|#MU8#@7!3QgcCuhM_5(u6~oe05|6Ud1nyv_{^l`1HyKvfzrI~>I% z&N6JF$v&-`LXoJtVqB-2oz1?P-mQh6*L&)xjl+W6roG@~Fv^;L~ct@L)}9 z8xVX$Rgo)T&WGlZQ59lpX-(JqiI!Ti1TSY#yWQLA1RftN^R~0Ckk#qc&t@%uIz2hO z)>_P3Lzx8zW*!`;NkOM^12f-w&0cc1Rn2;ue$Z4oUwv3&J_f-*^GtS`{mib5e@zH z_8)tw-9XsaId5?%6ve0h?-#@MI`#U@QNORhHd~u3F!%pGyZ`y$i}(MXJV*_GQ>ao7 z`qQc|DEuNx5K<-{J9T9u6=dg9A)TU68X*^EI%cGLA5k~zT)}fi?`~*wOb^C3$D&l} zD^oa&+)9)J#+<5@jOdvv15gw0HAY8t{$-2glJ2PX`KGmys5b@)hDH*czckGEhTca=bG za4CmRqj)8ELt|#F#F1;S3nHL1(S_m98A$wfrZJMhPc%WuaU{~{3Ns%Xo5aCtX^f5W z)oCo%gw@uJe3>~gmiXYrb-R$iugsH`BPLm$Lf)F1Aqk1q;K^l)5?0A1mJO8{MP*{P zM2Wo~Hk45RNmY)_?~|+x#tWi=bIJEK|x({iqf?87!>}waa5{ zJzUoP_uNQRSO?!AQg&(?BdYUn?QvNm$VzrUjSh*>5xMyI4pDddsc3ed{%S3t&c|)Z?#)-%j{<(*7<;{B2mZZV+m`<| zXhg^~gm3Tv4j=TGiP?WxiRp5Xipl2TYtbW(xA=l?1A#wImYJ9X*zs)N#sC299uFV{ z0D%AD1{QDt{CeWk-=O2)!2U1b;~lW^16aQW)~@kZuL##J@m9Y9t6zcTufXCr;KMgy z?gBJ>0Zg3(6KBB02{3gGOdkOghrrkYFmeETzYDzi4C?y`>fQjguYy{afTjhY@dHpl z57f*7RWm^O6i_+=su%-R4T37)0%Ze0@oS*u6{xfwr?wubt_3P;fbvS9vK*)?0V;}s z@&Zsz9;gumYRCrFW`SxmLA4p6nslHh6{tx8s**vKNua7kP(?g$c`Q)&4^SEnltcl= zkw8%}Q0N7ey8%rOK))sK8zfOj1Zh(`c~dr3(*tIn4Q)a*Hf29<%4Taqb2jJjH0L~N z$$iqAC)8Fb-dQT$Q>oBXsnJ)h(_d%!y2iY}*0#SE*gj{~8TK=3pWG7E&x z0TJ^+)Cb_7MNs?-2(<=^UID_Ef#5|Ta31iR1^LX91GJ#1?cJBVpBMM{zyAFBi~WBuA}o+X#4n=CnhjSYqh$goIF7(5;x*HW@Q74X zAdLDg7K?-$tn$inWIX5tO|*P)g$=z(k~UhOq+sH%k*Mp+Rvxq<15V~t^--H{lxV)hqwLVyH(zs5CO9W+nLZ-5{T!Qm*G13 zzNv3`zny)WkxV3}4g=M*3K!rxj-XU36leQ{_o%YyRajs+oynAN?Qp;-E)J{WUen#3Hs?K4pl_c5Tp0{@(2aPawmyT|1?1kT~RF?h66cKAD{=FE8PXw4y9 zZkfv%+)HK$AewMAJSGOG$s8F>sYz*zM_Ew-PkVxF*acK+Jr1%pX?X@8jMAshIUpiR zMU1Y#$6>C8YoiN5%B*Urq^gKmPysR~{4ct#5q09XR0@9=%L26JIBS~vWx22H{H zLougZ9w_26kiK0wrii*TY$%u6ad5AexsAc4&=ek{As5?mI3+g-h|EQpJwHR3*(SQ2 znY-5Jo>}_5nx?hEhRnI-+wtAHG`A)lPFoQ7qlJ{6-ZR{tI}hu-@)NPTU&azLq?>JZ zO@{8ob~o#JZF_Hg?g9C3`!d?}wsvs(`t_2#2?WqPR4@f@n-W&Nk;>cHiJOTyhT#)e zm{&wl+%~u2lHbZcevT)oXpcj5{Bv*kw~M66Pe5`_{+5D8viO#0W>Uy8Vo5_

    yesterday
    foo
    " ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + name = "headers to tag to headers, part 2/2"; + SHIM s( t ); + if( s.headers() != hl ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + StanzaExtensionFactory sef; + sef.registerExtension( new SHIM() ); + // ------- + { + name = "SHIM/SEFactory test"; + Tag* f = new Tag( "message" ); + new Tag( f, "headers", "xmlns", XMLNS_SHIM ); + Message msg( Message::Normal, JID(), "" ); + sef.addExtensions( msg, f ); + const SHIM* se = msg.findExtension( ExtSHIM ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + printf( "SHIM: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.am new file mode 100644 index 00000000..e1eb8fb7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.am @@ -0,0 +1,14 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = simanager_test + +simanager_test_SOURCES = simanager_test.cpp +simanager_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o +simanager_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.in new file mode 100644 index 00000000..516fd22f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/simanager/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = simanager_test$(EXEEXT) +subdir = src/tests/simanager +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_simanager_test_OBJECTS = simanager_test.$(OBJEXT) +simanager_test_OBJECTS = $(am_simanager_test_OBJECTS) +simanager_test_DEPENDENCIES = ../../jid.o ../../tag.o ../../logsink.o \ + ../../prep.o ../../util.o ../../gloox.o ../../iq.o \ + ../../stanza.o ../../error.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(simanager_test_SOURCES) +DIST_SOURCES = $(simanager_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +simanager_test_SOURCES = simanager_test.cpp +simanager_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o + +simanager_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/simanager/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/simanager/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +simanager_test$(EXEEXT): $(simanager_test_OBJECTS) $(simanager_test_DEPENDENCIES) $(EXTRA_simanager_test_DEPENDENCIES) + @rm -f simanager_test$(EXEEXT) + $(CXXLINK) $(simanager_test_OBJECTS) $(simanager_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simanager_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/simanager/simanager_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/simanager/simanager_test.cpp new file mode 100644 index 00000000..a98def18 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/simanager/simanager_test.cpp @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../jid.h" +#include "../../tag.h" +#include "../../iqhandler.h" +#include "../../sihandler.h" +#include "../../siprofilehandler.h" + +#include +#include +#include +#include // [s]print[f] + +const std::string& g_dir = "test.dir"; +const std::string& g_inst = "the instructions"; +const std::string& g_profile = "test-prof"; + +gloox::Tag* t1 = 0; +gloox::Tag* t2 = 0; +const gloox::JID to( "abc@def.gh/ijk" ); + +namespace gloox +{ + + class Disco + { + public: + Disco(); + ~Disco(); + void addFeature( const std::string& feature ); + void removeFeature( const std::string& feature ); + }; + Disco::Disco() {} + Disco::~Disco() {} + void Disco::addFeature( const std::string& /*feature*/ ) {} + void Disco::removeFeature( const std::string& /*feature*/ ) {} + + class ClientBase : public SIHandler, public SIProfileHandler + { + public: + ClientBase(); + ~ClientBase(); + const std::string getID(); + Disco* disco(); + void send( IQ& iq, IqHandler* = 0 , int = 0 ); + void trackID( IqHandler *ih, const std::string& id, int context ); + void registerIqHandler( IqHandler* ih, int exttype ); + void removeIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + virtual void handleSIRequestResult( const JID& from, const JID& to, const std::string& sid, + const SIManager::SI& si ); + virtual void handleSIRequestError( const IQ& iq, const std::string& /*sid*/ ); + virtual void handleSIRequest( const JID& from, const JID& to, const std::string& id, const SIManager::SI& si ); + void setTest( int test ); + bool ok(); + private: + Disco* m_disco; + int m_test; + bool m_ok; + }; + ClientBase::ClientBase() : m_disco( new Disco() ), m_test( 0 ), m_ok( false ) {} + ClientBase::~ClientBase() { delete m_disco; } + const std::string ClientBase::getID() { return "id"; } + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::send( IQ& iq, IqHandler*, int ) + { + Tag* tag = iq.tag(); + switch( m_test ) + { + case 1: + { + Tag* si = tag->findChild( "si", "xmlns", XMLNS_SI ); + if( tag->findAttribute( "to" ) == to.full() && si && *(si->findChild( "file" )) == *t1 + && *(si->findChild( "feature" )) == *t2 && si->findAttribute( "mime-type" ) == "binary/octet-stream" + && si->findAttribute( "profile" ) == g_profile ) + m_ok = true; + break; + } + } + delete tag; + } + void ClientBase::trackID( IqHandler* /*ih*/, const std::string& /*id*/, int /*context*/ ) {} + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + void ClientBase::handleSIRequestResult( const JID& /*from*/, const JID& /*to*/, const std::string& /*sid*/, + const SIManager::SI& /*si*/ ) {} + void ClientBase::handleSIRequestError( const IQ& /*iq*/, const std::string& /*sid*/ ) {} + void ClientBase::handleSIRequest( const JID& /*from*/, const JID& /*to*/, const std::string& /*id*/, + const SIManager::SI& /*si*/ ) {} + void ClientBase::setTest( int test ) { m_test = test; } + bool ClientBase::ok() { bool t = m_ok; m_ok = false; return t; } +} + +#define CLIENTBASE_H__ +#define DISCO_H__ +#include "../../simanager.h" +#include "../../simanager.cpp" +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + t1 = new gloox::Tag( "file", "xmlns", gloox::XMLNS_SI_FT ); + t1->addAttribute( "name", "filename" ); + t1->addAttribute( "size", "1022" ); + + t2 = new gloox::Tag( "feature", "xmlns", gloox::XMLNS_FEATURE_NEG ); + t2->addAttribute( "abc", "def" ); + t2->addAttribute( "ghi", "jkl" ); + + gloox::SIManager* sim = 0; + + gloox::ClientBase* cb = new gloox::ClientBase(); + sim = new gloox::SIManager( cb, true ); + + + // ------- + name = "request si"; + cb->setTest( 1 ); + sim->requestSI( cb, to, g_profile, t1->clone(), t2->clone() ); + if( !cb->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + + + + + delete t1; + delete t2; + delete sim; + delete cb; + + if( fail == 0 ) + { + printf( "SIManager: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "SIManager: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.am new file mode 100644 index 00000000..07237249 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.am @@ -0,0 +1,14 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = simanagersi_test + +simanagersi_test_SOURCES = simanagersi_test.cpp +simanagersi_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../stanzaextensionfactory.o ../../mutex.o +simanagersi_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.in new file mode 100644 index 00000000..07c64753 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/Makefile.in @@ -0,0 +1,523 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = simanagersi_test$(EXEEXT) +subdir = src/tests/simanagersi +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_simanagersi_test_OBJECTS = simanagersi_test.$(OBJEXT) +simanagersi_test_OBJECTS = $(am_simanagersi_test_OBJECTS) +simanagersi_test_DEPENDENCIES = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o ../../gloox.o \ + ../../iq.o ../../stanza.o ../../error.o \ + ../../stanzaextensionfactory.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(simanagersi_test_SOURCES) +DIST_SOURCES = $(simanagersi_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +simanagersi_test_SOURCES = simanagersi_test.cpp +simanagersi_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../stanzaextensionfactory.o ../../mutex.o + +simanagersi_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/simanagersi/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/simanagersi/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +simanagersi_test$(EXEEXT): $(simanagersi_test_OBJECTS) $(simanagersi_test_DEPENDENCIES) $(EXTRA_simanagersi_test_DEPENDENCIES) + @rm -f simanagersi_test$(EXEEXT) + $(CXXLINK) $(simanagersi_test_OBJECTS) $(simanagersi_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simanagersi_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/simanagersi_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/simanagersi_test.cpp new file mode 100644 index 00000000..09434893 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/simanagersi/simanagersi_test.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../base64.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco + { + public: + Disco(); + ~Disco(); + void addFeature( const std::string& feature ); + void removeFeature( const std::string& feature ); + }; + Disco::Disco() {} + Disco::~Disco() {} + void Disco::addFeature( const std::string& /*feature*/ ) {} + void Disco::removeFeature( const std::string& /*feature*/ ) {} + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + Disco* disco(); + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + private: + Disco* m_disco; + JID m_jid; + }; + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define DISCO_H__ +#define SIMANAGER_TEST +#include "../../simanager.h" +#include "../../simanager.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty tag() test"; + SIManager::SI si; + t = si.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "full ctor"; + Tag* t1 = new Tag( "foo" ); + Tag* t2 = new Tag( "bar" ); + SIManager::SI si( t1, t2, "id", "mime", "prof" ); + t = si.tag(); + if( !t || t->name() != "si" || t->xmlns() != XMLNS_SI + || !t->hasAttribute( "id", "id" ) + || !t->hasAttribute( "mime-type", "mime" ) + || !t->hasAttribute( "profile", "prof" ) + || !t->hasChild( "foo" ) + || !t->hasChild( "bar" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "tag ctor"; + Tag* s = new Tag( "si" ); + s->setXmlns( XMLNS_SI ); + s->addAttribute( "id", "id" ); + s->addAttribute( "mime-type", "mime" ); + s->addAttribute( "profile", "prof" ); + Tag* f1 = new Tag( s, "file" ); + f1->setXmlns( XMLNS_SI_FT ); + Tag* f2 = new Tag( s, "feature" ); + f2->setXmlns( XMLNS_FEATURE_NEG ); + + SIManager::SI si( s ); + t = si.tag(); + if( !t || *t != *s ) + { + ++fail; + fprintf( stderr, "test '%s' failed:\n%s\n%s\n", name.c_str(), t->xml().c_str(), s->xml().c_str() ); + } + delete s; + delete t; + t = 0; + } + + StanzaExtensionFactory sef; + sef.registerExtension( new SIManager::SI() ); + // ------- + { + name = "SIManager::SI/SEFactory test"; + Tag* f = new Tag( "iq" ); + new Tag( f, "si", "xmlns", XMLNS_SI ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const SIManager::SI* se = iq.findExtension( ExtSI ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + printf( "SIManager::SI: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.am new file mode 100644 index 00000000..45f33ae3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.am @@ -0,0 +1,19 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -g3 -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = stanzaextensionfactory_test stanzaextensionfactory_perf + +stanzaextensionfactory_test_SOURCES = stanzaextensionfactory_test.cpp +stanzaextensionfactory_test_LDADD = ../../tag.o ../../stanza.o ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../gloox.o ../../util.o ../../sha.o \ + ../../base64.o ../../iq.o ../../mutex.o +stanzaextensionfactory_test_CFLAGS = $(CPPFLAGS) + +stanzaextensionfactory_perf_SOURCES = stanzaextensionfactory_perf.cpp +stanzaextensionfactory_perf_LDADD = ../../tag.o ../../stanza.o ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../gloox.o ../../util.o ../../sha.o \ + ../../base64.o ../../iq.o ../../mutex.o +stanzaextensionfactory_perf_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.in new file mode 100644 index 00000000..050aafd6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/Makefile.in @@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = stanzaextensionfactory_test$(EXEEXT) \ + stanzaextensionfactory_perf$(EXEEXT) +subdir = src/tests/stanzaextensionfactory +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_stanzaextensionfactory_perf_OBJECTS = \ + stanzaextensionfactory_perf.$(OBJEXT) +stanzaextensionfactory_perf_OBJECTS = \ + $(am_stanzaextensionfactory_perf_OBJECTS) +stanzaextensionfactory_perf_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../util.o ../../sha.o ../../base64.o \ + ../../iq.o ../../mutex.o +am_stanzaextensionfactory_test_OBJECTS = \ + stanzaextensionfactory_test.$(OBJEXT) +stanzaextensionfactory_test_OBJECTS = \ + $(am_stanzaextensionfactory_test_OBJECTS) +stanzaextensionfactory_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../util.o ../../sha.o ../../base64.o \ + ../../iq.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(stanzaextensionfactory_perf_SOURCES) \ + $(stanzaextensionfactory_test_SOURCES) +DIST_SOURCES = $(stanzaextensionfactory_perf_SOURCES) \ + $(stanzaextensionfactory_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -g3 -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +stanzaextensionfactory_test_SOURCES = stanzaextensionfactory_test.cpp +stanzaextensionfactory_test_LDADD = ../../tag.o ../../stanza.o ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../gloox.o ../../util.o ../../sha.o \ + ../../base64.o ../../iq.o ../../mutex.o + +stanzaextensionfactory_test_CFLAGS = $(CPPFLAGS) +stanzaextensionfactory_perf_SOURCES = stanzaextensionfactory_perf.cpp +stanzaextensionfactory_perf_LDADD = ../../tag.o ../../stanza.o ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../gloox.o ../../util.o ../../sha.o \ + ../../base64.o ../../iq.o ../../mutex.o + +stanzaextensionfactory_perf_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/stanzaextensionfactory/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/stanzaextensionfactory/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +stanzaextensionfactory_perf$(EXEEXT): $(stanzaextensionfactory_perf_OBJECTS) $(stanzaextensionfactory_perf_DEPENDENCIES) $(EXTRA_stanzaextensionfactory_perf_DEPENDENCIES) + @rm -f stanzaextensionfactory_perf$(EXEEXT) + $(CXXLINK) $(stanzaextensionfactory_perf_OBJECTS) $(stanzaextensionfactory_perf_LDADD) $(LIBS) +stanzaextensionfactory_test$(EXEEXT): $(stanzaextensionfactory_test_OBJECTS) $(stanzaextensionfactory_test_DEPENDENCIES) $(EXTRA_stanzaextensionfactory_test_DEPENDENCIES) + @rm -f stanzaextensionfactory_test$(EXEEXT) + $(CXXLINK) $(stanzaextensionfactory_test_OBJECTS) $(stanzaextensionfactory_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stanzaextensionfactory_perf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stanzaextensionfactory_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_perf.cpp b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_perf.cpp new file mode 100644 index 00000000..ad1e50e3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_perf.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../stanzaextension.h" +#include "../../stanzaextensionfactory.h" +#include "../../iq.h" +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +class SETest : public StanzaExtension +{ + public: + SETest( const Tag* tag ) : StanzaExtension( ExtUser + 1 ), m_tag( const_cast( tag ) ) {} + ~SETest() {} + + virtual const std::string& filterString() const + { + static const std::string filter = "/foo/bar"; + return filter; + } + + virtual StanzaExtension* newInstance( const Tag* tag ) const + { return new SETest( tag ); } + + virtual Tag* tag() const + { return m_tag; } + + virtual StanzaExtension* clone() const + { return new SETest( m_tag ? m_tag->clone() : 0 ); } + + private: + Tag* m_tag; + +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + StanzaExtensionFactory sef; + + // ------- + name = "SEFactory test"; + SETest* set = new SETest( 0 ); // deleted by StanzaExtensionFactory sef; + sef.registerExtension( set ); + Tag* f = new Tag( "foo" ); + Tag* b = new Tag( f, "bar", "attr", "value" ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const StanzaExtension* se = iq.findExtension( ExtUser + 1 ); + if( se == 0 || se == set || se->tag() != b ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + // ------- + name = "remove ext"; + if( !sef.removeExtension( ExtUser + 1 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + if( fail == 0 ) + { + printf( "StanzaExtensionFactory: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "StanzaExtensionFactory: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_test.cpp new file mode 100644 index 00000000..ad1e50e3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/stanzaextensionfactory/stanzaextensionfactory_test.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../stanzaextension.h" +#include "../../stanzaextensionfactory.h" +#include "../../iq.h" +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +class SETest : public StanzaExtension +{ + public: + SETest( const Tag* tag ) : StanzaExtension( ExtUser + 1 ), m_tag( const_cast( tag ) ) {} + ~SETest() {} + + virtual const std::string& filterString() const + { + static const std::string filter = "/foo/bar"; + return filter; + } + + virtual StanzaExtension* newInstance( const Tag* tag ) const + { return new SETest( tag ); } + + virtual Tag* tag() const + { return m_tag; } + + virtual StanzaExtension* clone() const + { return new SETest( m_tag ? m_tag->clone() : 0 ); } + + private: + Tag* m_tag; + +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + StanzaExtensionFactory sef; + + // ------- + name = "SEFactory test"; + SETest* set = new SETest( 0 ); // deleted by StanzaExtensionFactory sef; + sef.registerExtension( set ); + Tag* f = new Tag( "foo" ); + Tag* b = new Tag( f, "bar", "attr", "value" ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const StanzaExtension* se = iq.findExtension( ExtUser + 1 ); + if( se == 0 || se == set || se->tag() != b ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + // ------- + name = "remove ext"; + if( !sef.removeExtension( ExtUser + 1 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + if( fail == 0 ) + { + printf( "StanzaExtensionFactory: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "StanzaExtensionFactory: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.am new file mode 100644 index 00000000..af036f2b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = subscription_test + +subscription_test_SOURCES = subscription_test.cpp +subscription_test_LDADD = ../../tag.o ../../subscription.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o +subscription_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.in new file mode 100644 index 00000000..070aaa81 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/subscription/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = subscription_test$(EXEEXT) +subdir = src/tests/subscription +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_subscription_test_OBJECTS = subscription_test.$(OBJEXT) +subscription_test_OBJECTS = $(am_subscription_test_OBJECTS) +subscription_test_DEPENDENCIES = ../../tag.o ../../subscription.o \ + ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(subscription_test_SOURCES) +DIST_SOURCES = $(subscription_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +subscription_test_SOURCES = subscription_test.cpp +subscription_test_LDADD = ../../tag.o ../../subscription.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o + +subscription_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/subscription/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/subscription/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +subscription_test$(EXEEXT): $(subscription_test_OBJECTS) $(subscription_test_DEPENDENCIES) $(EXTRA_subscription_test_DEPENDENCIES) + @rm -f subscription_test$(EXEEXT) + $(CXXLINK) $(subscription_test_OBJECTS) $(subscription_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subscription_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/subscription/subscription_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/subscription/subscription_test.cpp new file mode 100644 index 00000000..89aea246 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/subscription/subscription_test.cpp @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define GLOOX_TESTS +#define SUBSCRIPTION_TEST +#include "../../tag.h" +#include "../../subscription.h" +#include "../../stanza.h" +#include "../../jid.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *s10n = new Tag( "presence" ); + s10n->addAttribute( "from", "me@example.net/gloox" ); + s10n->addAttribute( "to", "you@example.net/gloox" ); + new Tag( s10n, "status", "the status" ); + Subscription* i = 0; + + // ------- + name = "parse Subscription subscribe"; + s10n->addAttribute( "type", "subscribe" ); + i = new Subscription( s10n ); + if( i->subtype() != Subscription::Subscribe + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Subscription subscribed"; + s10n->addAttribute( "type", "subscribed" ); + i = new Subscription( s10n ); + if( i->subtype() != Subscription::Subscribed + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Subscription unsubscribe"; + s10n->addAttribute( "type", "unsubscribe" ); + i = new Subscription( s10n ); + if( i->subtype() != Subscription::Unsubscribe + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Subscription unsubscribed"; + s10n->addAttribute( "type", "unsubscribed" ); + i = new Subscription( s10n ); + if( i->subtype() != Subscription::Unsubscribed + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + { + name = "new simple Subscription subscribe"; + Subscription s( Subscription::Subscribe, JID( "xyz@example.org/blah" ), "the status", + "the xmllang" ); + s.setFrom( JID( "foo@bar.com" ) ); + Tag* i = s.tag(); + if( i->name() != "presence" || !i->hasAttribute( "type", "subscribe" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Subscription subscribed"; + Subscription s( Subscription::Subscribed, JID( "xyz@example.org/blah" ), "the status", + "the xmllang" ); + s.setFrom( JID( "foo@bar.com" ) ); + Tag* i = s.tag(); + if( i->name() != "presence" || !i->hasAttribute( "type", "subscribed" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Subscription unsubscribe"; + Subscription s( Subscription::Unsubscribe, JID( "xyz@example.org/blah" ), "the status", + "the xmllang" ); + s.setFrom( JID( "foo@bar.com" ) ); + Tag* i = s.tag(); + if( i->name() != "presence" || !i->hasAttribute( "type", "unsubscribe" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Subscription unsubscribed"; + Subscription s( Subscription::Unsubscribed, JID( "xyz@example.org/blah" ), "the status", + "the xmllang" ); + s.setFrom( JID( "foo@bar.com" ) ); + Tag* i = s.tag(); + if( i->name() != "presence" || !i->hasAttribute( "type", "unsubscribed" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + + + + + + + + + + + + + + + + + + + delete s10n; + s10n = 0; + + if( fail == 0 ) + { + printf( "Subscription: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Subscription: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.am new file mode 100644 index 00000000..0b6842d8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = tag_test tag_perf + +tag_test_SOURCES = tag_test.cpp +tag_test_LDADD = ../../tag.o ../../gloox.o ../../util.o +tag_test_CFLAGS = $(CPPFLAGS) + +tag_perf_SOURCES = tag_perf.cpp +tag_perf_LDADD = ../../tag.o ../../gloox.o ../../util.o +tag_perf_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.in new file mode 100644 index 00000000..7362e17d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/tag/Makefile.in @@ -0,0 +1,526 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = tag_test$(EXEEXT) tag_perf$(EXEEXT) +subdir = src/tests/tag +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_tag_perf_OBJECTS = tag_perf.$(OBJEXT) +tag_perf_OBJECTS = $(am_tag_perf_OBJECTS) +tag_perf_DEPENDENCIES = ../../tag.o ../../gloox.o ../../util.o +am_tag_test_OBJECTS = tag_test.$(OBJEXT) +tag_test_OBJECTS = $(am_tag_test_OBJECTS) +tag_test_DEPENDENCIES = ../../tag.o ../../gloox.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(tag_perf_SOURCES) $(tag_test_SOURCES) +DIST_SOURCES = $(tag_perf_SOURCES) $(tag_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +tag_test_SOURCES = tag_test.cpp +tag_test_LDADD = ../../tag.o ../../gloox.o ../../util.o +tag_test_CFLAGS = $(CPPFLAGS) +tag_perf_SOURCES = tag_perf.cpp +tag_perf_LDADD = ../../tag.o ../../gloox.o ../../util.o +tag_perf_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/tag/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/tag/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +tag_perf$(EXEEXT): $(tag_perf_OBJECTS) $(tag_perf_DEPENDENCIES) $(EXTRA_tag_perf_DEPENDENCIES) + @rm -f tag_perf$(EXEEXT) + $(CXXLINK) $(tag_perf_OBJECTS) $(tag_perf_LDADD) $(LIBS) +tag_test$(EXEEXT): $(tag_test_OBJECTS) $(tag_test_DEPENDENCIES) $(EXTRA_tag_test_DEPENDENCIES) + @rm -f tag_test$(EXEEXT) + $(CXXLINK) $(tag_test_OBJECTS) $(tag_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_perf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/tag/tag_perf.cpp b/smack/smack/src/main/cpp/gloox/src/tests/tag/tag_perf.cpp new file mode 100644 index 00000000..5d2e18fd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/tag/tag_perf.cpp @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#ifndef _WIN32 + +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include +#include +#include // [s]print[f] + +#include + +static double divider = 1000000; +static int num = 2500; +static double t; + +static Tag *tag; + +static void printTime ( const char * testName, struct timeval tv1, struct timeval tv2 ) +{ + t = tv2.tv_sec - tv1.tv_sec; + t += ( tv2.tv_usec - tv1.tv_usec ) / divider; + printf( "%s: %.03f seconds (%.00f/s)\n", testName, t, num / t ); +} + +static Tag * newTag ( const std::string& str ) +{ + Tag *aaa = new Tag( str, str ); + Tag *bbb = new Tag( aaa, str, str ); bbb->addAttribute( str, str ); + Tag *ccc = new Tag( aaa, str, str ); ccc->addAttribute( str, str ); + Tag *ddd = new Tag( ccc, str, str ); ddd->addAttribute( str, str ); + Tag *eee = new Tag( ccc, str, str ); eee->addAttribute( str, str ); + Tag *fff = new Tag( aaa, str, str ); fff->addAttribute( str, str ); + Tag *ggg = new Tag( fff, str, str ); ggg->addAttribute( str, str ); + Tag *hhh = new Tag( bbb, str, str ); hhh->addAttribute( str, str ); + Tag *iii = new Tag( bbb, str, str ); iii->addAttribute( str, str ); + Tag *jjj = new Tag( hhh, str, str ); jjj->addAttribute( str, str ); + return aaa; +} + +static const std::string simpleString = "azzaaaggaaaaqs dfqsdadddaads "; +static const std::string escapableString = ">aa< < >"; +static const std::string escapedString = "&<>'"<>'"<><" + ">'"<><>'""; + +static inline Tag * newSimpleTag () { return newTag( simpleString ); } +static inline Tag * newEscapedTag () { return newTag( escapedString ); } +static inline Tag * newEscapableTag () { return newTag( escapableString ); } + + +static const int sz_max = 1000; + +static char values[sz_max]; + +static void randomize( const int size ) +{ + srand( time( 0 ) ); + for (int i = 0; i < size-1; ++i) + { + values[i] = rand() % 96 + 32; + } + values[size-1] = 0; +} + +int main( int /*argc*/, char** /*argv*/ ) +{ + struct timeval tv1; + struct timeval tv2; + + printf( "Testing %d...\n", num ); + + tag = newSimpleTag(); + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + tag->xml(); + } + gettimeofday( &tv2, 0 ); + delete tag; + printTime ("non escaping xml", tv1, tv2); + + + // --------------------------------------------------------------------- + + tag = newEscapableTag(); + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + tag->xml(); + } + gettimeofday( &tv2, 0 ); + delete tag; + printTime ("escaping xml", tv1, tv2); + + + // --------------------------------------------------------------------- + + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + delete newSimpleTag(); + } + gettimeofday( &tv2, 0 ); + printTime ("non relaxing create/delete", tv1, tv2); + + + // ----------------------------------------------------------------------- + + gettimeofday( &tv1, 0 ); + for (int i = 0; i < num; ++i) + { + randomize( 100 ); + delete newTag( values); + } + gettimeofday( &tv2, 0 ); + printTime ("relaxing create/delete (small)", tv1, tv2); + + + // ----------------------------------------------------------------------- + + gettimeofday( &tv1, 0 ); + for (int i = 0; i < num; ++i) + { + randomize( 1000 ); + delete newTag( values ); + } + gettimeofday( &tv2, 0 ); + printTime ("relaxing create/delete (big)", tv1, tv2); + + // ----------------------------------------------------------------------- + + tag = newSimpleTag(); + + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + delete tag->clone(); + } + gettimeofday( &tv2, 0 ); + printTime ("clone/delete", tv1, tv2); + + + + + delete tag; + + return 0; +} +#else +int main( int, char** ) { return 0; } +#endif diff --git a/smack/smack/src/main/cpp/gloox/src/tests/tag/tag_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/tag/tag_test.cpp new file mode 100644 index 00000000..d855bce3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/tag/tag_test.cpp @@ -0,0 +1,478 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../util.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t = new Tag( "toe" ); t->addAttribute( "foo", "bar" ); + Tag *u = new Tag( t, "uni" ); u->addAttribute( "u3", "3u" ); + Tag *v = new Tag( t, "vie" ); v->addAttribute( "v3", "3v" ); + Tag *v2 = new Tag( t, "vie" ); v->addAttribute( "v32", "3v2" ); + Tag *w = new Tag( u, "who" ); w->addAttribute( "w3", "3w" ); + Tag *x = new Tag( v, "xep" ); x->addAttribute( "x3", "3x" ); + Tag *y = new Tag( u, "yps" ); y->addAttribute( "y3", "3y" ); + Tag *z = new Tag( w, "zoo" ); z->addAttribute( "z3", "3z" ); + Tag *c = 0; + Tag *d = 0; + + // ------- + name = "simple ctor"; + if( t->name() != "toe" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "cdata ctor"; + c = new Tag( "cod", "foobar" ); + if( c->name() != "cod" || c->cdata() != "foobar" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + //------- + name = "clone test 1"; + c = z->clone(); + if( *z != *c ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + //------- + name = "clone test 2"; + c = t->clone(); + if( *t != *c ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + //------- + name = "operator== test 1"; + c = new Tag( "name" ); + if( *t == *c ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + //------- + name = "operator== test 2"; + c = new Tag( "test" ); + c->addAttribute( "me", "help" ); + c->addChild( new Tag( "yes" ) ); + if( *t == *c ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + //------- + name = "operator== test 3"; + c = new Tag( "hello" ); + c->addAttribute( "test", "bacd" ); + c->addChild( new Tag( "hello" ) ); + d = new Tag( "hello" ); + d->addAttribute( "test", "bacd" ); + d->addChild( new Tag( "helloo" ) ); + if( *d == *c ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + delete d; + c = 0; + d = 0; + + //------- + name = "operator!= test 1"; + c = new Tag( "hello" ); + c->addAttribute( "test", "bacd" ); + c->addChild( new Tag( "hello" ) ); + d = new Tag( "hello" ); + d->addAttribute( "test", "bacd" ); + d->addChild( new Tag( "hello" ) ); + if( *d != *c ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + delete d; + c = 0; + d = 0; + + //------- + name = "findChildren test"; + TagList l = t->findChildren( "vie" ); + TagList::const_iterator it = l.begin(); + if( l.size() != 2 || (*it) != v || *(++it) != v2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + //------- + name = "util::escape"; + if ( util::escape( "&<>'\"" ) != "&<>'"" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + //------- + name = "xml() 1"; + if( t->xml() != "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "xml() 2"; + t->addAttribute( "test", "bacd" ); + if( t->xml() != "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "hasChild 1"; + if( !t->hasChild( "uni" ) || !t->hasChild( "vie" ) || !u->hasChild( "who" ) || !w->hasChild( "zoo" ) + || !u->hasChild( "yps" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "hasAttribute 1"; + if( !t->hasAttribute( "test" ) || !t->hasAttribute( "test", "bacd" ) + || !t->hasAttribute( "foo" ) || !t->hasAttribute( "foo", "bar" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "findAttribute 1"; + if( t->findAttribute( "test" ) != "bacd" || t->findAttribute( "foo" ) != "bar" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "findChild 1"; + c = t->findChild( "uni" ); + if( c != u ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "findChild 2"; + c = t->findChild( "uni", "u3" ); + if( c != u ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "findChild 3"; + c = t->findChild( "uni", "u3", "3u" ); + if( c != u ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "findChildWithAttrib 1"; + c = t->findChildWithAttrib( "u3" ); + if( c != u ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "findChildWithAttrib 2"; + c = t->findChildWithAttrib( "u3", "3u" ); + if( c != u ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + + //------- + name = "attribute order"; + c = new Tag( "abc" ); + c->addAttribute( "abc", "def" ); + c->addAttribute( "xyz", "123" ); + d = c->clone(); + if( *c != *d ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), d->xml().c_str() ); + } + delete c; + c = 0; + delete d; + d = 0; + + //------- + name = "mixed content 1"; + c = new Tag( "abc" ); + c->addCData( "cdata1" ); + new Tag( c, "fgh" ); + c->addCData( "cdata2" ); + new Tag( c, "xyz" ); + c->addCData( "cdata3" ); + if( c->xml() != "cdata1cdata2cdata3" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), c->xml().c_str() ); + } + delete c; + c = 0; + + //------- + name = "operator bool()"; + Tag tag1( "" ); + if( tag1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), tag1.xml().c_str() ); + } + + //------- + name = "bool operator!()"; + Tag tag2( "abc" ); + if( !tag2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), d->xml().c_str() ); + } + + //------- + { + name = "simple xmlns"; + Tag t( "abc" ); + t.setXmlns( "foo" ); + if( t.xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + } + + //------- + { + name = "deep xmlns"; + Tag t( "abc" ); + Tag* f = new Tag( &t, "def" ); + f = new Tag( f, "ghi" ); + t.setXmlns( "foo" ); + if( t.xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + } + + //------- + { + name = "simple nested xmlns 2"; + Tag t( "abc" ); + t.setXmlns( "foo" ); + Tag* d = new Tag( &t, "def" ); + d->setXmlns( "foobar", "xyz" ); + d->setPrefix( "xyz" ); + if( t.xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + } + + //------- + { + name = "attribute with xmlns"; + Tag t( "abc" ); + t.setXmlns( "foo", "xyz" ); + Tag::Attribute* a = new Tag::Attribute( "foo", "bar", "foo" ); + a->setPrefix( "xyz" ); + t.addAttribute( a ); + if( t.xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + } + + //------- + { + name = "escape attribute value"; + Tag t( "foo", "abc", "&" ); + if( t.xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + } + + //------- + { + name = "remove child 1"; + Tag t( "foo" ); + t.addChild( new Tag( "test", "xmlns", "foo" ) ); + t.addChild( new Tag( "abc", "xmlns", "foobar" ) ); + t.addAttribute( "attr1", "value1" ); + t.addAttribute( "attr2", "value2" ); + t.removeChild( "test" ); + if( t.hasChild( "test" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + + name = "remove child 2"; + t.removeChild( "abc", "foobar" ); + if( t.hasChild( "abc", "xmlns", "foobar" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + + name = "remove attrib 1"; + t.removeAttribute( "attr1" ); + if( t.hasAttribute( "attr1", "value1") ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + + name = "remove attrib 2"; + t.removeAttribute( "attr2", "value2" ); + if( t.hasAttribute( "attr2", "value2") ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t.xml().c_str() ); + } + } + + //------- + { + name = "invalid chars 1"; + Tag t( "foo" ); + bool check = t.addAttribute( "nul", std::string( 1, 0x00 ) ); + if( check || t.hasAttribute( "nul" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s\n", name.c_str(), t.xml().c_str() ); + } + } + + //------- + { + name = "invalid chars 2"; + for( int i = 0; i <= 0xff; ++i ) + { + Tag::Attribute a( "test", std::string( 1, i ) ); + + if( ( i < 0x09 || i == 0x0b || i == 0x0c + || ( i > 0x0d && i < 0x20 ) || i == 0xc0 + || i == 0xc1 || i >= 0xf5 ) && a ) + { + ++fail; + fprintf( stderr, "test '%s' (branch 1) failed (i == %02X)\n", name.c_str(), i ); + } + else if( ( i == 0x09 || i == 0x0a || i == 0x0d + || ( i >= 0x20 && i < 0xc0 ) + || ( i > 0xc1 && i < 0xf5 ) ) && !a ) + { + ++fail; + fprintf( stderr, "test '%s' (branch 2) failed (i == %02X)\n", name.c_str(), i ); + } +// printf( "i: 0x%02X, a: %d, value: %s\n", i, (bool)a, std::string( 1, i ).c_str() ); + } + } + + + + + delete t; + t = 0; + + + + + + + + + + + + + + + + + + + + + if( fail == 0 ) + { + printf( "Tag: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Tag: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.am new file mode 100644 index 00000000..29763e9f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = tlsgnutls_test + +tlsgnutls_test_SOURCES = tlsgnutls_test.cpp +tlsgnutls_test_LDADD = ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../tlsgnutlsbase.o ../../gloox.o ../../mutex.o +tlsgnutls_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.in new file mode 100644 index 00000000..f94f079d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/Makefile.in @@ -0,0 +1,518 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = tlsgnutls_test$(EXEEXT) +subdir = src/tests/tlsgnutls +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_tlsgnutls_test_OBJECTS = tlsgnutls_test.$(OBJEXT) +tlsgnutls_test_OBJECTS = $(am_tlsgnutls_test_OBJECTS) +tlsgnutls_test_DEPENDENCIES = ../../tlsgnutlsclientanon.o \ + ../../tlsgnutlsserveranon.o ../../tlsgnutlsbase.o \ + ../../gloox.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(tlsgnutls_test_SOURCES) +DIST_SOURCES = $(tlsgnutls_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +tlsgnutls_test_SOURCES = tlsgnutls_test.cpp +tlsgnutls_test_LDADD = ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../tlsgnutlsbase.o ../../gloox.o ../../mutex.o +tlsgnutls_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/tlsgnutls/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/tlsgnutls/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +tlsgnutls_test$(EXEEXT): $(tlsgnutls_test_OBJECTS) $(tlsgnutls_test_DEPENDENCIES) $(EXTRA_tlsgnutls_test_DEPENDENCIES) + @rm -f tlsgnutls_test$(EXEEXT) + $(CXXLINK) $(tlsgnutls_test_OBJECTS) $(tlsgnutls_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsgnutls_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/tlsgnutls_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/tlsgnutls_test.cpp new file mode 100644 index 00000000..8abee12f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/tlsgnutls/tlsgnutls_test.cpp @@ -0,0 +1,277 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../tlshandler.h" +#include "../../tlsgnutlsclientanon.h" +#include "../../tlsgnutlsserveranon.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +#include "../../config.h" + +#ifdef HAVE_GNUTLS + +class GnuTLSTest : TLSHandler +{ + public: + GnuTLSTest(); + ~GnuTLSTest(); + virtual void handleEncryptedData( const TLSBase* base, const std::string& data ); + virtual void handleDecryptedData( const TLSBase* base, const std::string& data ); + virtual void handleHandshakeResult( const TLSBase* base, bool success, CertInfo &certinfo ); + + bool handshake(); + std::string send( const std::string& txt ); + private: + void printfCert( CertInfo &certinfo ); + void loop(); + GnuTLSClientAnon *m_client; + GnuTLSServerAnon *m_server; + std::string m_clientToServer; + std::string m_serverToClient; + std::string m_clientDecrypted; + std::string m_serverDecrypted; + bool m_clientHandshake; + bool m_clientHandshakeResult; + bool m_serverHandshake; + bool m_serverHandshakeResult; +}; + +GnuTLSTest::GnuTLSTest() + : m_clientHandshake( false ), m_clientHandshakeResult( false ), + m_serverHandshake( false ), m_serverHandshakeResult( false ) +{ + m_client = new GnuTLSClientAnon( this ); + m_client->init(); + m_server = new GnuTLSServerAnon( this ); + m_server->init(); +} + +GnuTLSTest::~GnuTLSTest() +{ + delete m_client; + delete m_server; +} + +bool GnuTLSTest::handshake() +{ + m_client->handshake(); + while( !m_clientHandshakeResult && !m_serverHandshakeResult ) + loop(); + return m_clientHandshake && m_serverHandshake; +} + +void GnuTLSTest::loop() +{ + while( !m_clientToServer.empty() ) + { +// printf( "we have %d bytes for the server\n", m_clientToServer.length() ); + m_server->decrypt( m_clientToServer ); + m_clientToServer = ""; +// printf( "we have %d bytes left for the server\n", m_clientToServer.length() ); + } + while( !m_serverToClient.empty() ) + { +// printf( "we have %d bytes for the client\n", m_serverToClient.length() ); + m_client->decrypt( m_serverToClient ); + m_serverToClient = ""; +// printf( "we have %d bytes left for the client\n", m_serverToClient.length() ); + } + while( !m_serverDecrypted.empty() ) + { +// printf( "we have %d bytes for the server to encrypt\n", m_serverDecrypted.length() ); + m_server->encrypt( m_serverDecrypted ); + m_serverDecrypted = ""; +// printf( "we have %d bytes left for the server to encrypt\n", m_serverDecrypted.length() ); + } +} + +void GnuTLSTest::handleEncryptedData( const TLSBase* base, const std::string& data ) +{ +// const GnuTLSClientAnon *c = dynamic_cast( base ); +// if( c ) + if( base == m_client ) + { +// printf( "recv encrypted data from client: %d\n", data.length() ); + m_clientToServer += data; +// printf( "m_clientToServer: %d\n", m_clientToServer.length() ); + return; + } + +// const GnuTLSServerAnon *s = dynamic_cast( base ); +// if( s ) + if( base == m_server ) + { +// printf( "recv encrypted data from server: %d\n", data.length() ); + m_serverToClient += data; +// printf( "m_serverToClient: %d\n", m_serverToClient.length() ); + } +} + +void GnuTLSTest::handleDecryptedData( const TLSBase* base, const std::string& data ) +{ +// const GnuTLSClientAnon *c = dynamic_cast( base ); +// if( c ) + if( base == m_client ) + { +// printf( "recv decrypted data from client: %d\n", data.length() ); + m_clientDecrypted += data; +// printf( "m_clientDecrypted: %d\n", m_clientDecrypted.length() ); + return; + } + +// const GnuTLSServerAnon *s = dynamic_cast( base ); +// if( s ) + if( base == m_server ) + { +// printf( "recv decrypted data from server: %d\n", data.length() ); + m_serverDecrypted += data; +// printf( "m_serverDecrypted: %d\n", m_serverDecrypted.length() ); + } +} + +void GnuTLSTest::handleHandshakeResult( const TLSBase* base, bool success, CertInfo& /*certinfo*/ ) +{ +// printfCert( certinfo ); +// const GnuTLSClientAnon *c = dynamic_cast( base ); +// if( c ) + if( base == m_client ) + { +// printf( "recv handshake result from client: %d\n", success ); + m_clientHandshakeResult = true; + m_clientHandshake = success; + return; + } + +// const GnuTLSServerAnon *s = dynamic_cast( base ); +// if( s ) + if( base == m_server ) + { +// printf( "recv handshake result from server: %d\n", success ); + m_serverHandshakeResult = true; + m_serverHandshake = success; + } +} + +void GnuTLSTest::printfCert( CertInfo &certinfo ) +{ + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + certinfo.status, certinfo.issuer.c_str(), certinfo.server.c_str(), + certinfo.protocol.c_str(), certinfo.mac.c_str(), certinfo.cipher.c_str(), + certinfo.compression.c_str() ); +} + +std::string GnuTLSTest::send( const std::string& txt ) +{ +// printf( "sending %d\n", txt.length() ); + + m_client->encrypt( txt ); + while( m_clientDecrypted.empty() ) + loop(); + +// printf( "recv'ed %d\n", m_clientDecrypted.length() ); + const std::string t = m_clientDecrypted; + m_clientDecrypted = ""; + return t; +} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + // ------- + name = "anon client/server handshake test"; + GnuTLSTest *t = new GnuTLSTest(); + if( !t->handshake() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "simple send"; + std::string text( "text" ); + if( t->send( text ) != text ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "subseququent send"; + text = std::string( "txt"/*17000, 'x'*/ ); + if( t->send( text ) != text ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "large send"; + text = std::string( 17000, 'x' ); + if( t->send( text ) != text ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "larger send"; + text = std::string( 170000, 'x' ); + if( t->send( text ) != text ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + delete t; + + + + + + + + + + + + + + if( fail == 0 ) + { + printf( "TLSGnuTLS: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "TLSGnuTLS: %d test(s) failed\n", fail ); + return 1; + } +} +#else +int main( int /*argc*/, char** /*argv*/ ) +{ + printf( "GnuTLS not enabled. Skipped tests.\n" ); +} +#endif // HAVE_GNUTLS + diff --git a/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.am new file mode 100644 index 00000000..04bd66c4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.am @@ -0,0 +1,23 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = uniquemucroomunique_test + +uniquemucroomunique_test_SOURCES = uniquemucroomunique_test.cpp +uniquemucroomunique_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o ../../uniquemucroom.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../instantmucroom.o ../../softwareversion.o \ + ../../atomicrefcount.o +uniquemucroomunique_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.in new file mode 100644 index 00000000..006ce17c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/Makefile.in @@ -0,0 +1,548 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = uniquemucroomunique_test$(EXEEXT) +subdir = src/tests/uniquemucroomunique +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_uniquemucroomunique_test_OBJECTS = \ + uniquemucroomunique_test.$(OBJEXT) +uniquemucroomunique_test_OBJECTS = \ + $(am_uniquemucroomunique_test_OBJECTS) +uniquemucroomunique_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../uniquemucroom.o ../../tlsgnutlsclientanon.o \ + ../../tlsgnutlsserveranon.o ../../mutex.o ../../iq.o \ + ../../presence.o ../../message.o ../../subscription.o \ + ../../util.o ../../sha.o ../../error.o ../../clientbase.o \ + ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o \ + ../../mucmessagesession.o ../../instantmucroom.o \ + ../../softwareversion.o ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(uniquemucroomunique_test_SOURCES) +DIST_SOURCES = $(uniquemucroomunique_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +uniquemucroomunique_test_SOURCES = uniquemucroomunique_test.cpp +uniquemucroomunique_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o ../../uniquemucroom.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../instantmucroom.o ../../softwareversion.o \ + ../../atomicrefcount.o + +uniquemucroomunique_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/uniquemucroomunique/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/uniquemucroomunique/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +uniquemucroomunique_test$(EXEEXT): $(uniquemucroomunique_test_OBJECTS) $(uniquemucroomunique_test_DEPENDENCIES) $(EXTRA_uniquemucroomunique_test_DEPENDENCIES) + @rm -f uniquemucroomunique_test$(EXEEXT) + $(CXXLINK) $(uniquemucroomunique_test_OBJECTS) $(uniquemucroomunique_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniquemucroomunique_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/uniquemucroomunique_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/uniquemucroomunique_test.cpp new file mode 100644 index 00000000..0d76cea3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/uniquemucroomunique/uniquemucroomunique_test.cpp @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define UNIQUEMUCROOM_TEST +#include "../../uniquemucroom.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "create Tag"; + UniqueMUCRoom::Unique uq; + t = uq.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "parse Tag"; + Tag u( "unique" ); + u.setXmlns( XMLNS_MUC_UNIQUE ); + u.setCData( "foo" ); + UniqueMUCRoom::Unique uq( &u ); + t = uq.tag(); + if( !t || t->xml() != "" + "foo" + || uq.name() != "foo" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + name = "UniqueMUCRoom::Unique/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new UniqueMUCRoom::Unique() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "unique", "xmlns", XMLNS_MUC_UNIQUE ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const UniqueMUCRoom::Unique* se = iq.findExtension( ExtMUCUnique ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + printf( "UniqueMUCRoom::Unique: " ); + if( !fail ) + printf( "OK\n" ); + else + fprintf( stderr, "%d test(s) failed\n", fail ); + + return fail; +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.am new file mode 100644 index 00000000..8b761191 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = util_test + +util_test_SOURCES = util_test.cpp +util_test_LDADD = ../../util.o ../../gloox.o +util_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.in new file mode 100644 index 00000000..84c8a7ac --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/util/Makefile.in @@ -0,0 +1,516 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = util_test$(EXEEXT) +subdir = src/tests/util +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_util_test_OBJECTS = util_test.$(OBJEXT) +util_test_OBJECTS = $(am_util_test_OBJECTS) +util_test_DEPENDENCIES = ../../util.o ../../gloox.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(util_test_SOURCES) +DIST_SOURCES = $(util_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +util_test_SOURCES = util_test.cpp +util_test_LDADD = ../../util.o ../../gloox.o +util_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/util/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/util/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +util_test$(EXEEXT): $(util_test_OBJECTS) $(util_test_DEPENDENCIES) $(EXTRA_util_test_DEPENDENCIES) + @rm -f util_test$(EXEEXT) + $(CXXLINK) $(util_test_OBJECTS) $(util_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/util/util_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/util/util_test.cpp new file mode 100644 index 00000000..1cf934b3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/util/util_test.cpp @@ -0,0 +1,282 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../util.h" + +#include +#include // [s]print[f] + +using namespace gloox; + +int main() +{ + enum { A, B, C, Inval }; + static const char* values[] = { "a", "b", "c" }; + enum { D = 1<<0, E = 1<<1, F = 1<<2, Inval2 = 1<<3 }; + static const char* values2[] = { "d", "e", "f" }; + int fail = 0; + + // ------- + std::string name = "string lookup"; + if( util::lookup( "a", values ) != A ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid string lookup"; + if( util::lookup( "", values ) != Inval ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "code lookup"; + if( util::lookup( A, values ) != "a" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid code lookup"; + if( !util::lookup( Inval, values ).empty() ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "out-of-range code lookup"; + if( !util::lookup( 700, values ).empty() ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "string lookup (ORable)"; + if( util::lookup2( "d", values2 ) != D ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid string lookup (ORable)"; + if( util::lookup2( "", values2 ) != Inval2 ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "code lookup (ORable)"; + if( util::lookup2( D, values2 ) != "d" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid code lookup (ORable)"; + if( !util::lookup2( Inval2, values2 ).empty() ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "out-of-range code lookup (ORable)"; + if( !util::lookup2( 700, values2 ).empty() ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "string lookup w/ default"; + if( util::deflookup( "a", values, B ) != A ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid string lookup w/ default"; + if( util::deflookup( "", values, B ) != B ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "code lookup w/ default"; + if( util::deflookup( A, values, "foo" ) != "a" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid code lookup w/ default"; + if( util::deflookup( Inval, values, "foo" ) != "foo" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "out-of-range code lookup w/ default"; + if( util::deflookup( 700, values, "foo" ) != "foo" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "string lookup (ORable) w/ default"; + if( util::deflookup2( "d", values2, A ) != D ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid string lookup (ORable) w/ default"; + if( util::deflookup2( "", values2, E ) != E ) + { + fprintf( stderr, "test '%s' failed: %d\n", name.c_str(), util::deflookup2( "", values2, E ) ); + ++fail; + } + + // ------- + name = "code lookup (ORable) w/ default"; + if( util::deflookup2( D, values2, "foo" ) != "d" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "invalid code lookup (ORable) w/ default"; + if( util::deflookup2( Inval2, values2, "foo" ) != "foo" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "out-of-range code lookup (ORable) w/ default"; + if( util::deflookup2( 700, values2, "foo" ) != "foo" ) + { + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + ++fail; + } + + // ------- + name = "long2string 1"; + int ex = 2147483647; + std::string re = util::long2string( ex ); + if( "2147483647" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + // ------- + name = "long2string 2"; + ex = 0; + re = util::long2string( ex ); + if( "0" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + // ------- + name = "long2string 3"; + ex = -1; + re = util::long2string( ex ); + if( "-1" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + // ------- + name = "long2string 4"; + ex = 1; + re = util::long2string( ex ); + if( "1" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + // ------- + name = "long2string 5"; + ex = -2147483647; + re = util::long2string( ex ); + if( "-2147483647" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + // ------- + name = "long2string 6"; + ex = -10; + re = util::long2string( ex ); + if( "-10" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + // ------- + name = "long2string 7"; + ex = 11; + re = util::long2string( ex ); + if( "11" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + // ------- + name = "int2string"; + ex = 2147483647; + re = util::int2string( ex ); + if( "2147483647" != re ) + { + fprintf( stderr, "test '%s' failed, expected: %d, result: '%s'\n", name.c_str(), ex, re.c_str() ); + ++fail; + } + + + + + if( fail == 0 ) + { + printf( "Util: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Util: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.am new file mode 100644 index 00000000..4ff8e92b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = vcard_test + +vcard_test_SOURCES = vcard_test.cpp +vcard_test_LDADD = ../../vcard.o ../../gloox.o ../../tag.o ../../util.o ../../iq.o \ + ../../stanzaextensionfactory.o ../../base64.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../mutex.o +vcard_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.in new file mode 100644 index 00000000..77548dca --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/vcard/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = vcard_test$(EXEEXT) +subdir = src/tests/vcard +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_vcard_test_OBJECTS = vcard_test.$(OBJEXT) +vcard_test_OBJECTS = $(am_vcard_test_OBJECTS) +vcard_test_DEPENDENCIES = ../../vcard.o ../../gloox.o ../../tag.o \ + ../../util.o ../../iq.o ../../stanzaextensionfactory.o \ + ../../base64.o ../../stanza.o ../../jid.o ../../prep.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(vcard_test_SOURCES) +DIST_SOURCES = $(vcard_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +vcard_test_SOURCES = vcard_test.cpp +vcard_test_LDADD = ../../vcard.o ../../gloox.o ../../tag.o ../../util.o ../../iq.o \ + ../../stanzaextensionfactory.o ../../base64.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../mutex.o + +vcard_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/vcard/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/vcard/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +vcard_test$(EXEEXT): $(vcard_test_OBJECTS) $(vcard_test_DEPENDENCIES) $(EXTRA_vcard_test_DEPENDENCIES) + @rm -f vcard_test$(EXEEXT) + $(CXXLINK) $(vcard_test_OBJECTS) $(vcard_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcard_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/vcard/vcard_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/vcard/vcard_test.cpp new file mode 100644 index 00000000..30c93a6d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/vcard/vcard_test.cpp @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define VCARD_TEST +#include "../../vcard.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty vcard request"; + VCard v; + t = v.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + name = "VCard/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new VCard() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "vCard", "xmlns", XMLNS_VCARD_TEMP ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const VCard* se = iq.findExtension( ExtVCard ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + printf( "VCard: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.am new file mode 100644 index 00000000..68677171 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = vcardupdate_test + +vcardupdate_test_SOURCES = vcardupdate_test.cpp +vcardupdate_test_LDADD = ../../vcardupdate.o ../../tag.o ../../gloox.o ../../util.o +vcardupdate_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.in new file mode 100644 index 00000000..2a9b8306 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = vcardupdate_test$(EXEEXT) +subdir = src/tests/vcardupdate +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_vcardupdate_test_OBJECTS = vcardupdate_test.$(OBJEXT) +vcardupdate_test_OBJECTS = $(am_vcardupdate_test_OBJECTS) +vcardupdate_test_DEPENDENCIES = ../../vcardupdate.o ../../tag.o \ + ../../gloox.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(vcardupdate_test_SOURCES) +DIST_SOURCES = $(vcardupdate_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +vcardupdate_test_SOURCES = vcardupdate_test.cpp +vcardupdate_test_LDADD = ../../vcardupdate.o ../../tag.o ../../gloox.o ../../util.o +vcardupdate_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/vcardupdate/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/vcardupdate/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +vcardupdate_test$(EXEEXT): $(vcardupdate_test_OBJECTS) $(vcardupdate_test_DEPENDENCIES) $(EXTRA_vcardupdate_test_DEPENDENCIES) + @rm -f vcardupdate_test$(EXEEXT) + $(CXXLINK) $(vcardupdate_test_OBJECTS) $(vcardupdate_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcardupdate_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/vcardupdate_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/vcardupdate_test.cpp new file mode 100644 index 00000000..dfbf8467 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/vcardupdate/vcardupdate_test.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../vcardupdate.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + VCardUpdate *d; + Tag *x = new Tag( "x" ); + x->addAttribute( "xmlns", XMLNS_X_VCARD_UPDATE ); + new Tag( x, "photo", "invalidhash" ); + + // ------- + name = "parsing 0 tag"; + d = new VCardUpdate( 0 ); + if( d->tag() != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/getters"; + d = new VCardUpdate( "invalidhash" ); + if( d->hash() != "invalidhash" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/tag()"; + d = new VCardUpdate( "invalidhash" ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_VCARD_UPDATE ) + || !t->hasChild( "photo" ) || t->findChild( "photo" )->cdata() != "invalidhash" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + // ------- + name = "from Tag/getters"; + d = new VCardUpdate( x ); + if( d->hash() != "invalidhash" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "from Tag/tag()"; + d = new VCardUpdate( x ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_VCARD_UPDATE ) + || !t->hasChild( "photo" ) || t->findChild( "photo" )->cdata() != "invalidhash" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + + + + delete x; + x = 0; + + + if( fail == 0 ) + { + printf( "VCardUpdate: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "VCardUpdate: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.am new file mode 100644 index 00000000..8624b9a8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = xpath_test + +xpath_test_SOURCES = xpath_test.cpp +xpath_test_LDADD = ../../tag.o ../../gloox.o ../../util.o +xpath_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.in new file mode 100644 index 00000000..5884df69 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/xpath/Makefile.in @@ -0,0 +1,516 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = xpath_test$(EXEEXT) +subdir = src/tests/xpath +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_xpath_test_OBJECTS = xpath_test.$(OBJEXT) +xpath_test_OBJECTS = $(am_xpath_test_OBJECTS) +xpath_test_DEPENDENCIES = ../../tag.o ../../gloox.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(xpath_test_SOURCES) +DIST_SOURCES = $(xpath_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +xpath_test_SOURCES = xpath_test.cpp +xpath_test_LDADD = ../../tag.o ../../gloox.o ../../util.o +xpath_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/xpath/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/xpath/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +xpath_test$(EXEEXT): $(xpath_test_OBJECTS) $(xpath_test_DEPENDENCIES) $(EXTRA_xpath_test_DEPENDENCIES) + @rm -f xpath_test$(EXEEXT) + $(CXXLINK) $(xpath_test_OBJECTS) $(xpath_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xpath_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/xpath/xpath_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/xpath/xpath_test.cpp new file mode 100644 index 00000000..e248f28d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/xpath/xpath_test.cpp @@ -0,0 +1,954 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int fail = 0; + +void printResult( const std::string& name, ConstTagList& result ) +{ + printf( ">-- %s --------------------------------------\n", name.c_str() ); + int i = 0; + ConstTagList::const_iterator it = result.begin(); + for( ; it != result.end(); ++it, ++i ) + { + printf( "tag #%d: %s\n", i, (*it)->xml().c_str() ); + } + printf( "<-- %s --------------------------------------\n", name.c_str() ); +} + +// void testLexer( const std::string& name ) +// { +// int len = 0; +// XPathToken *t = XPath::parse( name, len ); +// if( !t || t->toString() != name ) +// { +// ++fail; +// fprintf( stderr, "test 'lexer: %s' failed: %s\n", name.c_str(), t->toString().c_str() ); +// } +// printf( "str: %s\n", t->toString().c_str() ); +// printf( "xml: %s\n", t->xml().c_str() ); +// delete t; +// } + +int main( int /*argc*/, char** /*argv*/ ) +{ + std::string name; + Tag *aaa = new Tag( "aaa" ); + Tag *bbb = new Tag( aaa, "bbb" ); bbb->addAttribute( "name", "b1" ); + Tag *ccc = new Tag( aaa, "ccc" ); ccc->setCData( "abc" ); + Tag *ddd = new Tag( ccc, "ddd" ); ddd->setCData( "bcd" ); + Tag *eee = new Tag( ccc, "eee" ); + Tag *fff = new Tag( aaa, "fff" ); + Tag *ggg = new Tag( fff, "ggg" ); + Tag *hhh = new Tag( bbb, "hhh" ); hhh->addAttribute( "name", "h1" ); + Tag *iii = new Tag( bbb, "bbb" ); iii->addAttribute( "name", "b2" ); + Tag *jjj = new Tag( hhh, "bbb" ); jjj->addAttribute( "name", "b3" ); + ConstTagList result; + ConstTagList::const_iterator it; +// XPathToken *t = 0; + +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + /* + * Lexer tests + */ + +// // ------- +// name = "/"; +// t = XPath::parse( name ); +// if( t != 0 ) +// { +// ++fail; +// fprintf( stderr, "test '%s' failed\n", name.c_str() ); +// } +// delete t; + +// // ------- +// name = "//"; +// t = XPath::parse( name ); +// if( t != 0 ) +// { +// ++fail; +// fprintf( stderr, "test 'lexer: %s' failed\n", name.c_str() ); +// } +// delete t; + + // ------- working +// testLexer( "/abc" ); +// testLexer( "/abc/def" ); +// testLexer( "/abc//def" ); +// +// testLexer( "/abc/def[//dgh]" ); +// +// testLexer( "count(//dgh)" ); +// +// testLexer( "/*/abc" ); +// +// testLexer( "count(count(//dgh))" ); +// +// testLexer( "*/abc" ); +// +// testLexer( "*" ); +// +// testLexer( "//*" ); +// +// testLexer( "count(count(//dgh[//abc]))" ); +// +// testLexer( "//c[id>count(//aaa|//bbb)]" ); +// +// testLexer( "a/*/b" ); +// +// testLexer( "acount(//aaa|//bbb*//ccc)]" ); + + + + + +// testLexer( "//aaa|//bbb*(//ccc+//abc)" ); + +// // testLexer( "//a|(//b*//c)+//d" ); + +// testLexer( "//a|//b*//c+//d" ); + +// testLexer( "//c[id>count(//aaa|//bbb*//ccc)+//abc]" ); + + + + + + + + + + + + + // -- simple paths -- + + // ------- + name = "get root: /"; + if( aaa->findTag( "/" ) != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "get deeproot: //"; + if( aaa->findTag( "//" ) != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "get root tag: aaa"; + if( aaa->findTag( "aaa" ) != aaa ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "get root tag: /aaa"; + if( aaa->findTag( "/aaa" ) != aaa ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "simple child: /aaa/bbb"; + if( aaa->findTag( "/aaa/bbb" ) != bbb ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "simple child: /aaa/ccc"; + if( aaa->findTag( "/aaa/ccc" ) != ccc ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "simple child: /aaa/ccc/ddd"; + if( aaa->findTag( "/aaa/ccc/ddd" ) != ddd ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find all: //aaa"; + if( aaa->findTag( "//aaa" ) != aaa ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find all: //eee"; + if( aaa->findTag( "//eee" ) != eee ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find all: //bbb"; + if( aaa->findTag( "//bbb" ) != bbb ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "get root tag from child: /aaa"; + if( bbb->findTag( "/aaa" ) != aaa ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "fail test 1: /abc"; + if( aaa->findTag( "/abc" ) != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "fail test 2: /bbb"; + if( aaa->findTag( "/bbb" ) != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "relative find 1: aaa"; + if( aaa->findTag( "aaa" ) != aaa ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "relative find 2: bbb"; + if( bbb->findTag( "bbb" ) != bbb ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find ConstTagList: //bbb"; + result = aaa->findTagList( "//bbb" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find ConstTagList: //ggg"; + result = aaa->findTagList( "//ggg" ); + it = result.begin(); + if( result.size() != 1 || (*it) != ggg ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find all: //*"; + result = aaa->findTagList( "//*" ); + it = result.begin(); + if( result.size() != 10 || (*it) != aaa || (*++it) != bbb || (*++it) != hhh || + (*++it) != jjj || (*++it) != iii || (*++it) != ccc || (*++it) != ddd || + (*++it) != eee || (*++it) != fff || (*++it) != ggg ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find first level: /*"; + result = aaa->findTagList( "/*" ); + if( result.size() != 1 || result.front() != aaa ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find second level: /*/*"; + result = aaa->findTagList( "/*/*" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != ccc || (*++it) != fff ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find third level: /*/*/*"; + result = aaa->findTagList( "/*/*/*" ); + it = result.begin(); + if( result.size() != 5 || (*it) != hhh || (*++it) != iii || + (*++it) != ddd || (*++it) != eee || (*++it) != ggg ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find fourth level: /*/*/*/*"; + result = aaa->findTagList( "/*/*/*/*" ); + if( result.size() != 1 || result.front() != jjj ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find fith level: /*/*/*/*/*"; + result = aaa->findTagList( "/*/*/*/*/*" ); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find all sub-bbb: /*/*//bbb"; + result = aaa->findTagList( "/*/*//bbb" ); + if( result.size() != 2 || result.front() != jjj || result.back() != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find second level bbb: /*/bbb"; + result = aaa->findTagList( "/*/bbb" ); + if( result.size() != 1 || result.front() != bbb ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find second level via self/noop: /*/./*"; + result = aaa->findTagList( "/*/./*" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != ccc || (*++it) != fff ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find second level via repeated self/noop: /*/././*"; + result = aaa->findTagList( "/*/././*" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != ccc || (*++it) != fff ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "find first level via parent: /*/../*"; + result = aaa->findTagList( "/*/../*" ); + it = result.begin(); + if( result.size() != 1 || (*it) != aaa ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "invalid parent: /../*"; + result = aaa->findTagList( "/../*" ); + it = result.begin(); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "deepsearch && * combined 1: //fff/*"; + result = aaa->findTagList( "//fff/*" ); + it = result.begin(); + if( result.size() != 1 || (*it) != ggg ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "deepsearch && .. combined 2: //ggg/.."; + result = aaa->findTagList( "//ggg/.." ); + it = result.begin(); + if( result.size() != 1 || (*it) != fff ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + +// printf( "--------------------------------------------------------------\n" ); +// // ------- +// name = "select non-leaf elements: //.."; +// result = aaa->findTagList( "//.." ); +// it = result.begin(); +// if( result.size() != 5 || (*it) != aaa || (*++it) != bbb || +// (*++it) != hhh || (*++it) != ccc || (*++it) != fff ) +// { +// ++fail; +// printResult( name, result ); +// fprintf( stderr, "test '%s' failed\n", name.c_str() ); +// } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "deepsearch && .. combined 3: //ggg/../../bbb"; + result = aaa->findTagList( "//ggg/../../bbb" ); + it = result.begin(); + if( result.size() != 1 || (*it) != bbb ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "deepsearch && .. combined 4: //ggg/../..//bbb"; + result = aaa->findTagList( "//ggg/../..//bbb" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "deepsearch && .. && * combined 1: //*/../..//bbb"; + result = aaa->findTagList( "//*/../..//bbb" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "deepsearch && .. && * combined 2: //*/*/..//*"; + result = aaa->findTagList( "//*/*/..//*" ); + it = result.begin(); + if( result.size() != 9 || (*it) != bbb || (*++it) != hhh || (*++it) != jjj || + (*++it) != iii || (*++it) != ccc || (*++it) != ddd || (*++it) != eee || + (*++it) != fff || (*++it) != ggg ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "deepsearch: //bbb/hhh/bbb"; + result = aaa->findTagList( "//bbb/hhh/bbb" ); + it = result.begin(); + if( result.size() != 1 || (*it) != jjj ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // -- ~simple paths -- + + + // -- operators -- + + // ---- union ---- + + // ------- + name = "union 1: //bbb|/aaa"; + result = aaa->findTagList( "//bbb|/aaa" ); + it = result.begin(); + if( result.size() != 4 || (*it) != bbb || (*++it) != jjj || (*++it) != iii || (*++it) != aaa ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "union 1: //bbb|//bbb"; + result = aaa->findTagList( "//bbb|//bbb" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "union 2: /aaa|/aaa"; + result = aaa->findTagList( "/aaa|/aaa" ); + it = result.begin(); + if( result.size() != 1 || (*it) != aaa ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "union 3: /aaa|/aaa|//bbb"; + result = aaa->findTagList( "/aaa|/aaa|//bbb" ); + it = result.begin(); + if( result.size() != 4 || (*it) != aaa || (*++it) != bbb || (*++it) != jjj || (*++it) != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + + // ------- + name = "union + predicates: //bbb[@name='b1']|//hhh[@name='h1']"; + result = aaa->findTagList( "//bbb[@name='b1']|//hhh[@name='h1']" ); + it = result.begin(); + if( result.size() != 2 || (*it) != bbb || (*++it) != hhh ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "empty union 1: /cde|/def"; + result = aaa->findTagList( "/cde|/def" ); + it = result.begin(); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + + // ---- ~union ---- + + // -- ~operators -- + + + + // -- predicates -- + + // ------- + name = "filter 1: //bbb[1]"; + result = aaa->findTagList( "//bbb[1]" ); + it = result.begin(); + if( result.size() != 1 || (*it) != bbb ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "filter 2: //bbb[2]"; + result = aaa->findTagList( "//bbb[2]" ); + it = result.begin(); + if( result.size() != 1 || (*it) != jjj ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "filter 3: //bbb[3]"; + result = aaa->findTagList( "//bbb[3]" ); + it = result.begin(); + if( result.size() != 1 || (*it) != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "invalid filter 4: //bbb[4]"; + result = aaa->findTagList( "//bbb[4]" ); + it = result.begin(); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "filter 5: /aaa/bbb[1]"; + result = aaa->findTagList( "/aaa/bbb[1]" ); + it = result.begin(); + if( result.size() != 1 || (*it) != bbb ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "filter 5: /aaa[1]"; + result = aaa->findTagList( "/aaa[1]" ); + it = result.begin(); + if( result.size() != 1 || (*it) != aaa ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "invalid filter 6: /aaa[2]"; + result = aaa->findTagList( "/aaa[2]" ); + it = result.begin(); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "invalid filter 7: [2]"; + result = aaa->findTagList( "[2]" ); + it = result.begin(); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "deepsearch + predicate 1: //bbb[@name]"; + result = aaa->findTagList( "//bbb[@name]" ); + it = result.begin(); + if( result.size() != 3 || (*it) != bbb || (*++it) != jjj || (*++it) != iii ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "deepsearch + predicate 2: //bbb[@xyz]"; + result = aaa->findTagList( "//bbb[@xyz]" ); + it = result.begin(); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + // ------- + name = "deepsearch + predicate + literal 1: //bbb[@name='b1']"; + result = aaa->findTagList( "//bbb[@name='b1']" ); + it = result.begin(); + if( result.size() != 1 || (*it) != bbb ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "deepsearch + predicate + literal 2: //bbb[@name='test@test2']"; + bbb->addAttribute( "blah", "test@test2" ); + result = aaa->findTagList( "//bbb[@blah='test@test2']" ); + it = result.begin(); + if( result.size() != 1 || (*it) != bbb ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + name = "deepsearch + predicate + literal + child: //bbb[@name='b1']/hhh"; + bbb->addAttribute( "blah", "test@test2" ); + result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh" ); + it = result.begin(); + if( result.size() != 1 || (*it) != hhh ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + name = "deepsearch + predicate + literal + child + predicate 1: //bbb[@name='b1']/hhh[@name]"; + bbb->addAttribute( "blah", "test@test2" ); + result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name]" ); + it = result.begin(); + if( result.size() != 1 || (*it) != hhh ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + name = "deepsearch + predicate + literal + child + predicate 2: //bbb[@name='b1']/hhh[@name1]"; + bbb->addAttribute( "blah", "test@test2" ); + result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name1]" ); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + name = "deepsearch + predicate + literal + child + predicate + literal: //bbb[@name='b1']/hhh[@name='h1']"; + bbb->addAttribute( "blah", "test@test2" ); + result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name='h1']" ); + it = result.begin(); + if( result.size() != 1 || (*it) != hhh ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + name = "deepsearch + predicate + literal + child + predicate + literal: //bbb[@name='b1']/hhh[@name='h2']"; + bbb->addAttribute( "blah", "test@test2" ); + result = aaa->findTagList( "//bbb[@blah='test@test2']/hhh[@name='h2']" ); + if( result.size() != 0 ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + +// // ------- +// name = "deepsearch + predicate + path 1: //bbb[hhh]"; +// result = aaa->findTagList( "//bbb[hhh]" ); +// it = result.begin(); +// if( result.size() != 1 || (*it) != bbb ) +// { +// ++fail; +// printResult( name, result ); +// fprintf( stderr, "test '%s' failed\n", name.c_str() ); +// } +// printf( "--------------------------------------------------------------\n" ); + +// // ------- +// name = "filter 1: //bbb[1+2]"; +// result = aaa->findTagList( "//bbb[1+2]" ); +// it = result.begin(); +// if( result.size() != 1 || (*it) != iii ) +// { +// ++fail; +// printResult( name, result ); +// fprintf( stderr, "test '%s' failed\n", name.c_str() ); +// } +// printf( "--------------------------------------------------------------\n" ); + + + + + // -- predicates -- + + + name = "cdata: //ccc"; + if( aaa->findCData( "//ccc" ) != "abc" ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + name = "cdata: //ddd"; + if( aaa->findCData( "//ddd" ) != "bcd" ) + { + ++fail; + printResult( name, result ); + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } +// printf( "--------------------------------------------------------------\n" ); + + + + + + + + + + + + + +// Tag *c2 = new Tag( ddd, "ccc" ); +// Tag *c3 = new Tag( c2, "ccc" ); +// Tag *c4 = new Tag( eee, "ccc" ); +// Tag *c5 = new Tag( c4, "ccc" ); + +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// +// + + + + + + + + + + + delete aaa; + + if( fail == 0 ) + { + printf( "XPath: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "XPath: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.am new file mode 100644 index 00000000..bee12287 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = zlib_test zlib_perf + +zlib_test_SOURCES = zlib_test.cpp +zlib_test_LDADD = ../../compressionzlib.o ../../mutex.o +zlib_test_CFLAGS = $(CPPFLAGS) + +zlib_perf_SOURCES = zlib_perf.cpp +zlib_perf_LDADD = ../../compressionzlib.o ../../mutex.o +zlib_perf_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.in new file mode 100644 index 00000000..e92bee71 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/zlib/Makefile.in @@ -0,0 +1,526 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = zlib_test$(EXEEXT) zlib_perf$(EXEEXT) +subdir = src/tests/zlib +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_zlib_perf_OBJECTS = zlib_perf.$(OBJEXT) +zlib_perf_OBJECTS = $(am_zlib_perf_OBJECTS) +zlib_perf_DEPENDENCIES = ../../compressionzlib.o ../../mutex.o +am_zlib_test_OBJECTS = zlib_test.$(OBJEXT) +zlib_test_OBJECTS = $(am_zlib_test_OBJECTS) +zlib_test_DEPENDENCIES = ../../compressionzlib.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(zlib_perf_SOURCES) $(zlib_test_SOURCES) +DIST_SOURCES = $(zlib_perf_SOURCES) $(zlib_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +zlib_test_SOURCES = zlib_test.cpp +zlib_test_LDADD = ../../compressionzlib.o ../../mutex.o +zlib_test_CFLAGS = $(CPPFLAGS) +zlib_perf_SOURCES = zlib_perf.cpp +zlib_perf_LDADD = ../../compressionzlib.o ../../mutex.o +zlib_perf_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/zlib/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/zlib/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +zlib_perf$(EXEEXT): $(zlib_perf_OBJECTS) $(zlib_perf_DEPENDENCIES) $(EXTRA_zlib_perf_DEPENDENCIES) + @rm -f zlib_perf$(EXEEXT) + $(CXXLINK) $(zlib_perf_OBJECTS) $(zlib_perf_LDADD) $(LIBS) +zlib_test$(EXEEXT): $(zlib_test_OBJECTS) $(zlib_test_DEPENDENCIES) $(EXTRA_zlib_test_DEPENDENCIES) + @rm -f zlib_test$(EXEEXT) + $(CXXLINK) $(zlib_test_OBJECTS) $(zlib_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlib_perf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zlib_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/zlib/zlib_perf.cpp b/smack/smack/src/main/cpp/gloox/src/tests/zlib/zlib_perf.cpp new file mode 100644 index 00000000..6669f380 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/zlib/zlib_perf.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#ifndef _WIN32 + +#include "../../compressionzlib.h" +#include "../../compressiondatahandler.h" +using namespace gloox; + +#include "../../config.h" + +#include +#include +#include +#include +#include +#include // [s]print[f] + +#ifdef HAVE_ZLIB + +class ZlibTest : public CompressionDataHandler +{ + public: + ZlibTest() : m_zlib( this ) {} + ~ZlibTest() {} + void handleCompressedData( const std::string& data ) + { m_zlib.decompress( data ); } + void handleDecompressedData( const std::string& data ) + { m_decompressed += data; } + const std::string data() + { std::string ret = m_decompressed; m_decompressed = ""; return ret; } + void compress( const std::string& data ) + { m_zlib.compress( data ); } + private: + CompressionZlib m_zlib; + std::string m_decompressed; +}; + +static const double divider = 1000000; +static const int num = 250; +static double t; + +static void printTime ( const char * testName, struct timeval tv1, struct timeval tv2 ) +{ + t = tv2.tv_sec - tv1.tv_sec; + t += ( tv2.tv_usec - tv1.tv_usec ) / divider; + printf( "%s: %.03f seconds (%.00f/s)\n", testName, t, num / t ); +} + +static const int sz_max = 1000000; + +static char values[sz_max+1]; + +static void randomize( const int size ) +{ + if( size > sz_max ) + { + printf( "error: randomize size bigger than buffer size\n" ); + exit( 1 ); + } + srand( time(NULL) ); + for (int i = 0; i < size; ++i) + { + values[i] = rand() % 96 + 32; + } + values[size] = 0; +} + +int main( int, char** ) +{ +// int fail = 0; + std::string name; + ZlibTest t; + + struct timeval tv1; + struct timeval tv2; + + printf("testing %d run of 10^{4,5,6}...\n", num); + + // ------- + randomize( 10000 ); + std::string s (values); + gettimeofday( &tv1, 0 ); + for (int x=0; x + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../compressionzlib.h" +#include "../../compressiondatahandler.h" +using namespace gloox; + +#include "../../config.h" + +#include +#include +#include +#include // [s]print[f] + +#ifdef HAVE_ZLIB + +class ZlibTest : public CompressionDataHandler +{ + public: + ZlibTest() : m_zlib( this ) { m_zlib.init(); } + ~ZlibTest() {} + virtual void handleCompressedData( const std::string& data ); + virtual void handleDecompressedData( const std::string& data ); + const std::string data() { std::string ret = m_decompressed; m_decompressed = ""; return ret; } + void compress( const std::string& data ); + private: + CompressionZlib m_zlib; + std::string m_decompressed; +}; + +void ZlibTest::compress( const std::string& data ) +{ + m_zlib.compress( data ); +} + +void ZlibTest::handleCompressedData( const std::string& data ) +{ + m_zlib.decompress( data ); +} + +void ZlibTest::handleDecompressedData( const std::string& data ) +{ + m_decompressed += data; +} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + ZlibTest t; + + // ------- + name = "short test"; + const std::string a( 10, 'a' ); + t.compress( a ); + if( t.data() != a ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "longer test"; + const std::string b( 1000, 'b' ); + t.compress( b ); + if( t.data() != b ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "long test"; + const std::string c( 100000, 'b' ); + t.compress( c ); + if( t.data() != c ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "large test"; + const std::string d( 10000000, 'b' ); + t.compress( d ); + if( t.data() != d ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "concat test"; + t.compress( a ); + t.compress( b ); + t.compress( c ); + t.compress( d ); + if( t.data() != a + b + c + d ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + + + + + + if( fail == 0 ) + { + printf( "CompressionZlib: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "CompressionZlib: %d test(s) failed\n", fail ); + return 1; + } + +} + +#else +int main( int /*argc*/, char** /*argv*/ ) +{ + printf( "Zlib not available. Skipped tests.\n" ); +} +#endif // HAVE_ZLIB diff --git a/smack/smack/src/main/cpp/gloox/src/tlsbase.h b/smack/smack/src/main/cpp/gloox/src/tlsbase.h new file mode 100644 index 00000000..567ce8b2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsbase.h @@ -0,0 +1,161 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSBASE_H__ +#define TLSBASE_H__ + +#include "gloox.h" +#include "mutex.h" +#include "tlshandler.h" + +namespace gloox +{ + + /** + * @brief An abstract base class for TLS implementations. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API TLSBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + * @param server The server to use in certificate verification. + */ + TLSBase( TLSHandler* th, const std::string server ) + : m_handler( th ), m_server( server ), m_secure( false ), m_valid( false ), m_initLib( true ) + {} + + /** + * Virtual destructor. + */ + virtual ~TLSBase() {} + + /** + * Initializes the TLS module. This function must be called (and execute successfully) + * before the module can be used. + * @param clientKey The absolute path to the user's private key in PEM format. + * @param clientCerts A path to a certificate bundle in PEM format. + * @param cacerts A list of absolute paths to CA root certificate files in PEM format. + * @return @b False if initialization failed, @b true otherwise. + * @since 1.0 + */ + virtual bool init( const std::string& clientKey = EmptyString, + const std::string& clientCerts = EmptyString, + const StringList& cacerts = StringList() ) = 0; + + /** + * Enables/disables initialization of the underlying TLS library. By default, + * initialization is performed. You may want to switch it off if the TLS library + * is used elsewhere in your application as well and you have no control over the + * initialization. + * @param init Whether or not to intialize the underlying TLS library. + */ + void setInitLib( bool init ) { m_initLib = init; } + + /** + * Use this function to feed unencrypted data to the encryption implementation. + * The encrypted result will be pushed to the TLSHandler's handleEncryptedData() function. + * @param data The data to encrypt. + * @return Whether or not the data was used successfully. + */ + virtual bool encrypt( const std::string& data ) = 0; + + /** + * Use this function to feed encrypted data or received handshake data to the + * encryption implementation. Handshake data will be eaten, unencrypted data + * will be pushed to the TLSHandler's handleDecryptedData() function. + * @param data The data to decrypt. + * @return The number of bytes used from the input. + */ + virtual int decrypt( const std::string& data ) = 0; + + /** + * This function performs internal cleanup and will be called after a failed handshake attempt. + */ + virtual void cleanup() = 0; + + /** + * This functiopn performs the TLS handshake. Handshake data from the server side should be + * fed in using decrypt(). Handshake data that is to be sent to the other side is pushed through + * TLSBase's handleEncryptedData(). + * @return @b True if the handshake was successful or if more input is needed, @b false if the + * handshake failed. + */ + virtual bool handshake() = 0; + + /** + * Returns the state of the encryption. + * @return The state of the encryption. + */ + virtual bool isSecure() const { return m_secure; } + + /** + * This function indicates whether the underlying TLS implementation supports channel binding (used in e.g. SASL SCRAM-SHA-1-PLUS). + * @return @b True if channel binding is supported, @b false otherwise. + */ + virtual bool hasChannelBinding() const { return false; } + + /** + * Returns the channel binding data for the established connection. + * @return The channel binding data, if any, or the empty string. + */ + virtual const std::string channelBinding() const { return EmptyString; } + + /** + * Use this function to set a number of trusted root CA certificates which shall be + * used to verify a servers certificate. + * @param cacerts A list of absolute paths to CA root certificate files in PEM format. + */ + virtual void setCACerts( const StringList& cacerts ) = 0; + + /** + * This function is used to retrieve certificate and connection info of a encrypted connection. + * @return Certificate information. + */ + virtual const CertInfo& fetchTLSInfo() const { return m_certInfo; } + + /** + * Use this function to set the user's certificate and private key. The certificate will + * be presented to the server upon request and can be used for SASL EXTERNAL authentication. + * The user's certificate file should be a bundle of more than one certificate in PEM format. + * The first one in the file should be the user's certificate, each cert following that one + * should have signed the previous one. + * @note These certificates are not necessarily the same as those used to verify the server's + * certificate. + * @param clientKey The absolute path to the user's private key in PEM format. + * @param clientCerts A path to a certificate bundle in PEM format. + */ + virtual void setClientCert( const std::string& clientKey, const std::string& clientCerts ) = 0; + + protected: + TLSHandler* m_handler; + StringList m_cacerts; + std::string m_clientKey; + std::string m_clientCerts; + std::string m_server; + CertInfo m_certInfo; + util::Mutex m_mutex; + bool m_secure; + bool m_valid; + bool m_initLib; + + }; + +} + +#endif // TLSBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsdefault.cpp b/smack/smack/src/main/cpp/gloox/src/tlsdefault.cpp new file mode 100644 index 00000000..c9999e36 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsdefault.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "tlsdefault.h" + +#include "tlshandler.h" + +#include "config.h" + +#if defined( HAVE_GNUTLS ) +# define HAVE_TLS +# include "tlsgnutlsclient.h" +# include "tlsgnutlsclientanon.h" +# include "tlsgnutlsserveranon.h" +#elif defined( HAVE_OPENSSL ) +# define HAVE_TLS +# include "tlsopensslclient.h" +#ifndef __SYMBIAN32__ +# include "tlsopensslserver.h" +#endif +#elif defined( HAVE_WINTLS ) +# define HAVE_TLS +# include "tlsschannel.h" +#endif + +namespace gloox +{ + + TLSDefault::TLSDefault( TLSHandler* th, const std::string server, Type type ) + : TLSBase( th, server ), m_impl( 0 ) + { + switch( type ) + { + case VerifyingClient: +#ifdef HAVE_GNUTLS + m_impl = new GnuTLSClient( th, server ); +#elif defined( HAVE_OPENSSL ) + m_impl = new OpenSSLClient( th, server ); +#elif defined( HAVE_WINTLS ) + m_impl = new SChannel( th, server ); +#endif + break; + case AnonymousClient: +#ifdef HAVE_GNUTLS + m_impl = new GnuTLSClientAnon( th ); +#endif + break; + case AnonymousServer: +#ifdef HAVE_GNUTLS + m_impl = new GnuTLSServerAnon( th ); +#endif + break; + case VerifyingServer: +#ifdef HAVE_OPENSSL +#ifndef __SYMBIAN32__ + m_impl = new OpenSSLServer( th ); +#endif +#endif + break; + default: + break; + } + } + + TLSDefault::~TLSDefault() + { + delete m_impl; + } + + bool TLSDefault::init( const std::string& clientKey, + const std::string& clientCerts, + const StringList& cacerts ) + { + return m_impl ? m_impl->init( clientKey, clientCerts, + cacerts ) : false; + } + + int TLSDefault::types() + { + int types = 0; +#ifdef HAVE_GNUTLS + types |= VerifyingClient; + types |= AnonymousClient; + types |= AnonymousServer; +#elif defined( HAVE_OPENSSL ) + types |= VerifyingClient; + types |= VerifyingServer; +#elif defined( HAVE_WINTLS ) + types |= VerifyingClient; +#endif + return types; + } + + bool TLSDefault::encrypt( const std::string& data ) + { + return m_impl ? m_impl->encrypt( data ) : false; + } + + int TLSDefault::decrypt( const std::string& data ) + { + return m_impl ? m_impl->decrypt( data ) : 0; + } + + void TLSDefault::cleanup() + { + if( m_impl ) + m_impl->cleanup(); + } + + bool TLSDefault::handshake() + { + return m_impl ? m_impl->handshake() : false; + } + + bool TLSDefault::isSecure() const + { + return m_impl ? m_impl->isSecure() : false; + } + + bool TLSDefault::hasChannelBinding() const + { + return m_impl ? m_impl->hasChannelBinding() : false; + } + + const std::string TLSDefault::channelBinding() const + { + return m_impl ? m_impl->channelBinding() : EmptyString; + } + + void TLSDefault::setCACerts( const StringList& cacerts ) + { + if( m_impl ) + m_impl->setCACerts( cacerts ); + } + + const CertInfo& TLSDefault::fetchTLSInfo() const + { + return m_impl ? m_impl->fetchTLSInfo() : m_certInfo; + } + + void TLSDefault::setClientCert( const std::string& clientKey, const std::string& clientCerts ) + { + if( m_impl ) + m_impl->setClientCert( clientKey, clientCerts ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tlsdefault.h b/smack/smack/src/main/cpp/gloox/src/tlsdefault.h new file mode 100644 index 00000000..5f9d17bb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsdefault.h @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + + +#ifndef TLSDEFAULT_H__ +#define TLSDEFAULT_H__ + +#include "tlsbase.h" + +namespace gloox +{ + + class TLSHandler; + + /** + * @brief This is an abstraction of the various TLS backends. + * + * You should use an instance of this class should you whish to use TLS encryption. + * TLS support for the main XMPP connection is managed by Client/ClientBase directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API TLSDefault : public TLSBase + { + public: + + /** + * Supported TLS types. + */ + enum Type + { + VerifyingClient = 1, /**< TLS client, verifying, available for all + * TLS implementations. */ + AnonymousClient = 2, /**< Anonymous TLS client (non-verifying), available with + * GnuTLS. */ + VerifyingServer = 4, /**< TLS server, verifying, currently not available. */ + AnonymousServer = 8 /**< Anonymous TLS server (non-verifying), available with + * GnuTLS. */ + }; + + /** + * Constructs a new TLS wrapper. + * @param th The TLSHandler to handle TLS-related events. + * @param server The server to use in certificate verification. + * @param type What you want to use this TLS object for. + */ + TLSDefault( TLSHandler* th, const std::string server, Type type = VerifyingClient ); + + /** + * Virtual Destructor. + */ + virtual ~TLSDefault(); + + // reimplemented from TLSBase + virtual bool init( const std::string& clientKey = EmptyString, + const std::string& clientCerts = EmptyString, + const StringList& cacerts = StringList() ); + + // reimplemented from TLSBase + virtual bool encrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual int decrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual void cleanup(); + + // reimplemented from TLSBase + virtual bool handshake(); + + // reimplemented from TLSBase + virtual bool isSecure() const; + + // reimplemented from TLSBase + virtual bool hasChannelBinding() const; + + // reimplemented from TLSBase + virtual const std::string channelBinding() const; + + // reimplemented from TLSBase + virtual void setCACerts( const StringList& cacerts ); + + // reimplemented from TLSBase + virtual const CertInfo& fetchTLSInfo() const; + + // reimplemented from TLSBase + virtual void setClientCert( const std::string& clientKey, const std::string& clientCerts ); + + /** + * Returns an ORed list of supported TLS types. + * @return ORed TLSDefault::type members. + */ + static int types(); + + private: + TLSBase* m_impl; + + }; +} + +#endif // TLSDEFAULT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.cpp b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.cpp new file mode 100644 index 00000000..289fb0a3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.cpp @@ -0,0 +1,202 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "tlsgnutlsbase.h" + +#ifdef HAVE_GNUTLS + +#include +#include +#include +#include + +namespace gloox +{ + + GnuTLSBase::GnuTLSBase( TLSHandler* th, const std::string& server ) + : TLSBase( th, server ), m_session( new gnutls_session_t ), m_buf( 0 ), m_bufsize( 17000 ) + { + m_buf = (char*)calloc( m_bufsize + 1, sizeof( char ) ); + } + + GnuTLSBase::~GnuTLSBase() + { + free( m_buf ); + m_buf = 0; + cleanup(); + delete m_session; +// FIXME: It segfaults if more then one account uses +// encryption at same time, so we comment it for now. +// Do we need to deinit at all? +// gnutls_global_deinit(); + } + + bool GnuTLSBase::encrypt( const std::string& data ) + { + if( !m_secure ) + { + handshake(); + return true; + } + + ssize_t ret = 0; + std::string::size_type sum = 0; + do + { + ret = gnutls_record_send( *m_session, data.c_str() + sum, data.length() - sum ); + sum += ret; + } + while( ( ret == GNUTLS_E_AGAIN ) || ( ret == GNUTLS_E_INTERRUPTED ) || sum < data.length() ); + return true; + } + + int GnuTLSBase::decrypt( const std::string& data ) + { + m_recvBuffer += data; + + if( !m_secure ) + { + handshake(); + return static_cast( data.length() ); + } + + int sum = 0; + int ret = 0; + do + { + ret = static_cast( gnutls_record_recv( *m_session, m_buf, m_bufsize ) ); + + if( ret > 0 && m_handler ) + { + m_handler->handleDecryptedData( this, std::string( m_buf, ret ) ); + sum += ret; + } + } + while( ret > 0 ); + + return sum; + } + + void GnuTLSBase::cleanup() + { + if( !m_mutex.trylock() ) + return; + + TLSHandler* handler = m_handler; + m_handler = 0; + gnutls_bye( *m_session, GNUTLS_SHUT_RDWR ); + gnutls_db_remove_session( *m_session ); + gnutls_credentials_clear( *m_session ); + if( m_session ) + gnutls_deinit( *m_session ); + + delete m_session; + + m_secure = false; + m_valid = false; + m_session = 0; + m_session = new gnutls_session_t; + m_handler = handler; + + m_mutex.unlock(); + } + + bool GnuTLSBase::handshake() + { + if( !m_handler ) + return false; + + int ret = gnutls_handshake( *m_session ); + if( ret < 0 && gnutls_error_is_fatal( ret ) ) + { + gnutls_perror( ret ); + gnutls_db_remove_session( *m_session ); + gnutls_deinit( *m_session ); + m_valid = false; + + m_handler->handleHandshakeResult( this, false, m_certInfo ); + return false; + } + else if( ret == GNUTLS_E_AGAIN ) + { + return true; + } + + m_secure = true; + + getCertInfo(); + + m_handler->handleHandshakeResult( this, true, m_certInfo ); + return true; + } + + bool GnuTLSBase::hasChannelBinding() const + { +#ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING + return true; +#else + return false; +#endif + } + + const std::string GnuTLSBase::channelBinding() const + { +#ifdef HAVE_GNUTLS_SESSION_CHANNEL_BINDING + gnutls_datum_t cb; + int rc; + rc = gnutls_session_channel_binding( *m_session, GNUTLS_CB_TLS_UNIQUE, &cb ); + if( !rc ) + return std::string( (char*)cb.data, cb.size ); + else +#endif + return EmptyString; + } + + ssize_t GnuTLSBase::pullFunc( void* data, size_t len ) + { + ssize_t cpy = ( len > m_recvBuffer.length() ) ? ( m_recvBuffer.length() ) : ( len ); + if( cpy > 0 ) + { + memcpy( data, (const void*)m_recvBuffer.c_str(), cpy ); + m_recvBuffer.erase( 0, cpy ); + return cpy; + } + else + { + errno = EAGAIN; + return GNUTLS_E_AGAIN; + } + } + + ssize_t GnuTLSBase::pullFunc( gnutls_transport_ptr_t ptr, void* data, size_t len ) + { + return static_cast( ptr )->pullFunc( data, len ); + } + + ssize_t GnuTLSBase::pushFunc( const void* data, size_t len ) + { + if( m_handler ) + m_handler->handleEncryptedData( this, std::string( (const char*)data, len ) ); + + return len; + } + + ssize_t GnuTLSBase::pushFunc( gnutls_transport_ptr_t ptr, const void* data, size_t len ) + { + return static_cast( ptr )->pushFunc( data, len ); + } + +} + +#endif // HAVE_GNUTLS diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.h b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.h new file mode 100644 index 00000000..88dc420a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsbase.h @@ -0,0 +1,98 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSGNUTLSBASE_H__ +#define TLSGNUTLSBASE_H__ + +#include "tlsbase.h" + +#include "config.h" + +#ifdef HAVE_GNUTLS + +#include +#include + +namespace gloox +{ + + /** + * @brief This is the common base class for (stream) encryption using GnuTLS. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GnuTLSBase : public TLSBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + * @param server The server to use in certificate verification. + */ + GnuTLSBase( TLSHandler* th, const std::string& server = EmptyString ); + + /** + * Virtual destructor. + */ + virtual ~GnuTLSBase(); + + // reimplemented from TLSBase + virtual bool encrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual int decrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual void cleanup(); + + // reimplemented from TLSBase + virtual bool handshake(); + + // reimplemented from TLSBase + virtual bool hasChannelBinding() const; + + // reimplemented from TLSBase + virtual const std::string channelBinding() const; + + // reimplemented from TLSBase + virtual void setCACerts( const StringList& /*cacerts*/ ) {} + + // reimplemented from TLSBase + virtual void setClientCert( const std::string& /*clientKey*/, const std::string& /*clientCerts*/ ) {} + + protected: + virtual void getCertInfo() {} + + gnutls_session_t* m_session; + + std::string m_recvBuffer; + char* m_buf; + const int m_bufsize; + + ssize_t pullFunc( void* data, size_t len ); + static ssize_t pullFunc( gnutls_transport_ptr_t ptr, void* data, size_t len ); + + ssize_t pushFunc( const void* data, size_t len ); + static ssize_t pushFunc( gnutls_transport_ptr_t ptr, const void* data, size_t len ); + + }; + +} + +#endif // HAVE_GNUTLS + +#endif // TLSGNUTLSBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.cpp b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.cpp new file mode 100644 index 00000000..fc031354 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.cpp @@ -0,0 +1,233 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "tlsgnutlsclient.h" + +#ifdef HAVE_GNUTLS + +#include + +namespace gloox +{ + + GnuTLSClient::GnuTLSClient( TLSHandler* th, const std::string& server ) + : GnuTLSBase( th, server ) + { + } + + GnuTLSClient::~GnuTLSClient() + { + } + + void GnuTLSClient::cleanup() + { + GnuTLSBase::cleanup(); + if( m_credentials ) + gnutls_certificate_free_credentials( m_credentials ); + init(); + } + + bool GnuTLSClient::init( const std::string& /*clientKey*/, + const std::string& /*clientCerts*/, + const StringList& /*cacerts*/ ) + { + if( m_initLib && gnutls_global_init() != 0 ) + return false; + + if( gnutls_certificate_allocate_credentials( &m_credentials ) < 0 ) + return false; + + if( gnutls_init( m_session, GNUTLS_CLIENT ) != 0 ) + { + gnutls_certificate_free_credentials( m_credentials ); + return false; + } + +#if GNUTLS_VERSION_NUMBER >= 0x020600 + int ret = gnutls_priority_set_direct( *m_session, "SECURE128:+PFS:+COMP-ALL:+VERS-TLS-ALL:-VERS-SSL3.0:+SIGN-ALL:+CURVE-ALL", 0 ); + if( ret != GNUTLS_E_SUCCESS ) + return false; +#else + const int protocolPriority[] = { +#ifdef GNUTLS_TLS1_2 + GNUTLS_TLS1_2, +#endif + GNUTLS_TLS1_1, GNUTLS_TLS1, 0 }; + const int kxPriority[] = { GNUTLS_KX_RSA, GNUTLS_KX_DHE_RSA, GNUTLS_KX_DHE_DSS, 0 }; + const int cipherPriority[] = { GNUTLS_CIPHER_AES_256_CBC, GNUTLS_CIPHER_AES_128_CBC, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_CIPHER_ARCFOUR, 0 }; + const int compPriority[] = { GNUTLS_COMP_ZLIB, GNUTLS_COMP_NULL, 0 }; + const int macPriority[] = { GNUTLS_MAC_SHA, GNUTLS_MAC_MD5, 0 }; + gnutls_protocol_set_priority( *m_session, protocolPriority ); + gnutls_cipher_set_priority( *m_session, cipherPriority ); + gnutls_compression_set_priority( *m_session, compPriority ); + gnutls_kx_set_priority( *m_session, kxPriority ); + gnutls_mac_set_priority( *m_session, macPriority ); +#endif + + gnutls_credentials_set( *m_session, GNUTLS_CRD_CERTIFICATE, m_credentials ); + + gnutls_transport_set_ptr( *m_session, (gnutls_transport_ptr_t)this ); + gnutls_transport_set_push_function( *m_session, pushFunc ); + gnutls_transport_set_pull_function( *m_session, pullFunc ); + + m_valid = true; + return true; + } + + void GnuTLSClient::setCACerts( const StringList& cacerts ) + { + m_cacerts = cacerts; + + StringList::const_iterator it = m_cacerts.begin(); + for( ; it != m_cacerts.end(); ++it ) + gnutls_certificate_set_x509_trust_file( m_credentials, (*it).c_str(), GNUTLS_X509_FMT_PEM ); + } + + void GnuTLSClient::setClientCert( const std::string& clientKey, const std::string& clientCerts ) + { + m_clientKey = clientKey; + m_clientCerts = clientCerts; + + if( !m_clientKey.empty() && !m_clientCerts.empty() ) + { + gnutls_certificate_set_x509_key_file( m_credentials, m_clientCerts.c_str(), + m_clientKey.c_str(), GNUTLS_X509_FMT_PEM ); + } + } + + void GnuTLSClient::getCertInfo() + { + unsigned int status; + bool error = false; + + gnutls_certificate_free_ca_names( m_credentials ); + + if( gnutls_certificate_verify_peers2( *m_session, &status ) < 0 ) + error = true; + + m_certInfo.status = 0; + if( status & GNUTLS_CERT_INVALID ) + m_certInfo.status |= CertInvalid; + if( status & GNUTLS_CERT_SIGNER_NOT_FOUND ) + m_certInfo.status |= CertSignerUnknown; + if( status & GNUTLS_CERT_REVOKED ) + m_certInfo.status |= CertRevoked; + if( status & GNUTLS_CERT_SIGNER_NOT_CA ) + m_certInfo.status |= CertSignerNotCa; + const gnutls_datum_t* certList = 0; + unsigned int certListSize = 0; + if( !error && ( ( certList = gnutls_certificate_get_peers( *m_session, &certListSize ) ) == 0 ) ) + error = true; + + unsigned int certListSizeFull = certListSize; + + gnutls_x509_crt_t* cert = new gnutls_x509_crt_t[certListSize+1]; + for( unsigned int i=0; !error && ( i 0 ) + && certListSize > 0 ) + certListSize--; + + bool chain = true; + for( unsigned int i=1; !error && ( i time( 0 ) ) + m_certInfo.status |= CertNotActive; + m_certInfo.date_from = t; + + t = (int)gnutls_x509_crt_get_expiration_time( cert[0] ); + if( t == -1 ) + error = true; + else if( t < time( 0 ) ) + m_certInfo.status |= CertExpired; + m_certInfo.date_to = t; + + char name[64]; + size_t nameSize = sizeof( name ); + gnutls_x509_crt_get_issuer_dn( cert[0], name, &nameSize ); + m_certInfo.issuer = name; + + nameSize = sizeof( name ); + gnutls_x509_crt_get_dn( cert[0], name, &nameSize ); + m_certInfo.server = name; + + const char* info; + info = gnutls_compression_get_name( gnutls_compression_get( *m_session ) ); + if( info ) + m_certInfo.compression = info; + + info = gnutls_mac_get_name( gnutls_mac_get( *m_session ) ); + if( info ) + m_certInfo.mac = info; + + info = gnutls_cipher_get_name( gnutls_cipher_get( *m_session ) ); + if( info ) + m_certInfo.cipher = info; + + info = gnutls_protocol_get_name( gnutls_protocol_get_version( *m_session ) ); + if( info ) + m_certInfo.protocol = info; + + if( !gnutls_x509_crt_check_hostname( cert[0], m_server.c_str() ) ) + m_certInfo.status |= CertWrongPeer; + + for( unsigned int i = 0; i < certListSizeFull; ++i ) + gnutls_x509_crt_deinit( cert[i] ); + + delete[] cert; + + m_valid = true; + } + + static bool verifyCert( gnutls_x509_crt_t cert, unsigned result ) + { + return ! ( ( result & GNUTLS_CERT_INVALID ) + || gnutls_x509_crt_get_expiration_time( cert ) < time( 0 ) + || gnutls_x509_crt_get_activation_time( cert ) > time( 0 ) ); + } + + bool GnuTLSClient::verifyAgainst( gnutls_x509_crt_t cert, gnutls_x509_crt_t issuer ) + { + unsigned int result; + gnutls_x509_crt_verify( cert, &issuer, 1, 0, &result ); + return verifyCert( cert, result ); + } + + bool GnuTLSClient::verifyAgainstCAs( gnutls_x509_crt_t cert, gnutls_x509_crt_t* CAList, int CAListSize ) + { + unsigned int result; + gnutls_x509_crt_verify( cert, CAList, CAListSize, GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT, &result ); + return verifyCert( cert, result ); + } + +} + +#endif // HAVE_GNUTLS diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.h b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.h new file mode 100644 index 00000000..7e32309b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclient.h @@ -0,0 +1,81 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSGNUTLSCLIENT_H__ +#define TLSGNUTLSCLIENT_H__ + +#include "tlsgnutlsbase.h" + +#include "config.h" + +#ifdef HAVE_GNUTLS + +#include +#include + +namespace gloox +{ + + /** + * @brief This class implements a TLS backend using GnuTLS. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GnuTLSClient : public GnuTLSBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + * @param server The server to use in certificate verification. + */ + GnuTLSClient( TLSHandler* th, const std::string& server ); + + /** + * Virtual destructor. + */ + virtual ~GnuTLSClient(); + + // reimplemented from TLSBase + virtual bool init( const std::string& clientKey = EmptyString, + const std::string& clientCerts = EmptyString, + const StringList& cacerts = StringList() ); + + // reimplemented from TLSBase + virtual void setCACerts( const StringList& cacerts ); + + // reimplemented from TLSBase + virtual void setClientCert( const std::string& clientKey, const std::string& clientCerts ); + + // reimplemented from TLSBase + virtual void cleanup(); + + private: + virtual void getCertInfo(); + + bool verifyAgainst( gnutls_x509_crt_t cert, gnutls_x509_crt_t issuer ); + bool verifyAgainstCAs( gnutls_x509_crt_t cert, gnutls_x509_crt_t *CAList, int CAListSize ); + + gnutls_certificate_credentials_t m_credentials; + + }; + +} + +#endif // HAVE_GNUTLS + +#endif // TLSGNUTLSCLIENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.cpp b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.cpp new file mode 100644 index 00000000..9545aa5d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.cpp @@ -0,0 +1,112 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "tlsgnutlsclientanon.h" + +#ifdef HAVE_GNUTLS + +#include + +namespace gloox +{ + + GnuTLSClientAnon::GnuTLSClientAnon( TLSHandler* th ) + : GnuTLSBase( th ) + { + } + + GnuTLSClientAnon::~GnuTLSClientAnon() + { + gnutls_anon_free_client_credentials( m_anoncred ); + } + + void GnuTLSClientAnon::cleanup() + { + GnuTLSBase::cleanup(); + init(); + } + + bool GnuTLSClientAnon::init( const std::string&, + const std::string&, + const StringList& ) + { + if( m_initLib && gnutls_global_init() != 0 ) + return false; + + if( gnutls_anon_allocate_client_credentials( &m_anoncred ) < 0 ) + return false; + + if( gnutls_init( m_session, GNUTLS_CLIENT ) != 0 ) + return false; + +#if GNUTLS_VERSION_NUMBER >= 0x020600 + int ret = gnutls_priority_set_direct( *m_session, "SECURE128:+PFS:+COMP-ALL:+VERS-TLS-ALL:-VERS-SSL3.0:+SIGN-ALL:+CURVE-ALL", 0 ); + if( ret != GNUTLS_E_SUCCESS ) + return false; +#else + const int protocolPriority[] = { +#ifdef GNUTLS_TLS1_2 + GNUTLS_TLS1_2, +#endif + GNUTLS_TLS1_1, GNUTLS_TLS1, 0 }; + const int protocolPriority[] = { GNUTLS_TLS1, 0 }; + const int kxPriority[] = { GNUTLS_KX_ANON_DH, 0 }; + const int cipherPriority[] = { GNUTLS_CIPHER_AES_256_CBC, GNUTLS_CIPHER_AES_128_CBC, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_CIPHER_ARCFOUR, 0 }; + const int compPriority[] = { GNUTLS_COMP_ZLIB, GNUTLS_COMP_NULL, 0 }; + const int macPriority[] = { GNUTLS_MAC_SHA, GNUTLS_MAC_MD5, 0 }; + gnutls_protocol_set_priority( *m_session, protocolPriority ); + gnutls_cipher_set_priority( *m_session, cipherPriority ); + gnutls_compression_set_priority( *m_session, compPriority ); + gnutls_kx_set_priority( *m_session, kxPriority ); + gnutls_mac_set_priority( *m_session, macPriority ); +#endif + + gnutls_credentials_set( *m_session, GNUTLS_CRD_ANON, m_anoncred ); + + gnutls_transport_set_ptr( *m_session, (gnutls_transport_ptr_t)this ); + gnutls_transport_set_push_function( *m_session, pushFunc ); + gnutls_transport_set_pull_function( *m_session, pullFunc ); + + m_valid = true; + return true; + } + + void GnuTLSClientAnon::getCertInfo() + { + m_certInfo.status = CertOk; + + const char* info; + info = gnutls_compression_get_name( gnutls_compression_get( *m_session ) ); + if( info ) + m_certInfo.compression = info; + + info = gnutls_mac_get_name( gnutls_mac_get( *m_session ) ); + if( info ) + m_certInfo.mac = info; + + info = gnutls_cipher_get_name( gnutls_cipher_get( *m_session ) ); + if( info ) + m_certInfo.cipher = info; + + info = gnutls_protocol_get_name( gnutls_protocol_get_version( *m_session ) ); + if( info ) + m_certInfo.protocol = info; + + m_valid = true; + } + +} + +#endif // HAVE_GNUTLS diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.h b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.h new file mode 100644 index 00000000..acbd845a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsclientanon.h @@ -0,0 +1,70 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSGNUTLSCLIENTANON_H__ +#define TLSGNUTLSCLIENTANON_H__ + +#include "tlsgnutlsbase.h" + +#include "config.h" + +#ifdef HAVE_GNUTLS + +#include +#include + +namespace gloox +{ + + /** + * @brief This class implements an anonymous TLS backend using GnuTLS. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GnuTLSClientAnon : public GnuTLSBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + */ + GnuTLSClientAnon( TLSHandler* th ); + + /** + * Virtual destructor. + */ + virtual ~GnuTLSClientAnon(); + + // reimplemented from TLSBase + virtual bool init( const std::string& clientKey = EmptyString, + const std::string& clientCerts = EmptyString, + const StringList& cacerts = StringList() ); + + // reimplemented from TLSBase + virtual void cleanup(); + + private: + virtual void getCertInfo(); + + gnutls_anon_client_credentials_t m_anoncred; + }; + +} + +#endif // HAVE_GNUTLS + +#endif // TLSGNUTLSCLIENTANON_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.cpp b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.cpp new file mode 100644 index 00000000..a7c9a3c6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.cpp @@ -0,0 +1,123 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "tlsgnutlsserveranon.h" + +#ifdef HAVE_GNUTLS + +#include + +namespace gloox +{ + + GnuTLSServerAnon::GnuTLSServerAnon( TLSHandler* th ) + : GnuTLSBase( th ), m_dhBits( 1024 ) + { + } + + GnuTLSServerAnon::~GnuTLSServerAnon() + { + gnutls_anon_free_server_credentials( m_anoncred ); + gnutls_dh_params_deinit( m_dhParams ); + } + + void GnuTLSServerAnon::cleanup() + { + GnuTLSBase::cleanup(); + init(); + } + + bool GnuTLSServerAnon::init( const std::string&, + const std::string&, + const StringList& ) + { + if( m_initLib && gnutls_global_init() != 0 ) + return false; + + if( gnutls_anon_allocate_server_credentials( &m_anoncred ) < 0 ) + return false; + + generateDH(); + gnutls_anon_set_server_dh_params( m_anoncred, m_dhParams ); + + if( gnutls_init( m_session, GNUTLS_SERVER ) != 0 ) + return false; + +#if GNUTLS_VERSION_NUMBER >= 0x020600 + int ret = gnutls_priority_set_direct( *m_session, "SECURE128:+PFS:+COMP-ALL:+VERS-TLS-ALL:-VERS-SSL3.0:+SIGN-ALL:+CURVE-ALL", 0 ); + if( ret != GNUTLS_E_SUCCESS ) + return false; +#else + const int protocolPriority[] = { +#ifdef GNUTLS_TLS1_2 + GNUTLS_TLS1_2, +#endif + GNUTLS_TLS1_1, GNUTLS_TLS1, 0 }; + const int kxPriority[] = { GNUTLS_KX_ANON_DH, 0 }; + const int cipherPriority[] = { GNUTLS_CIPHER_AES_256_CBC, GNUTLS_CIPHER_AES_128_CBC, + GNUTLS_CIPHER_3DES_CBC, GNUTLS_CIPHER_ARCFOUR, 0 }; + const int compPriority[] = { GNUTLS_COMP_ZLIB, GNUTLS_COMP_NULL, 0 }; + const int macPriority[] = { GNUTLS_MAC_SHA, GNUTLS_MAC_MD5, 0 }; + gnutls_protocol_set_priority( *m_session, protocolPriority ); + gnutls_cipher_set_priority( *m_session, cipherPriority ); + gnutls_compression_set_priority( *m_session, compPriority ); + gnutls_kx_set_priority( *m_session, kxPriority ); + gnutls_mac_set_priority( *m_session, macPriority ); +#endif + + gnutls_credentials_set( *m_session, GNUTLS_CRD_ANON, m_anoncred ); + + gnutls_dh_set_prime_bits( *m_session, m_dhBits ); + + gnutls_transport_set_ptr( *m_session, (gnutls_transport_ptr_t)this ); + gnutls_transport_set_push_function( *m_session, pushFunc ); + gnutls_transport_set_pull_function( *m_session, pullFunc ); + + m_valid = true; + return true; + } + + void GnuTLSServerAnon::generateDH() + { + gnutls_dh_params_init( &m_dhParams ); + gnutls_dh_params_generate2( m_dhParams, m_dhBits ); + } + + void GnuTLSServerAnon::getCertInfo() + { + m_certInfo.status = CertOk; + + const char* info; + info = gnutls_compression_get_name( gnutls_compression_get( *m_session ) ); + if( info ) + m_certInfo.compression = info; + + info = gnutls_mac_get_name( gnutls_mac_get( *m_session ) ); + if( info ) + m_certInfo.mac = info; + + info = gnutls_cipher_get_name( gnutls_cipher_get( *m_session ) ); + if( info ) + m_certInfo.cipher = info; + + info = gnutls_protocol_get_name( gnutls_protocol_get_version( *m_session ) ); + if( info ) + m_certInfo.protocol = info; + + m_valid = true; + } + +} + +#endif // HAVE_GNUTLS diff --git a/smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.h b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.h new file mode 100644 index 00000000..14ac0dfc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsgnutlsserveranon.h @@ -0,0 +1,75 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSGNUTLSSERVERANON_H__ +#define TLSGNUTLSSERVERANON_H__ + +#include "tlsgnutlsbase.h" + +#include "config.h" + +#ifdef HAVE_GNUTLS + +#include +#include + +namespace gloox +{ + + /** + * @brief This class implements (stream) encryption using GnuTLS server-side. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GnuTLSServerAnon : public GnuTLSBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + */ + GnuTLSServerAnon( TLSHandler* th ); + + /** + * Virtual destructor. + */ + virtual ~GnuTLSServerAnon(); + + // reimplemented from TLSBase + virtual bool init( const std::string& clientKey = EmptyString, + const std::string& clientCerts = EmptyString, + const StringList& cacerts = StringList() ); + + // reimplemented from TLSBase + virtual void cleanup(); + + private: + virtual void getCertInfo(); + void generateDH(); + + gnutls_anon_server_credentials_t m_anoncred; + gnutls_dh_params_t m_dhParams; + + const int m_dhBits; + + }; + +} + +#endif // HAVE_GNUTLS + +#endif // TLSGNUTLSSERVERANON_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlshandler.h b/smack/smack/src/main/cpp/gloox/src/tlshandler.h new file mode 100644 index 00000000..a3c6fd10 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlshandler.h @@ -0,0 +1,68 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSHANDLER_H__ +#define TLSHANDLER_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + struct CertInfo; + class TLSBase; + + /** + * @brief An interface that allows for interacting with TLS implementations derived from TLSBase. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API TLSHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~TLSHandler() {} + + /** + * Reimplement this function to receive encrypted data from a TLSBase implementation. + * @param base The encryption implementation which called this function. + * @param data The encrypted data (e.g. to send over the wire). + */ + virtual void handleEncryptedData( const TLSBase* base, const std::string& data ) = 0; + + /** + * Reimplement this function to receive decrypted data from a TLSBase implementation. + * @param base The encryption implementation which called this function. + * @param data The decrypted data (e.g. to parse). + */ + virtual void handleDecryptedData( const TLSBase* base, const std::string& data ) = 0; + + /** + * Reimplement this function to receive the result of a TLS handshake. + * @param base The encryption implementation which called this function. + * @param success Whether or not the handshake was successful. + * @param certinfo Information about the server's certificate. + */ + virtual void handleHandshakeResult( const TLSBase* base, bool success, CertInfo &certinfo ) = 0; + + }; + +} + +#endif // TLSHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsopensslbase.cpp b/smack/smack/src/main/cpp/gloox/src/tlsopensslbase.cpp new file mode 100644 index 00000000..393c483a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsopensslbase.cpp @@ -0,0 +1,336 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "tlsopensslbase.h" + +#ifdef HAVE_OPENSSL + +#include +#include +#include +#include + +#include +#include + +namespace gloox +{ + + OpenSSLBase::OpenSSLBase( TLSHandler* th, const std::string& server ) + : TLSBase( th, server ), m_ssl( 0 ), m_ctx( 0 ), m_buf( 0 ), m_bufsize( 17000 ) + { + m_buf = (char*)calloc( m_bufsize + 1, sizeof( char ) ); + } + + OpenSSLBase::~OpenSSLBase() + { + m_handler = 0; + free( m_buf ); + SSL_CTX_free( m_ctx ); + SSL_shutdown( m_ssl ); + SSL_free( m_ssl ); + BIO_free( m_nbio ); + cleanup(); + } + + bool OpenSSLBase::init( const std::string& clientKey, + const std::string& clientCerts, + const StringList& cacerts ) + { + if( m_initLib ) + SSL_library_init(); + + SSL_COMP_add_compression_method( 193, COMP_zlib() ); + + OpenSSL_add_all_algorithms(); + + if( !setType() ) //inits m_ctx + return false; + + setClientCert( clientKey, clientCerts ); + setCACerts( cacerts ); + + if( !SSL_CTX_set_cipher_list( m_ctx, "HIGH:MEDIUM:AES:@STRENGTH" ) ) + return false; + + m_ssl = SSL_new( m_ctx ); + if( !m_ssl ) + return false; + + if( !BIO_new_bio_pair( &m_ibio, 0, &m_nbio, 0 ) ) + return false; + + SSL_set_bio( m_ssl, m_ibio, m_ibio ); + SSL_set_mode( m_ssl, SSL_MODE_AUTO_RETRY | SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_ENABLE_PARTIAL_WRITE ); + + ERR_load_crypto_strings(); + SSL_load_error_strings(); + + if( !privateInit() ) + return false; + + m_valid = true; + return true; + } + + bool OpenSSLBase::encrypt( const std::string& data ) + { + m_sendBuffer += data; + + if( !m_secure ) + { + handshake(); + return 0; + } + + doTLSOperation( TLSWrite ); + return true; + } + + int OpenSSLBase::decrypt( const std::string& data ) + { + m_recvBuffer += data; + + if( !m_secure ) + { + handshake(); + return 0; + } + + doTLSOperation( TLSRead ); + return true; + } + + void OpenSSLBase::setCACerts( const StringList& cacerts ) + { + m_cacerts = cacerts; + + StringList::const_iterator it = m_cacerts.begin(); + for( ; it != m_cacerts.end(); ++it ) + SSL_CTX_load_verify_locations( m_ctx, (*it).c_str(), 0 ); + } + + void OpenSSLBase::setClientCert( const std::string& clientKey, const std::string& clientCerts ) + { + m_clientKey = clientKey; + m_clientCerts = clientCerts; + + if( !m_clientKey.empty() && !m_clientCerts.empty() ) + { + if( SSL_CTX_use_certificate_chain_file( m_ctx, m_clientCerts.c_str() ) != 1 ) + { + // FIXME + } + if( SSL_CTX_use_RSAPrivateKey_file( m_ctx, m_clientKey.c_str(), SSL_FILETYPE_PEM ) != 1 ) + { + // FIXME + } + } + + if ( SSL_CTX_check_private_key( m_ctx ) != 1 ) + { + // FIXME + } + } + + void OpenSSLBase::cleanup() + { + if( !m_mutex.trylock() ) + return; + + m_secure = false; + m_valid = false; + + m_mutex.unlock(); + } + + void OpenSSLBase::doTLSOperation( TLSOperation op ) + { + if( !m_handler ) + return; + + int ret = 0; + bool onceAgain = false; + + do + { + switch( op ) + { + case TLSHandshake: + ret = handshakeFunction(); + break; + case TLSWrite: + ret = SSL_write( m_ssl, m_sendBuffer.c_str(), m_sendBuffer.length() ); + break; + case TLSRead: + ret = SSL_read( m_ssl, m_buf, m_bufsize ); + break; + } + + switch( SSL_get_error( m_ssl, ret ) ) + { + case SSL_ERROR_WANT_READ: + case SSL_ERROR_WANT_WRITE: + pushFunc(); + break; + case SSL_ERROR_NONE: + if( op == TLSHandshake ) + m_secure = true; + else if( op == TLSWrite ) + m_sendBuffer.erase( 0, ret ); + else if( op == TLSRead ) + m_handler->handleDecryptedData( this, std::string( m_buf, ret ) ); + pushFunc(); + break; + default: + if( !m_secure ) + m_handler->handleHandshakeResult( this, false, m_certInfo ); + return; + break; + } + if( !onceAgain && !m_recvBuffer.length() ) + onceAgain = true; + else if( onceAgain ) + onceAgain = false; + } + while( ( ( onceAgain || m_recvBuffer.length() ) && ( !m_secure || op == TLSRead ) ) + || ( ( op == TLSWrite ) && ( ret > 0 ) )); + } + + int OpenSSLBase::openSSLTime2UnixTime( const char* time_string ) + { + char tstring[19]; + + // making seperate c string out of time string + int m = 0; + for( int n = 0; n < 12; n += 2 ) + { + tstring[m] = time_string[n]; + tstring[m + 1] = time_string[n + 1]; + tstring[m + 2] = 0; + m += 3; + } + + // converting to struct tm + tm time_st; + time_st.tm_year = ( atoi( &tstring[3 * 0] ) >= 70 ) ? atoi( &tstring[3 * 0] ) + : atoi( &tstring[3 * 0] ) + 100; + time_st.tm_mon = atoi( &tstring[3 * 1] ) - 1; + time_st.tm_mday = atoi( &tstring[3 * 2] ); + time_st.tm_hour = atoi( &tstring[3 * 3] ); + time_st.tm_min = atoi( &tstring[3 * 4] ); + time_st.tm_sec = atoi( &tstring[3 * 5] ); + + time_t unixt = mktime( &time_st ); + return unixt; + } + + bool OpenSSLBase::handshake() + { + + doTLSOperation( TLSHandshake ); + + if( !m_secure ) + return true; + + int res = SSL_get_verify_result( m_ssl ); + if( res != X509_V_OK ) + m_certInfo.status = CertInvalid; + else + m_certInfo.status = CertOk; + + X509* peer = SSL_get_peer_certificate( m_ssl ); + if( peer ) + { + char peer_CN[256]; + X509_NAME_get_text_by_NID( X509_get_issuer_name( peer ), NID_commonName, peer_CN, sizeof( peer_CN ) ); + m_certInfo.issuer = peer_CN; + X509_NAME_get_text_by_NID( X509_get_subject_name( peer ), NID_commonName, peer_CN, sizeof( peer_CN ) ); + m_certInfo.server = peer_CN; + m_certInfo.date_from = openSSLTime2UnixTime( (char*) (peer->cert_info->validity->notBefore->data) ); + m_certInfo.date_to = openSSLTime2UnixTime( (char*) (peer->cert_info->validity->notAfter->data) ); + std::string p( peer_CN ); + std::transform( p.begin(), p.end(), p.begin(), tolower ); + if( p != m_server ) + m_certInfo.status |= CertWrongPeer; + + if( ASN1_UTCTIME_cmp_time_t( X509_get_notBefore( peer ), time( 0 ) ) != -1 ) + m_certInfo.status |= CertNotActive; + + if( ASN1_UTCTIME_cmp_time_t( X509_get_notAfter( peer ), time( 0 ) ) != 1 ) + m_certInfo.status |= CertExpired; + + X509_free( peer ); + } + else + { + m_certInfo.status = CertInvalid; + } + + const char* tmp; + tmp = SSL_get_cipher_name( m_ssl ); + if( tmp ) + m_certInfo.cipher = tmp; + + tmp = SSL_get_cipher_version( m_ssl ); + if( tmp ) + m_certInfo.protocol = tmp; + + tmp = SSL_COMP_get_name( SSL_get_current_compression( m_ssl ) ); + if( tmp ) + m_certInfo.compression = tmp; + + m_valid = true; + + m_handler->handleHandshakeResult( this, true, m_certInfo ); + return true; + } + + void OpenSSLBase::pushFunc() + { + int wantwrite; + size_t wantread; + int frombio; + int tobio; + + while( ( wantwrite = BIO_ctrl_pending( m_nbio ) ) > 0 ) + { + if( wantwrite > m_bufsize ) + wantwrite = m_bufsize; + + if( !wantwrite ) + break; + + frombio = BIO_read( m_nbio, m_buf, wantwrite ); + + if( m_handler ) + m_handler->handleEncryptedData( this, std::string( m_buf, frombio ) ); + } + + while( ( wantread = BIO_ctrl_get_read_request( m_nbio ) ) > 0 ) + { + if( wantread > m_recvBuffer.length() ) + wantread = m_recvBuffer.length(); + + if( !wantread ) + break; + + tobio = BIO_write( m_nbio, m_recvBuffer.c_str(), wantread ); + m_recvBuffer.erase( 0, tobio ); + } + } + +} + +#endif // HAVE_OPENSSL diff --git a/smack/smack/src/main/cpp/gloox/src/tlsopensslbase.h b/smack/smack/src/main/cpp/gloox/src/tlsopensslbase.h new file mode 100644 index 00000000..76105e04 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsopensslbase.h @@ -0,0 +1,108 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSOPENSSLBASE_H__ +#define TLSOPENSSLBASE_H__ + +#include "tlsbase.h" + +#include "config.h" + +#ifdef HAVE_OPENSSL + +#include + +namespace gloox +{ + + /** + * This is a common base class for client and server-side TLS + * stream encryption implementations using OpenSSL. + * + * @author Jakob Schröter + * @since 1.0 + */ + class OpenSSLBase : public TLSBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + * @param server The server to use in certificate verification. + */ + OpenSSLBase( TLSHandler* th, const std::string& server = EmptyString ); + + /** + * Virtual destructor. + */ + virtual ~OpenSSLBase(); + + // reimplemented from TLSBase + virtual bool init( const std::string& clientKey = EmptyString, + const std::string& clientCerts = EmptyString, + const StringList& cacerts = StringList() ); + + // reimplemented from TLSBase + virtual bool encrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual int decrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual void cleanup(); + + // reimplemented from TLSBase + virtual bool handshake(); + + // reimplemented from TLSBase + virtual void setCACerts( const StringList& cacerts ); + + // reimplemented from TLSBase + virtual void setClientCert( const std::string& clientKey, const std::string& clientCerts ); + + protected: + virtual bool setType() = 0; + virtual int handshakeFunction() = 0; + + SSL* m_ssl; + SSL_CTX* m_ctx; + BIO* m_ibio; + BIO* m_nbio; + + private: + void pushFunc(); + virtual bool privateInit() { return true; } + + enum TLSOperation + { + TLSHandshake, + TLSWrite, + TLSRead + }; + + void doTLSOperation( TLSOperation op ); + int openSSLTime2UnixTime( const char* time_string ); + + std::string m_recvBuffer; + std::string m_sendBuffer; + char* m_buf; + const int m_bufsize; + + }; + +} + +#endif // HAVE_OPENSSL + +#endif // TLSOPENSSLBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsopensslclient.cpp b/smack/smack/src/main/cpp/gloox/src/tlsopensslclient.cpp new file mode 100644 index 00000000..6b7e07a2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsopensslclient.cpp @@ -0,0 +1,59 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "tlsopensslclient.h" + +#ifdef HAVE_OPENSSL + +namespace gloox +{ + + OpenSSLClient::OpenSSLClient( TLSHandler* th, const std::string& server ) + : OpenSSLBase( th, server ) + { + } + + OpenSSLClient::~OpenSSLClient() + { + } + + bool OpenSSLClient::setType() + { + m_ctx = SSL_CTX_new( TLSv1_client_method() ); + if( !m_ctx ) + return false; + + return true; + } + + bool OpenSSLClient::hasChannelBinding() const + { + return true; + } + + const std::string OpenSSLClient::channelBinding() const + { + unsigned char* buf[128]; + int res = SSL_get_finished( m_ssl, buf, 128 ); + return std::string( (char*)buf, res ); + } + + int OpenSSLClient::handshakeFunction() + { + return SSL_connect( m_ssl ); + } + +} + +#endif // HAVE_OPENSSL diff --git a/smack/smack/src/main/cpp/gloox/src/tlsopensslclient.h b/smack/smack/src/main/cpp/gloox/src/tlsopensslclient.h new file mode 100644 index 00000000..48734ee5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsopensslclient.h @@ -0,0 +1,69 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSOPENSSLCLIENT_H__ +#define TLSOPENSSLCLIENT_H__ + +#include "tlsopensslbase.h" + +#include "config.h" + +#ifdef HAVE_OPENSSL + +#include + +namespace gloox +{ + + /** + * This class implements a TLS client backend using OpenSSL. + * + * @author Jakob Schröter + * @since 0.9 + */ + class OpenSSLClient : public OpenSSLBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + * @param server The server to use in certificate verification. + */ + OpenSSLClient( TLSHandler* th, const std::string& server ); + + /** + * Virtual destructor. + */ + virtual ~OpenSSLClient(); + + // reimplemented from TLSBase + virtual bool hasChannelBinding() const; + + // reimplemented from TLSBase + virtual const std::string channelBinding() const; + + private: + // reimplemented from OpenSSLBase + virtual bool setType(); + + // reimplemented from OpenSSLBase + virtual int handshakeFunction(); + + }; + +} + +#endif // HAVE_OPENSSL + +#endif // TLSOPENSSLCLIENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsopensslserver.cpp b/smack/smack/src/main/cpp/gloox/src/tlsopensslserver.cpp new file mode 100644 index 00000000..8cb1c4cc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsopensslserver.cpp @@ -0,0 +1,265 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "tlsopensslserver.h" + +#ifdef HAVE_OPENSSL + +#ifndef __SYMBIAN32__ + +#ifndef HEADER_DH_H +#include +#endif + +namespace gloox +{ + + OpenSSLServer::OpenSSLServer( TLSHandler* th ) + : OpenSSLBase( th ) + { + } + + OpenSSLServer::~OpenSSLServer() + { + } + + bool OpenSSLServer::setType() + { + m_ctx = SSL_CTX_new( TLSv1_server_method() ); + if( !m_ctx ) + return false; + + return true; + } + + int OpenSSLServer::handshakeFunction() + { + return SSL_accept( m_ssl ); + } + + DH* getDH512() + { + static unsigned char dh512_p[] = + { + 0xF5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,0x18,0x11,0x8D,0x7C, + 0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,0x19,0xC8,0x07,0x29, + 0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,0xD0,0x0A,0x50,0x9B, + 0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,0x41,0x9F,0x9C,0x7C, + 0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,0xA2,0x5E,0xC3,0x55, + 0xE9,0x2A,0x05,0x5F, + }; + static unsigned char dh512_g[] = + { + 0x02, + }; + DH* dh = DH_new(); + + if( !dh ) + return 0; + + dh->p = BN_bin2bn( dh512_p, sizeof( dh512_p ), 0 ); + dh->g = BN_bin2bn( dh512_g, sizeof( dh512_g ), 0 ); + if( ( dh->p == 0 ) || ( dh->g == 0 ) ) + { + DH_free( dh ); + return 0; + } + + return dh; + } + DH* getDH1024() + { + static unsigned char dh1024_p[]={ + 0xF4,0x88,0xFD,0x58,0x4E,0x49,0xDB,0xCD,0x20,0xB4,0x9D,0xE4, + 0x91,0x07,0x36,0x6B,0x33,0x6C,0x38,0x0D,0x45,0x1D,0x0F,0x7C, + 0x88,0xB3,0x1C,0x7C,0x5B,0x2D,0x8E,0xF6,0xF3,0xC9,0x23,0xC0, + 0x43,0xF0,0xA5,0x5B,0x18,0x8D,0x8E,0xBB,0x55,0x8C,0xB8,0x5D, + 0x38,0xD3,0x34,0xFD,0x7C,0x17,0x57,0x43,0xA3,0x1D,0x18,0x6C, + 0xDE,0x33,0x21,0x2C,0xB5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40, + 0x18,0x11,0x8D,0x7C,0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03, + 0x19,0xC8,0x07,0x29,0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB, + 0xD0,0x0A,0x50,0x9B,0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D, + 0x41,0x9F,0x9C,0x7C,0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB, + 0xA2,0x5E,0xC3,0x55,0xE9,0x2F,0x78,0xC7, + }; + static unsigned char dh1024_g[]={ + 0x02, + }; + DH* dh = DH_new(); + + if( !dh ) + return 0; + + dh->p = BN_bin2bn( dh1024_p, sizeof( dh1024_p ), 0 ); + dh->g = BN_bin2bn( dh1024_g, sizeof( dh1024_g ), 0 ); + if( ( dh->p == 0 ) || ( dh->g == 0 ) ) + { + DH_free( dh ); + return 0; + } + + return dh; + } + DH* getDH2048() + { + static unsigned char dh2048_p[]={ + 0xF6,0x42,0x57,0xB7,0x08,0x7F,0x08,0x17,0x72,0xA2,0xBA,0xD6, + 0xA9,0x42,0xF3,0x05,0xE8,0xF9,0x53,0x11,0x39,0x4F,0xB6,0xF1, + 0x6E,0xB9,0x4B,0x38,0x20,0xDA,0x01,0xA7,0x56,0xA3,0x14,0xE9, + 0x8F,0x40,0x55,0xF3,0xD0,0x07,0xC6,0xCB,0x43,0xA9,0x94,0xAD, + 0xF7,0x4C,0x64,0x86,0x49,0xF8,0x0C,0x83,0xBD,0x65,0xE9,0x17, + 0xD4,0xA1,0xD3,0x50,0xF8,0xF5,0x59,0x5F,0xDC,0x76,0x52,0x4F, + 0x3D,0x3D,0x8D,0xDB,0xCE,0x99,0xE1,0x57,0x92,0x59,0xCD,0xFD, + 0xB8,0xAE,0x74,0x4F,0xC5,0xFC,0x76,0xBC,0x83,0xC5,0x47,0x30, + 0x61,0xCE,0x7C,0xC9,0x66,0xFF,0x15,0xF9,0xBB,0xFD,0x91,0x5E, + 0xC7,0x01,0xAA,0xD3,0x5B,0x9E,0x8D,0xA0,0xA5,0x72,0x3A,0xD4, + 0x1A,0xF0,0xBF,0x46,0x00,0x58,0x2B,0xE5,0xF4,0x88,0xFD,0x58, + 0x4E,0x49,0xDB,0xCD,0x20,0xB4,0x9D,0xE4,0x91,0x07,0x36,0x6B, + 0x33,0x6C,0x38,0x0D,0x45,0x1D,0x0F,0x7C,0x88,0xB3,0x1C,0x7C, + 0x5B,0x2D,0x8E,0xF6,0xF3,0xC9,0x23,0xC0,0x43,0xF0,0xA5,0x5B, + 0x18,0x8D,0x8E,0xBB,0x55,0x8C,0xB8,0x5D,0x38,0xD3,0x34,0xFD, + 0x7C,0x17,0x57,0x43,0xA3,0x1D,0x18,0x6C,0xDE,0x33,0x21,0x2C, + 0xB5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,0x18,0x11,0x8D,0x7C, + 0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,0x19,0xC8,0x07,0x29, + 0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,0xD0,0x0A,0x50,0x9B, + 0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,0x41,0x9F,0x9C,0x7C, + 0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,0xA2,0x5E,0xC3,0x55, + 0xE9,0x32,0x0B,0x3B, + }; + static unsigned char dh2048_g[]={ + 0x02, + }; + DH* dh = DH_new(); + + if( !dh ) + return 0; + + dh->p = BN_bin2bn( dh2048_p, sizeof( dh2048_p ), 0 ); + dh->g = BN_bin2bn( dh2048_g, sizeof( dh2048_g ), 0 ); + if( ( dh->p == 0 ) || ( dh->g == 0 ) ) + { + DH_free( dh ); + return 0; + } + + return dh; + } + + DH* getDH4096() + { + static unsigned char dh4096_p[]={ + 0xFA,0x14,0x72,0x52,0xC1,0x4D,0xE1,0x5A,0x49,0xD4,0xEF,0x09, + 0x2D,0xC0,0xA8,0xFD,0x55,0xAB,0xD7,0xD9,0x37,0x04,0x28,0x09, + 0xE2,0xE9,0x3E,0x77,0xE2,0xA1,0x7A,0x18,0xDD,0x46,0xA3,0x43, + 0x37,0x23,0x90,0x97,0xF3,0x0E,0xC9,0x03,0x50,0x7D,0x65,0xCF, + 0x78,0x62,0xA6,0x3A,0x62,0x22,0x83,0xA1,0x2F,0xFE,0x79,0xBA, + 0x35,0xFF,0x59,0xD8,0x1D,0x61,0xDD,0x1E,0x21,0x13,0x17,0xFE, + 0xCD,0x38,0x87,0x9E,0xF5,0x4F,0x79,0x10,0x61,0x8D,0xD4,0x22, + 0xF3,0x5A,0xED,0x5D,0xEA,0x21,0xE9,0x33,0x6B,0x48,0x12,0x0A, + 0x20,0x77,0xD4,0x25,0x60,0x61,0xDE,0xF6,0xB4,0x4F,0x1C,0x63, + 0x40,0x8B,0x3A,0x21,0x93,0x8B,0x79,0x53,0x51,0x2C,0xCA,0xB3, + 0x7B,0x29,0x56,0xA8,0xC7,0xF8,0xF4,0x7B,0x08,0x5E,0xA6,0xDC, + 0xA2,0x45,0x12,0x56,0xDD,0x41,0x92,0xF2,0xDD,0x5B,0x8F,0x23, + 0xF0,0xF3,0xEF,0xE4,0x3B,0x0A,0x44,0xDD,0xED,0x96,0x84,0xF1, + 0xA8,0x32,0x46,0xA3,0xDB,0x4A,0xBE,0x3D,0x45,0xBA,0x4E,0xF8, + 0x03,0xE5,0xDD,0x6B,0x59,0x0D,0x84,0x1E,0xCA,0x16,0x5A,0x8C, + 0xC8,0xDF,0x7C,0x54,0x44,0xC4,0x27,0xA7,0x3B,0x2A,0x97,0xCE, + 0xA3,0x7D,0x26,0x9C,0xAD,0xF4,0xC2,0xAC,0x37,0x4B,0xC3,0xAD, + 0x68,0x84,0x7F,0x99,0xA6,0x17,0xEF,0x6B,0x46,0x3A,0x7A,0x36, + 0x7A,0x11,0x43,0x92,0xAD,0xE9,0x9C,0xFB,0x44,0x6C,0x3D,0x82, + 0x49,0xCC,0x5C,0x6A,0x52,0x42,0xF8,0x42,0xFB,0x44,0xF9,0x39, + 0x73,0xFB,0x60,0x79,0x3B,0xC2,0x9E,0x0B,0xDC,0xD4,0xA6,0x67, + 0xF7,0x66,0x3F,0xFC,0x42,0x3B,0x1B,0xDB,0x4F,0x66,0xDC,0xA5, + 0x8F,0x66,0xF9,0xEA,0xC1,0xED,0x31,0xFB,0x48,0xA1,0x82,0x7D, + 0xF8,0xE0,0xCC,0xB1,0xC7,0x03,0xE4,0xF8,0xB3,0xFE,0xB7,0xA3, + 0x13,0x73,0xA6,0x7B,0xC1,0x0E,0x39,0xC7,0x94,0x48,0x26,0x00, + 0x85,0x79,0xFC,0x6F,0x7A,0xAF,0xC5,0x52,0x35,0x75,0xD7,0x75, + 0xA4,0x40,0xFA,0x14,0x74,0x61,0x16,0xF2,0xEB,0x67,0x11,0x6F, + 0x04,0x43,0x3D,0x11,0x14,0x4C,0xA7,0x94,0x2A,0x39,0xA1,0xC9, + 0x90,0xCF,0x83,0xC6,0xFF,0x02,0x8F,0xA3,0x2A,0xAC,0x26,0xDF, + 0x0B,0x8B,0xBE,0x64,0x4A,0xF1,0xA1,0xDC,0xEE,0xBA,0xC8,0x03, + 0x82,0xF6,0x62,0x2C,0x5D,0xB6,0xBB,0x13,0x19,0x6E,0x86,0xC5, + 0x5B,0x2B,0x5E,0x3A,0xF3,0xB3,0x28,0x6B,0x70,0x71,0x3A,0x8E, + 0xFF,0x5C,0x15,0xE6,0x02,0xA4,0xCE,0xED,0x59,0x56,0xCC,0x15, + 0x51,0x07,0x79,0x1A,0x0F,0x25,0x26,0x27,0x30,0xA9,0x15,0xB2, + 0xC8,0xD4,0x5C,0xCC,0x30,0xE8,0x1B,0xD8,0xD5,0x0F,0x19,0xA8, + 0x80,0xA4,0xC7,0x01,0xAA,0x8B,0xBA,0x53,0xBB,0x47,0xC2,0x1F, + 0x6B,0x54,0xB0,0x17,0x60,0xED,0x79,0x21,0x95,0xB6,0x05,0x84, + 0x37,0xC8,0x03,0xA4,0xDD,0xD1,0x06,0x69,0x8F,0x4C,0x39,0xE0, + 0xC8,0x5D,0x83,0x1D,0xBE,0x6A,0x9A,0x99,0xF3,0x9F,0x0B,0x45, + 0x29,0xD4,0xCB,0x29,0x66,0xEE,0x1E,0x7E,0x3D,0xD7,0x13,0x4E, + 0xDB,0x90,0x90,0x58,0xCB,0x5E,0x9B,0xCD,0x2E,0x2B,0x0F,0xA9, + 0x4E,0x78,0xAC,0x05,0x11,0x7F,0xE3,0x9E,0x27,0xD4,0x99,0xE1, + 0xB9,0xBD,0x78,0xE1,0x84,0x41,0xA0,0xDF, + }; + static unsigned char dh4096_g[]={ + 0x02, + }; + DH* dh = DH_new(); + + if( !dh ) + return 0; + + dh->p = BN_bin2bn( dh4096_p, sizeof( dh4096_p ), 0 ); + dh->g = BN_bin2bn( dh4096_g, sizeof( dh4096_g ), 0 ); + if( ( dh->p == 0 ) || ( dh->g == 0 ) ) + { + DH_free( dh ); + return 0; + } + + return dh; + } + + DH* tmp_dh_callback( SSL* /*s*/, int is_export, int keylength ) + { + switch( keylength ) + { + case 512: + return getDH512(); + break; + case 1024: + return getDH1024(); + break; + case 2048: + return getDH2048(); + break; + case 4096: + return getDH4096(); + break; + default: + // unsupported DH param length requested + return 0; + break; + } + } + + RSA* tmp_rsa_callback( SSL* /*s*/, int is_export, int keylength ) + { + return RSA_generate_key( keylength, RSA_F4, 0, 0 ); + } + + bool OpenSSLServer::privateInit() + { + SSL_CTX_set_tmp_rsa_callback( m_ctx, tmp_rsa_callback ); + SSL_CTX_set_tmp_dh_callback( m_ctx, tmp_dh_callback ); + SSL_CTX_set_options( m_ctx, SSL_OP_CIPHER_SERVER_PREFERENCE ); + return true; + } + +} + +#endif // __SYMBIAN32__ + +#endif // HAVE_OPENSSL diff --git a/smack/smack/src/main/cpp/gloox/src/tlsopensslserver.h b/smack/smack/src/main/cpp/gloox/src/tlsopensslserver.h new file mode 100644 index 00000000..d7ae63eb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsopensslserver.h @@ -0,0 +1,64 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef TLSOPENSSLSERVER_H__ +#define TLSOPENSSLSERVER_H__ + +#include "tlsopensslbase.h" + +#include "config.h" + +#ifdef HAVE_OPENSSL + +#include + +namespace gloox +{ + + /** + * This class implements a TLS server backend using OpenSSL. + * + * @author Jakob Schröter + * @since 1.0 + */ + class OpenSSLServer : public OpenSSLBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + */ + OpenSSLServer( TLSHandler* th ); + + /** + * Virtual destructor. + */ + virtual ~OpenSSLServer(); + + private: + // reimplemented from OpenSSLBase + virtual bool privateInit(); + // reimplemented from OpenSSLBase + virtual bool setType(); + + // reimplemented from OpenSSLBase + virtual int handshakeFunction(); + + }; + +} + +#endif // HAVE_OPENSSL + +#endif // TLSOPENSSLSERVER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tlsschannel.cpp b/smack/smack/src/main/cpp/gloox/src/tlsschannel.cpp new file mode 100644 index 00000000..ae1910ac --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsschannel.cpp @@ -0,0 +1,836 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "tlsschannel.h" + +#ifdef HAVE_WINTLS + +#include // just for debugging output + +namespace gloox +{ + SChannel::SChannel( TLSHandler* th, const std::string& server ) + : TLSBase( th, server ), m_cleanedup( true ) + { + //printf(">> SChannel::SChannel()\n"); + } + + SChannel::~SChannel() + { + m_handler = 0; + cleanup(); + //printf(">> SChannel::~SChannel()\n"); + } + + bool SChannel::encrypt( const std::string& data ) + { + if( !m_handler ) + return false; + + //printf(">> SChannel::encrypt()\n"); + std::string data_copy = data; + + SecBuffer buffer[4]; + SecBufferDesc buffer_desc; + DWORD cbIoBufferLength = m_sizes.cbHeader + m_sizes.cbMaximumMessage + m_sizes.cbTrailer; + + PBYTE e_iobuffer = static_cast( malloc( cbIoBufferLength ) ); + + if( e_iobuffer == NULL ) + { + //printf("**** Out of memory (2)\n"); + cleanup(); + if( !m_secure ) + m_handler->handleHandshakeResult( this, false, m_certInfo ); + return false; + } + PBYTE e_message = e_iobuffer + m_sizes.cbHeader; + do + { + const size_t size = ( data_copy.size() > m_sizes.cbMaximumMessage ) + ? m_sizes.cbMaximumMessage + : data_copy.size(); + memcpy( e_message, data_copy.data(), size ); + if( data_copy.size() > m_sizes.cbMaximumMessage ) + data_copy.erase( 0, m_sizes.cbMaximumMessage ); + else + data_copy = EmptyString; + + buffer[0].pvBuffer = e_iobuffer; + buffer[0].cbBuffer = m_sizes.cbHeader; + buffer[0].BufferType = SECBUFFER_STREAM_HEADER; + + buffer[1].pvBuffer = e_message; + buffer[1].cbBuffer = size; + buffer[1].BufferType = SECBUFFER_DATA; + + buffer[2].pvBuffer = static_cast(buffer[1].pvBuffer) + buffer[1].cbBuffer; + buffer[2].cbBuffer = m_sizes.cbTrailer; + buffer[2].BufferType = SECBUFFER_STREAM_TRAILER; + + buffer[3].BufferType = SECBUFFER_EMPTY; + + buffer_desc.ulVersion = SECBUFFER_VERSION; + buffer_desc.cBuffers = 4; + buffer_desc.pBuffers = buffer; + + SECURITY_STATUS e_status = EncryptMessage( &m_context, 0, &buffer_desc, 0 ); + if( SUCCEEDED( e_status ) ) + { + std::string encrypted( reinterpret_cast(e_iobuffer), + buffer[0].cbBuffer + buffer[1].cbBuffer + buffer[2].cbBuffer ); + m_handler->handleEncryptedData( this, encrypted ); + //if (data_copy.size() <= m_sizes.cbMaximumMessage) data_copy = EmptyString; + } + else + { + free( e_iobuffer ); + e_iobuffer = 0; + if( !m_secure ) + m_handler->handleHandshakeResult( this, false, m_certInfo ); + cleanup(); + return false; + } + } + while( data_copy.size() > 0 ); + free( e_iobuffer ); + e_iobuffer = 0; + return true; + } + + int SChannel::decrypt( const std::string& data ) + { + + if( !m_handler ) + return 0; + + //printf(">> SChannel::decrypt()\n"); + if( m_secure ) + { + m_buffer += data; + + SecBuffer buffer[4]; + SecBufferDesc buffer_desc; + DWORD cbIoBufferLength = m_sizes.cbHeader + m_sizes.cbMaximumMessage + m_sizes.cbTrailer; + bool wantNewBufferSize = false; + + PBYTE e_iobuffer = static_cast( malloc( cbIoBufferLength ) ); + if( e_iobuffer == NULL ) + { + //printf("**** Out of memory (2)\n"); + cleanup(); + if( !m_secure ) + m_handler->handleHandshakeResult( this, false, m_certInfo ); + return 0; + } + SECURITY_STATUS e_status; + + do + { + if( wantNewBufferSize ) + { + void* tmp = realloc( e_iobuffer, cbIoBufferLength ); + if( tmp ) + { + e_iobuffer = static_cast( tmp ); + wantNewBufferSize = false; + } + else + { + //printf("**** Out of memory (2)\n"); + cleanup(); + m_handler->handleHandshakeResult( this, false, m_certInfo ); + return 0; + } + } + + // copy data chunk from tmp string into encryption memory buffer + memcpy( e_iobuffer, m_buffer.data(), m_buffer.size() > + cbIoBufferLength ? cbIoBufferLength : m_buffer.size() ); + + buffer[0].pvBuffer = e_iobuffer; + buffer[0].cbBuffer = static_cast( m_buffer.size() > cbIoBufferLength + ? cbIoBufferLength + : m_buffer.size() ); + buffer[0].BufferType = SECBUFFER_DATA; + buffer[1].cbBuffer = buffer[2].cbBuffer = buffer[3].cbBuffer = 0; + buffer[1].BufferType = buffer[2].BufferType = buffer[3].BufferType = SECBUFFER_EMPTY; + + buffer_desc.ulVersion = SECBUFFER_VERSION; + buffer_desc.cBuffers = 4; + buffer_desc.pBuffers = buffer; + + unsigned long processed_data = buffer[0].cbBuffer; + e_status = DecryptMessage( &m_context, &buffer_desc, 0, 0 ); + + // print_error(e_status, "decrypt() ~ DecryptMessage()"); + // for (int n=0; n<4; n++) + // printf("buffer[%d].cbBuffer: %d \t%d\n", n, buffer[n].cbBuffer, buffer[n].BufferType); + + // Locate data and (optional) extra buffers. + SecBuffer* pDataBuffer = NULL; + SecBuffer* pExtraBuffer = NULL; + for( int i = 1; i < 4; i++ ) + { + if( pDataBuffer == NULL && buffer[i].BufferType == SECBUFFER_DATA ) + { + pDataBuffer = &buffer[i]; + //printf("buffer[%d].BufferType = SECBUFFER_DATA\n",i); + } + if( pExtraBuffer == NULL && buffer[i].BufferType == SECBUFFER_EXTRA ) + { + pExtraBuffer = &buffer[i]; + } + } + if( e_status == SEC_E_OK ) + { + std::string decrypted( reinterpret_cast( pDataBuffer->pvBuffer ), + pDataBuffer->cbBuffer ); + m_handler->handleDecryptedData( this, decrypted ); + if( pExtraBuffer == NULL ) + { + m_buffer.erase( 0, processed_data ); + } + else + { + //std::cout << "m_buffer.size() = " << pExtraBuffer->cbBuffer << std::endl; + m_buffer.erase( 0, processed_data - pExtraBuffer->cbBuffer ); + //std::cout << "m_buffer.size() = " << m_buffer.size() << std::endl; + + cbIoBufferLength = m_sizes.cbHeader + m_sizes.cbMaximumMessage + m_sizes.cbTrailer; + wantNewBufferSize = true; + } + } + else if( e_status == SEC_E_INCOMPLETE_MESSAGE ) + { + if( cbIoBufferLength < 200000 && m_buffer.size() > cbIoBufferLength ) + { + cbIoBufferLength += 1000; + wantNewBufferSize = true; + } + else + { + cbIoBufferLength = m_sizes.cbHeader + m_sizes.cbMaximumMessage + m_sizes.cbTrailer; + wantNewBufferSize = true; + break; + } + } + else + { + //std::cout << "decrypt !!!ERROR!!!\n"; + if( !m_secure ) + m_handler->handleHandshakeResult( this, false, m_certInfo ); + cleanup(); + break; + } + } + while( m_buffer.size() != 0 ); + free( e_iobuffer ); + } + else + { + handshakeStage( data ); + } + //printf("<< SChannel::decrypt()\n"); + return 0; + } + + void SChannel::cleanup() + { + if( !m_mutex.trylock() ) + return; + + m_buffer = ""; + if( !m_cleanedup ) + { + m_valid = false; + m_secure = false; + m_cleanedup = true; + DeleteSecurityContext( &m_context ); + FreeCredentialsHandle( &m_credHandle ); + } + + m_mutex.unlock(); + } + + bool SChannel::handshake() + { + if( !m_handler ) + return false; + + //printf(">> SChannel::handshake()\n"); + SECURITY_STATUS error; + ULONG return_flags; + TimeStamp t; + SecBuffer obuf[1]; + SecBufferDesc obufs; + SCHANNEL_CRED tlscred; + ULONG request = ISC_REQ_ALLOCATE_MEMORY + | ISC_REQ_CONFIDENTIALITY + | ISC_REQ_EXTENDED_ERROR + | ISC_REQ_INTEGRITY + | ISC_REQ_REPLAY_DETECT + | ISC_REQ_SEQUENCE_DETECT + | ISC_REQ_STREAM + | ISC_REQ_MANUAL_CRED_VALIDATION; + + /* initialize TLS credential */ + memset( &tlscred, 0, sizeof( SCHANNEL_CRED ) ); + tlscred.dwVersion = SCHANNEL_CRED_VERSION; + tlscred.grbitEnabledProtocols = SP_PROT_TLS1; + /* acquire credentials */ + error = AcquireCredentialsHandle( 0, + UNISP_NAME, + SECPKG_CRED_OUTBOUND, + 0, + &tlscred, + 0, + 0, + &m_credHandle, + &t ); + //print_error(error, "handshake() ~ AcquireCredentialsHandle()"); + if( error != SEC_E_OK ) + { + cleanup(); + m_handler->handleHandshakeResult( this, false, m_certInfo ); + return false; + } + else + { + /* initialize buffers */ + obuf[0].cbBuffer = 0; + obuf[0].pvBuffer = 0; + obuf[0].BufferType = SECBUFFER_TOKEN; + /* initialize buffer descriptors */ + obufs.ulVersion = SECBUFFER_VERSION; + obufs.cBuffers = 1; + obufs.pBuffers = obuf; + /* negotiate security */ + SEC_CHAR* hname = const_cast( m_server.c_str() ); + + error = InitializeSecurityContextA( &m_credHandle, + 0, + hname, + request, + 0, + SECURITY_NETWORK_DREP, + 0, + 0, + &m_context, + &obufs, + &return_flags, + NULL ); + //print_error(error, "handshake() ~ InitializeSecurityContext()"); + + if( error == SEC_I_CONTINUE_NEEDED ) + { + m_cleanedup = false; + //std::cout << "obuf[1].cbBuffer: " << obuf[0].cbBuffer << "\n"; + std::string senddata( static_cast(obuf[0].pvBuffer), obuf[0].cbBuffer ); + FreeContextBuffer( obuf[0].pvBuffer ); + m_handler->handleEncryptedData( this, senddata ); + return true; + } + else + { + cleanup(); + m_handler->handleHandshakeResult( this, false, m_certInfo ); + return false; + } + } + } + + void SChannel::handshakeStage( const std::string& data ) + { + //printf(" >> handshake_stage\n"); + m_buffer += data; + + SECURITY_STATUS error; + ULONG a; + TimeStamp t; + SecBuffer ibuf[2], obuf[1]; + SecBufferDesc ibufs, obufs; + ULONG request = ISC_REQ_ALLOCATE_MEMORY + | ISC_REQ_CONFIDENTIALITY + | ISC_REQ_EXTENDED_ERROR + | ISC_REQ_INTEGRITY + | ISC_REQ_REPLAY_DETECT + | ISC_REQ_SEQUENCE_DETECT + | ISC_REQ_STREAM + | ISC_REQ_MANUAL_CRED_VALIDATION; + + SEC_CHAR* hname = const_cast( m_server.c_str() ); + + do + { + /* initialize buffers */ + ibuf[0].cbBuffer = static_cast( m_buffer.size() ); + ibuf[0].pvBuffer = static_cast( const_cast( m_buffer.c_str() ) ); + //std::cout << "Size: " << m_buffer.size() << "\n"; + ibuf[1].cbBuffer = 0; + ibuf[1].pvBuffer = 0; + obuf[0].cbBuffer = 0; + obuf[0].pvBuffer = 0; + + ibuf[0].BufferType = SECBUFFER_TOKEN; + ibuf[1].BufferType = SECBUFFER_EMPTY; + obuf[0].BufferType = SECBUFFER_EMPTY; + /* initialize buffer descriptors */ + ibufs.ulVersion = obufs.ulVersion = SECBUFFER_VERSION; + ibufs.cBuffers = 2; + obufs.cBuffers = 1; + ibufs.pBuffers = ibuf; + obufs.pBuffers = obuf; + + /* + * std::cout << "obuf[0].cbBuffer: " << obuf[0].cbBuffer << "\t" << obuf[0].BufferType << "\n"; + * std::cout << "ibuf[0].cbBuffer: " << ibuf[0].cbBuffer << "\t" << ibuf[0].BufferType << "\n"; + * std::cout << "ibuf[1].cbBuffer: " << ibuf[1].cbBuffer << "\t" << ibuf[1].BufferType << "\n"; + */ + + /* negotiate security */ + error = InitializeSecurityContextA( &m_credHandle, + &m_context, + hname, + request, + 0, + 0, + &ibufs, + 0, + 0, + &obufs, + &a, + &t ); + //print_error(error, "handshake() ~ InitializeSecurityContext()"); + if( error == SEC_E_OK ) + { + // EXTRA STUFF?? + if( ibuf[1].BufferType == SECBUFFER_EXTRA ) + { + m_buffer.erase( 0, m_buffer.size() - ibuf[1].cbBuffer ); + } + else + { + m_buffer = EmptyString; + } + setSizes(); + setCertinfos(); + + m_secure = true; + m_handler->handleHandshakeResult( this, true, m_certInfo ); + break; + } + else if( error == SEC_I_CONTINUE_NEEDED ) + { + /* + * std::cout << "obuf[0].cbBuffer: " << obuf[0].cbBuffer << "\t" << obuf[0].BufferType << "\n"; + * std::cout << "ibuf[0].cbBuffer: " << ibuf[0].cbBuffer << "\t" << ibuf[0].BufferType << "\n"; + * std::cout << "ibuf[1].cbBuffer: " << ibuf[1].cbBuffer << "\t" << ibuf[1].BufferType << "\n"; + */ + + // STUFF TO SEND?? + if( obuf[0].cbBuffer != 0 && obuf[0].pvBuffer != NULL ) + { + std::string senddata( static_cast(obuf[0].pvBuffer), obuf[0].cbBuffer ); + FreeContextBuffer( obuf[0].pvBuffer ); + m_handler->handleEncryptedData( this, senddata ); + } + // EXTRA STUFF?? + if( ibuf[1].BufferType == SECBUFFER_EXTRA ) + { + m_buffer.erase( 0, m_buffer.size() - ibuf[1].cbBuffer ); + // Call again if we aren't sending anything (otherwise the server will not send anything back + // and this function won't get called again to finish the processing). This is needed for + // NT4.0 which does not seem to process the entire buffer the first time around + if( obuf[0].cbBuffer == 0 ) + handshakeStage( EmptyString ); + } + else + { + m_buffer = EmptyString; + } + return; + } + else if( error == SEC_I_INCOMPLETE_CREDENTIALS ) + { + handshakeStage( EmptyString ); + } + else if( error == SEC_E_INCOMPLETE_MESSAGE ) + { + break; + } + else + { + cleanup(); + m_handler->handleHandshakeResult( this, false, m_certInfo ); + break; + } + } + while( true ); + } + + bool SChannel::hasChannelBinding() const + { +#ifdef HAVE_WINTLS_CHANNEL_BINDING + return true; +#else + return false; +#endif + } + + const std::string SChannel::channelBinding() const + { +#ifdef HAVE_WINTLS_CHANNEL_BINDING // see ../config.h.win if the following doesn't compile + SecPkgContext_Bindings buf; + if( QueryContextAttributes( &m_context, SECPKG_ATTR_UNIQUE_BINDINGS, &buf ) == SEC_E_OK ) + { + return std::string( buf->Bindings[buf->Bindings.dwApplicationDataOffset], buf->Bindings.cbApplicationDataLength ); + } +#endif + return EmptyString; + } + + void SChannel::setCACerts( const StringList& /*cacerts*/ ) {} + + void SChannel::setClientCert( const std::string& /*clientKey*/, const std::string& /*clientCerts*/ ) {} + + void SChannel::setSizes() + { + if( QueryContextAttributes( &m_context, SECPKG_ATTR_STREAM_SIZES, &m_sizes ) == SEC_E_OK ) + { + //std::cout << "set_sizes success\n"; + } + else + { + //std::cout << "set_sizes no success\n"; + cleanup(); + m_handler->handleHandshakeResult( this, false, m_certInfo ); + } + } + + int SChannel::filetime2int( FILETIME t ) + { + SYSTEMTIME stUTC; + FileTimeToSystemTime(&t, &stUTC); + std::tm ts; + ts.tm_year = stUTC.wYear - 1900; + ts.tm_mon = stUTC.wMonth - 1; + ts.tm_mday = stUTC.wDay; + ts.tm_hour = stUTC.wHour; + ts.tm_min = stUTC.wMinute; + ts.tm_sec = stUTC.wSecond; + + time_t unixtime; + if ( (unixtime = mktime(&ts)) == -1 ) + unixtime = 0; + return (int)unixtime; + } + + void SChannel::validateCert() + { + bool valid = false; + HTTPSPolicyCallbackData policyHTTPS; + CERT_CHAIN_POLICY_PARA policyParameter; + CERT_CHAIN_POLICY_STATUS policyStatus; + + PCCERT_CONTEXT remoteCertContext = NULL; + PCCERT_CHAIN_CONTEXT chainContext = NULL; + CERT_CHAIN_PARA chainParameter; + PSTR serverName = const_cast( m_server.c_str() ); + + PWSTR uServerName = NULL; + DWORD csizeServerName; + + LPSTR Usages[] = { + szOID_PKIX_KP_SERVER_AUTH, + szOID_SERVER_GATED_CRYPTO, + szOID_SGC_NETSCAPE + }; + DWORD cUsages = sizeof( Usages ) / sizeof( LPSTR ); + + do + { + // Get server's certificate. + if( QueryContextAttributes( &m_context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, + (PVOID)&remoteCertContext ) != SEC_E_OK ) + { + //printf("Error querying remote certificate\n"); + // !!! THROW SOME ERROR + break; + } + + // unicode conversation + // calculating unicode server name size + csizeServerName = MultiByteToWideChar( CP_ACP, 0, serverName, -1, NULL, 0 ); + uServerName = reinterpret_cast( malloc( csizeServerName * sizeof( WCHAR ) ) ); + if( uServerName == NULL ) + { + //printf("SEC_E_INSUFFICIENT_MEMORY ~ Not enough memory!!!\n"); + break; + } + + // convert into unicode + csizeServerName = MultiByteToWideChar( CP_ACP, 0, serverName, -1, uServerName, csizeServerName ); + if( csizeServerName == 0 ) + { + //printf("SEC_E_WRONG_PRINCIPAL\n"); + break; + } + + // create the chain + ZeroMemory( &chainParameter, sizeof( chainParameter ) ); + chainParameter.cbSize = sizeof( chainParameter ); + chainParameter.RequestedUsage.dwType = USAGE_MATCH_TYPE_OR; + chainParameter.RequestedUsage.Usage.cUsageIdentifier = cUsages; + chainParameter.RequestedUsage.Usage.rgpszUsageIdentifier = Usages; + + if( !CertGetCertificateChain( NULL, remoteCertContext, NULL, remoteCertContext->hCertStore, + &chainParameter, 0, NULL, &chainContext ) ) + { +// DWORD status = GetLastError(); +// printf("Error 0x%x returned by CertGetCertificateChain!!!\n", status); + break; + } + + // validate the chain + ZeroMemory( &policyHTTPS, sizeof( HTTPSPolicyCallbackData ) ); + policyHTTPS.cbStruct = sizeof( HTTPSPolicyCallbackData ); + policyHTTPS.dwAuthType = AUTHTYPE_SERVER; + policyHTTPS.fdwChecks = 0; + policyHTTPS.pwszServerName = uServerName; + + memset( &policyParameter, 0, sizeof( policyParameter ) ); + policyParameter.cbSize = sizeof( policyParameter ); + policyParameter.pvExtraPolicyPara = &policyHTTPS; + + memset( &policyStatus, 0, sizeof( policyStatus ) ); + policyStatus.cbSize = sizeof( policyStatus ); + + if( !CertVerifyCertificateChainPolicy( CERT_CHAIN_POLICY_SSL, chainContext, &policyParameter, + &policyStatus ) ) + { +// DWORD status = GetLastError(); +// printf("Error 0x%x returned by CertVerifyCertificateChainPolicy!!!\n", status); + break; + } + + if( policyStatus.dwError ) + { + //printf("Trust Error!!!}n"); + break; + } + valid = true; + } + while( false ); + // cleanup + if( chainContext ) CertFreeCertificateChain( chainContext ); + m_certInfo.chain = valid; + } + + void SChannel::connectionInfos() + { + SecPkgContext_ConnectionInfo conn_info; + + memset( &conn_info, 0, sizeof( conn_info ) ); + + if( QueryContextAttributes( &m_context, SECPKG_ATTR_CONNECTION_INFO, &conn_info ) == SEC_E_OK ) + { + switch( conn_info.dwProtocol ) + { + case SP_PROT_TLS1_CLIENT: + m_certInfo.protocol = "TLSv1"; + break; + case SP_PROT_SSL3_CLIENT: + m_certInfo.protocol = "SSLv3"; + break; + default: + m_certInfo.protocol = "unknown"; + } + + switch( conn_info.aiCipher ) + { + case CALG_3DES: + m_certInfo.cipher = "3DES"; + break; + case CALG_AES_128: + m_certInfo.cipher = "AES_128"; + break; + case CALG_AES_256: + m_certInfo.cipher = "AES_256"; + break; + case CALG_DES: + m_certInfo.cipher = "DES"; + break; + case CALG_RC2: + m_certInfo.cipher = "RC2"; + break; + case CALG_RC4: + m_certInfo.cipher = "RC4"; + break; + default: + m_certInfo.cipher = EmptyString; + } + + switch( conn_info.aiHash ) + { + case CALG_MD5: + m_certInfo.mac = "MD5"; + break; + case CALG_SHA: + m_certInfo.mac = "SHA"; + break; + default: + m_certInfo.mac = EmptyString; + } + } + } + + void SChannel::certData() + { + PCCERT_CONTEXT remoteCertContext = NULL; + CHAR certString[1000]; + + // getting server's certificate + if( QueryContextAttributes( &m_context, SECPKG_ATTR_REMOTE_CERT_CONTEXT, + (PVOID)&remoteCertContext ) != SEC_E_OK ) + { + return; + } + + // setting certificat's lifespan + m_certInfo.date_from = filetime2int( remoteCertContext->pCertInfo->NotBefore ); + m_certInfo.date_to = filetime2int( remoteCertContext->pCertInfo->NotAfter ); + + if( !CertNameToStrA( remoteCertContext->dwCertEncodingType, + &remoteCertContext->pCertInfo->Subject, + CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG, + certString, sizeof( certString ) ) ) + { + return; + } + m_certInfo.server = certString; + + if( !CertNameToStrA( remoteCertContext->dwCertEncodingType, + &remoteCertContext->pCertInfo->Issuer, + CERT_X500_NAME_STR | CERT_NAME_STR_NO_PLUS_FLAG, + certString, sizeof( certString ) ) ) + { + return; + } + m_certInfo.issuer = certString; + } + + void SChannel::setCertinfos() + { + validateCert(); + connectionInfos(); + certData(); + } + +#if 0 + void SChannel::print_error( int errorcode, const char* place ) + { + printf( "Win error at %s.\n", place ); + switch( errorcode ) + { + case SEC_E_OK: + printf( "\tValue:\tSEC_E_OK\n" ); + printf( "\tDesc:\tNot really an error. Everything is fine.\n" ); + break; + case SEC_E_INSUFFICIENT_MEMORY: + printf( "\tValue:\tSEC_E_INSUFFICIENT_MEMORY\n" ); + printf( "\tDesc:\tThere is not enough memory available to complete the requested action.\n" ); + break; + case SEC_E_INTERNAL_ERROR: + printf( "\tValue:\tSEC_E_INTERNAL_ERROR\n" ); + printf( "\tDesc:\tAn error occurred that did not map to an SSPI error code.\n" ); + break; + case SEC_E_NO_CREDENTIALS: + printf( "\tValue:\tSEC_E_NO_CREDENTIALS\n" ); + printf( "\tDesc:\tNo credentials are available in the security package.\n" ); + break; + case SEC_E_NOT_OWNER: + printf( "\tValue:\tSEC_E_NOT_OWNER\n" ); + printf( "\tDesc:\tThe caller of the function does not have the necessary credentials.\n" ); + break; + case SEC_E_SECPKG_NOT_FOUND: + printf( "\tValue:\tSEC_E_SECPKG_NOT_FOUND\n" ); + printf( "\tDesc:\tThe requested security package does not exist. \n" ); + break; + case SEC_E_UNKNOWN_CREDENTIALS: + printf( "\tValue:\tSEC_E_UNKNOWN_CREDENTIALS\n" ); + printf( "\tDesc:\tThe credentials supplied to the package were not recognized.\n" ); + break; + case SEC_E_INCOMPLETE_MESSAGE: + printf( "\tValue:\tSEC_E_INCOMPLETE_MESSAGE\n" ); + printf( "\tDesc:\tData for the whole message was not read from the wire.\n" ); + break; + case SEC_E_INVALID_HANDLE: + printf( "\tValue:\tSEC_E_INVALID_HANDLE\n" ); + printf( "\tDesc:\tThe handle passed to the function is invalid.\n" ); + break; + case SEC_E_INVALID_TOKEN: + printf( "\tValue:\tSEC_E_INVALID_TOKEN\n" ); + printf( "\tDesc:\tThe error is due to a malformed input token, such as a token " + "corrupted in transit...\n" ); + break; + case SEC_E_LOGON_DENIED: + printf( "\tValue:\tSEC_E_LOGON_DENIED\n" ); + printf( "\tDesc:\tThe logon failed.\n" ); + break; + case SEC_E_NO_AUTHENTICATING_AUTHORITY: + printf( "\tValue:\tSEC_E_NO_AUTHENTICATING_AUTHORITY\n" ); + printf( "\tDesc:\tNo authority could be contacted for authentication...\n" ); + break; + case SEC_E_TARGET_UNKNOWN: + printf( "\tValue:\tSEC_E_TARGET_UNKNOWN\n" ); + printf( "\tDesc:\tThe target was not recognized.\n" ); + break; + case SEC_E_UNSUPPORTED_FUNCTION: + printf( "\tValue:\tSEC_E_UNSUPPORTED_FUNCTION\n" ); + printf( "\tDesc:\tAn invalid context attribute flag (ISC_REQ_DELEGATE or " + "ISC_REQ_PROMPT_FOR_CREDS)...\n" ); + break; + case SEC_E_WRONG_PRINCIPAL: + printf( "\tValue:\tSEC_E_WRONG_PRINCIPAL\n" ); + printf( "\tDesc:\tThe principal that received the authentication request " + "is not the same as the...\n" ); + break; + case SEC_I_COMPLETE_AND_CONTINUE: + printf( "\tValue:\tSEC_I_COMPLETE_AND_CONTINUE\n" ); + printf( "\tDesc:\tThe client must call CompleteAuthToken and then pass the output...\n" ); + break; + case SEC_I_COMPLETE_NEEDED: + printf( "\tValue:\tSEC_I_COMPLETE_NEEDED\n" ); + printf( "\tDesc:\tThe client must finish building the message and then " + "call the CompleteAuthToken function.\n" ); + break; + case SEC_I_CONTINUE_NEEDED: + printf( "\tValue:\tSEC_I_CONTINUE_NEEDED\n" ); + printf( "\tDesc:\tThe client must send the output token to the server " + "and wait for a return token...\n" ); + break; + case SEC_I_INCOMPLETE_CREDENTIALS: + printf( "\tValue:\tSEC_I_INCOMPLETE_CREDENTIALS\n" ); + printf( "\tDesc:\tThe server has requested client authentication, " + "and the supplied credentials either...\n" ); + break; + default: + printf( "\tValue:\t%d\n", errorcode ); + printf( "\tDesc:\tUnknown error code.\n" ); + } + } +#endif + +} + +#endif // HAVE_WINTLS diff --git a/smack/smack/src/main/cpp/gloox/src/tlsschannel.h b/smack/smack/src/main/cpp/gloox/src/tlsschannel.h new file mode 100644 index 00000000..71b4a40a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tlsschannel.h @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#ifndef TLSSCHANNEL_H__ +#define TLSSCHANNEL_H__ + +#include "tlsbase.h" + +#include "config.h" + +#ifdef HAVE_WINTLS + +#include + +#define SECURITY_WIN32 +#include +#include +#include + +namespace gloox +{ + + /** + * This class implements a TLS backend using SChannel. + * + * @author Jakob Schröter + * @since 0.9 + */ + class SChannel : public TLSBase + { + public: + /** + * Constructor. + * @param th The TLSHandler to handle TLS-related events. + * @param server The server to use in certificate verification. + */ + SChannel( TLSHandler* th, const std::string& server ); + + /** + * Virtual destructor. + */ + virtual ~SChannel(); + + // reimplemented from TLSBase + virtual bool init( const std::string& /*clientKey*/ = EmptyString, + const std::string& /*clientCerts*/ = EmptyString, + const StringList& /*cacerts*/ = StringList() ) + { return true; } + + // reimplemented from TLSBase + virtual bool encrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual int decrypt( const std::string& data ); + + // reimplemented from TLSBase + virtual void cleanup(); + + // reimplemented from TLSBase + virtual bool handshake(); + + // reimplemented from TLSBase + virtual bool hasChannelBinding() const; + + // reimplemented from TLSBase + virtual const std::string channelBinding() const; + + // reimplemented from TLSBase + virtual void setCACerts( const StringList& cacerts ); + + // reimplemented from TLSBase + virtual void setClientCert( const std::string& clientKey, const std::string& clientCerts ); + + private: + void handshakeStage( const std::string& data ); + void setSizes(); + + int filetime2int( FILETIME t ); + + void validateCert(); + void connectionInfos(); + void certData(); + void setCertinfos(); + CredHandle m_credHandle; + CtxtHandle m_context; + + SecPkgContext_StreamSizes m_sizes; + + size_t m_header_max; + size_t m_message_max; + size_t m_trailer_max; + + std::string m_buffer; + + bool m_cleanedup; + + // windows error outputs +// void print_error( int errorcode, const char* place = 0 ); + + }; +} + +#endif // HAVE_WINTLS + +#endif // TLSSCHANNEL_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/uniquemucroom.cpp b/smack/smack/src/main/cpp/gloox/src/uniquemucroom.cpp new file mode 100644 index 00000000..8f4cfcf7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/uniquemucroom.cpp @@ -0,0 +1,109 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "uniquemucroom.h" +#include "clientbase.h" +#include "jid.h" +#include "sha.h" + +namespace gloox +{ + + // ---- UniqueMUCRoom::Unique ---- + UniqueMUCRoom::Unique::Unique( const Tag* tag ) + : StanzaExtension( ExtMUCUnique ) + { + if( !tag || tag->name() != "unique" || tag->xmlns() != XMLNS_MUC_UNIQUE ) + return; + + m_name = tag->cdata(); + } + + const std::string& UniqueMUCRoom::Unique::filterString() const + { + static const std::string filter = "/iq/unique[@xmlns='" + XMLNS_MUC_UNIQUE + "']"; + return filter; + } + + Tag* UniqueMUCRoom::Unique::tag() const + { + Tag* t = new Tag( "unique" ); + t->setXmlns( XMLNS_MUC_UNIQUE ); + if( !m_name.empty() ) + t->setCData( m_name ); + return t; + } + // ---- ~UniqueMUCRoom::Unique ---- + + // ---- UniqueMUCRoom ---- + UniqueMUCRoom::UniqueMUCRoom( ClientBase* parent, const JID& nick, MUCRoomHandler* mrh ) + : InstantMUCRoom( parent, nick, mrh ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new Unique() ); + } + } + + UniqueMUCRoom::~UniqueMUCRoom() + { + if( m_parent ) + { + m_parent->removeIDHandler( this ); +// m_parent->removeStanzaExtension( ExtMUCUnique ); // don't remove, other rooms might need it + } + } + + void UniqueMUCRoom::join() + { + if( !m_parent || m_joined ) + return; + + IQ iq( IQ::Get, m_nick.server() ); + iq.addExtension( new Unique() ); + m_parent->send( iq, this, RequestUniqueName ); + } + + void UniqueMUCRoom::handleIqID( const IQ& iq, int context ) + { + switch( iq.subtype() ) + { + case IQ::Result: + if( context == RequestUniqueName ) + { + const Unique* u = iq.findExtension( ExtMUCUnique ); + if( u ) + { + if( !u->name().empty() ) + setName( u->name() ); + } + } + break; + case IQ::Error: + if( context == RequestUniqueName ) + { + SHA s; + s.feed( m_parent->jid().full() ); + s.feed( m_parent->getID() ); + setName( s.hex() ); + } + break; + default: + break; + } + + MUCRoom::join(); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/uniquemucroom.h b/smack/smack/src/main/cpp/gloox/src/uniquemucroom.h new file mode 100644 index 00000000..39db8cf4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/uniquemucroom.h @@ -0,0 +1,117 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef UNIQUEMUCROOM_H__ +#define UNIQUEMUCROOM_H__ + +#include "instantmucroom.h" +#include "stanzaextension.h" + +namespace gloox +{ + + /** + * @brief This class implements a unique MUC room. + * + * A unique MUC room is a room with a non-human-readable name. It is primarily intended + * to be used when converting one-to-one chats to multi-user chats. + * + * XEP version: 1.21 + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API UniqueMUCRoom : public InstantMUCRoom + { + public: + /** + * Creates a new abstraction of a @b unique Multi-User Chat room. The room is not joined + * automatically. Use join() to join the room, use leave() to leave it. See MUCRoom for + * detailed info. + * @param parent The ClientBase object to use for the communication. + * @param nick The service to create the room on plus the desired nickname in the form + * @b service/nick. + * @param mrh The MUCRoomHandler that will listen to room events. May be 0 and may be specified + * later using registerMUCRoomHandler(). However, without one, MUC is no joy. + * @note To subsequently configure the room, use MUCRoom::registerMUCRoomConfigHandler(). + */ + UniqueMUCRoom( ClientBase* parent, const JID& nick, MUCRoomHandler* mrh ); + + /** + * Virtual Destructor. + */ + virtual ~UniqueMUCRoom(); + + // reimplemented from MUCRoom + virtual void join(); + + private: +#ifdef UNIQUEMUCROOM_TEST + public: +#endif + /** + * @brief A stanza extension wrapping MUC's <unique> element. + * + * @author Jakob Schröter + * @since 1.0 + */ + class Unique : public StanzaExtension + { + public: + /** + * Creates a new object from the given Tag. + * @param tag The Tag to parse. + */ + Unique( const Tag* tag = 0 ); + + /** + *Virtual Destructor. + */ + virtual ~Unique() {} + + /** + * Returns the unique name created by the server. + * @return The server-created unique room name. + */ + const std::string& name() const { return m_name; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Unique( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Unique( *this ); + } + + private: + std::string m_name; + }; + + // reimplemented from MUCRoom (IqHandler) + void handleIqID( const IQ& iq, int context ); + + }; + +} + +#endif // UNIQUEMUCROOM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/util.cpp b/smack/smack/src/main/cpp/gloox/src/util.cpp new file mode 100644 index 00000000..e4c62975 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/util.cpp @@ -0,0 +1,197 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "util.h" +#include "gloox.h" + +#include + +namespace gloox +{ + + namespace util + { + + int internalLog2( unsigned int n ) + { + int pos = 0; + if ( n >= 1<<16 ) { n >>= 16; pos += 16; } + if ( n >= 1<< 8 ) { n >>= 8; pos += 8; } + if ( n >= 1<< 4 ) { n >>= 4; pos += 4; } + if ( n >= 1<< 2 ) { n >>= 2; pos += 2; } + if ( n >= 1<< 1 ) { pos += 1; } + return ( (n == 0) ? (-1) : pos ); + } + + unsigned _lookup( const std::string& str, const char* values[], unsigned size, int def ) + { + unsigned i = 0; + for( ; i < size && str != values[i]; ++i ) + ; + return ( i == size && def >= 0 ) ? (unsigned)def : i; + } + + const std::string _lookup( unsigned code, const char* values[], unsigned size, const std::string& def ) + { + return code < size ? std::string( values[code] ) : def; + } + + unsigned _lookup2( const std::string& str, const char* values[], + unsigned size, int def ) + { + return 1 << _lookup( str, values, size, def <= 0 ? def : (int)internalLog2( def ) ); + } + + const std::string _lookup2( unsigned code, const char* values[], unsigned size, const std::string& def ) + { + const unsigned i = (unsigned)internalLog2( code ); + return i < size ? std::string( values[i] ) : def; + } + + std::string hex( const std::string& input ) + { + const char* H = input.c_str(); + char* buf = new char[input.length() * 2 + 1]; + for( unsigned int i = 0; i < input.length(); ++i ) + sprintf( buf + i * 2, "%02x", (unsigned char)( H[i] ) ); + return std::string( buf, 40 ); + } + + static const char escape_chars[] = { '&', '<', '>', '\'', '"' }; + + static const std::string escape_seqs[] = { "amp;", "lt;", "gt;", "apos;", "quot;" }; + + static const std::string escape_seqs_full[] = { "&", "<", ">", "'", """ }; + + static const unsigned escape_size = 5; + + const std::string escape( std::string what ) + { + for( size_t val, i = 0; i < what.length(); ++i ) + { + for( val = 0; val < escape_size; ++val ) + { + if( what[i] == escape_chars[val] ) + { + what[i] = '&'; + what.insert( i+1, escape_seqs[val] ); + i += escape_seqs[val].length(); + break; + } + } + } + return what; + } + + void appendEscaped( std::string& target, const std::string& data ) + { + size_t rangeStart = 0, rangeCount = 0; + size_t length = data.length(); + const char* dataPtr = data.data(); + for( size_t val, i = 0; i < length; ++i ) + { + const char current = dataPtr[i]; + for( val = 0; val < escape_size; ++val ) + { + if( current == escape_chars[val] ) + { + // We have a character that needs to be escaped. + if( rangeCount > 0 ) + { + // We have a range of the data that needs to be appended + // before we escape the current character. + // NOTE: Use "data" (std::string) here not dataPtr (const char*). + // Both have the same content, but there isn't + // an append override that takes const char*, pos, n + // (so a temporary std::string would be created) + target.append( data, rangeStart, rangeCount ); + } + target.append( escape_seqs_full[val] ); + rangeStart = i + 1; + rangeCount = 0; + break; + } + } + + if( rangeStart <= i ) + { + // current did not need to be escaped + ++rangeCount; + } + } + + if( rangeCount > 0 ) + { + // Append the remaining pending range of data that does + // not need to be escaped. + // NOTE: See previous comment on using data not dataPtr for append. + target.append( data, rangeStart, rangeCount ); + } + } + + bool checkValidXMLChars( const std::string& data ) + { + if( data.empty() ) + return true; + + const char* dataPtr = data.data(); + const char* end = dataPtr + data.length(); + for( ; dataPtr != end; ++dataPtr ) + { + unsigned char current = (unsigned char) *dataPtr; + if( current < 0x20 ) + { + if( current == 0x09 + || current == 0x0a + || current == 0x0d ) + // Valid character + continue; + else + // Invalid character + break; + } + else if( current >= 0xf5 ) + // Invalid character + break; + else if( current == 0xc0 + || current == 0xc1 ) + // Invalid character + break; + else + // Valid character + continue; + } + + return ( dataPtr == end ); + } + + void replaceAll( std::string& target, const std::string& find, const std::string& replace ) + { + std::string::size_type findSize = find.size(); + std::string::size_type replaceSize = replace.size(); + + if( findSize == 0 ) + return; + + std::string::size_type index = target.find( find, 0 ); + + while( index != std::string::npos ) + { + target.replace( index, findSize, replace ); + index = target.find( find, index+replaceSize ); + } + } + + } + +} + diff --git a/smack/smack/src/main/cpp/gloox/src/util.h b/smack/smack/src/main/cpp/gloox/src/util.h new file mode 100644 index 00000000..39944a7b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/util.h @@ -0,0 +1,287 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef UTIL_H__ +#define UTIL_H__ + +#include "gloox.h" + +#include +#include +#include +#include +#include +#include + +namespace gloox +{ + + /** + * @brief A namespace holding a couple utility functions. + */ + namespace util + { + + #define lookup( a, b ) _lookup( a, b, sizeof(b)/sizeof(char*) ) + #define lookup2( a, b ) _lookup2( a, b, sizeof(b)/sizeof(char*) ) + #define deflookup( a, b, c ) _lookup( a, b, sizeof(b)/sizeof(char*), c ) + #define deflookup2( a, b, c ) _lookup2( a, b, sizeof(b)/sizeof(char*), c ) + + /** + * Finds the enumerated value associated with a string value. + * @param str String to search for. + * @param values Array of String/Code pairs to look into. + * @param size The array's size. + * @param def Default value returned in case the lookup failed. + * @return The associated enum code. + */ + GLOOX_API unsigned _lookup( const std::string& str, const char* values[], + unsigned size, int def = -1 ); + + /** + * Finds the string associated with an enumerated type. + * @param code Code of the string to search for. + * @param values Array of String/Code pairs to look into. + * @param size The array's size. + * @param def Default value returned in case the lookup failed. + * @return The associated string (empty in case there's no match). + */ + GLOOX_API const std::string _lookup( unsigned code, const char* values[], + unsigned size, const std::string& def = EmptyString ); + + /** + * Finds the ORable enumerated value associated with a string value. + * @param str String to search for. + * @param values Array of String/Code pairs to look into. + * @param size The array's size. + * @param def The default value to return if the lookup failed. + * @return The associated enum code. + */ + GLOOX_API unsigned _lookup2( const std::string& str, const char* values[], + unsigned size, int def = -1 ); + + /** + * Finds the string associated with an ORable enumerated type. + * @param code Code of the string to search for. + * @param values Array of String/Code pairs to look into. + * @param size The array's size. + * @param def The default value to return if the lookup failed. + * @return The associated string (empty in case there's no match). + */ + GLOOX_API const std::string _lookup2( unsigned code, const char* values[], + unsigned size, const std::string& def = EmptyString ); + + /** + * Returns the input string in hex notation. + * @param input The (binary) input string. + * @return The input string in hex notation. + */ + std::string hex( const std::string& input ); + + /** + * A convenience function that executes the given function on each object in a given list. + * @param t The object to execute the function on. + * @param f The function to execute. + */ + template< typename T, typename F > + inline void ForEach( T& t, F f ) + { + for( typename T::iterator it = t.begin(); it != t.end(); ++it ) + ( (*it)->*f )(); + } + + /** + * A convenience function that executes the given function on each object in a given list, + * passing the given argument. + * @param t The object to execute the function on. + * @param f The function to execute. + * @param d An argument to pass to the function. + */ + template< typename T, typename F, typename D > + inline void ForEach( T& t, F f, D& d ) + { + for( typename T::iterator it = t.begin(); it != t.end(); ++it ) + ( (*it)->*f )( d ); + } + + /** + * A convenience function that executes the given function on each object in a given list, + * passing the given arguments. + * @param t The object to execute the function on. + * @param f The function to execute. + * @param d1 An argument to pass to the function. + * @param d2 An argument to pass to the function. + */ + template< typename T, typename F, typename D1, typename D2 > + inline void ForEach( T& t, F f, D1& d1, D2& d2 ) + { + for( typename T::iterator it = t.begin(); it != t.end(); ++it ) + ( (*it)->*f )( d1, d2 ); + } + + /** + * A convenience function that executes the given function on each object in a given list, + * passing the given arguments. + * @param t The object to execute the function on. + * @param f The function to execute. + * @param d1 An argument to pass to the function. + * @param d2 An argument to pass to the function. + * @param d3 An argument to pass to the function. + */ + template< typename T, typename F, typename D1, typename D2, typename D3 > + inline void ForEach( T& t, F f, D1& d1, D2& d2, D3& d3 ) + { + for( typename T::iterator it = t.begin(); it != t.end(); ++it ) + ( (*it)->*f )( d1, d2, d3 ); + } + + /** + * Delete all elements from a list of pointers. + * @param L List of pointers to delete. + */ + template< typename T > + inline void clearList( std::list< T* >& L ) + { + typename std::list< T* >::iterator it = L.begin(); + typename std::list< T* >::iterator it2; + while( it != L.end() ) + { + it2 = it++; + delete (*it2); + L.erase( it2 ); + } + } + + /** + * Delete all associated values from a map (not the key elements). + * @param M Map of pointer values to delete. + */ + template< typename Key, typename T > + inline void clearMap( std::map< Key, T* >& M ) + { + typename std::map< Key, T* >::iterator it = M.begin(); + typename std::map< Key, T* >::iterator it2; + while( it != M.end() ) + { + it2 = it++; + delete (*it2).second; + M.erase( it2 ); + } + } + + /** + * Delete all associated values from a map (not the key elements). + * Const key type version. + * @param M Map of pointer values to delete. + */ + template< typename Key, typename T > + inline void clearMap( std::map< const Key, T* >& M ) + { + typename std::map< const Key, T* >::iterator it = M.begin(); + typename std::map< const Key, T* >::iterator it2; + while( it != M.end() ) + { + it2 = it++; + delete (*it2).second; + M.erase( it2 ); + } + } + + /** + * Does some fancy escaping. (& --> &amp;, etc). + * @note If you intend to append the result of escape + * to another string, use the faster appendEscaped. + * @param what A string to escape. + * @return The escaped string. + */ + GLOOX_API const std::string escape( std::string what ); + + /** + * Append the data to the target, doing any necessary escaping + * along the way (& --> &amp;, etc). + * This method is faster than calling "escape" and appending the + * return value, especially for source strings that don't need + * any escaping. + * @param target The string to append the data to. + * @param data The string to append that might need escaping. + */ + GLOOX_API void appendEscaped( std::string& target, const std::string& data ); + + /** + * Checks whether the given input is valid UTF-8. + * @param data The data to check for validity. + * @return @@b True if the input is valid UTF-8, @b false otherwise. + */ + GLOOX_API bool checkValidXMLChars( const std::string& data ); + + /** + * Custom log2() implementation. + * @param n Figure to take the logarithm from. + * @return The logarithm to the basis of 2. + */ + GLOOX_API int internalLog2( unsigned int n ); + + /** + * Replace all instances of one substring of arbitrary length + * with another substring of arbitrary length. Replacement happens + * in place (so make a copy first if you don't want the original modified). + * @param target The string to process. Changes are made "in place". + * @param find The sub-string to find within the target string + * @param replace The sub-string to substitute for the find string. + * @todo Look into merging with util::escape() and Parser::decode(). + */ + GLOOX_API void replaceAll( std::string& target, const std::string& find, const std::string& replace ); + + /** + * Converts a long int to its string representation. + * @param value The long integer value. + * @param base The integer's base. + * @return The long int's string represenation. + */ + static inline const std::string long2string( long int value, const int base = 10 ) + { + if( base < 2 || base > 16 || value == 0 ) + return "0"; + + std::string output; + std::string sign; + + if( value < 0 ) + { + sign += "-"; + value = -value; + } + + while( output.empty() || value > 0 ) + { + output.insert( (size_t)0, (size_t)1, static_cast( value % base + '0' ) ); + value /= base; + } + + return sign + output; + } + + /** + * Converts an int to its string representation. + * @param value The integer value. + * @return The int's string represenation. + */ + static inline const std::string int2string( int value ) + { + return long2string( value ); + } + + } + +} + +#endif // UTIL_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/vcard.cpp b/smack/smack/src/main/cpp/gloox/src/vcard.cpp new file mode 100644 index 00000000..cacda21a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/vcard.cpp @@ -0,0 +1,559 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "vcard.h" +#include "tag.h" +#include "base64.h" + +namespace gloox +{ + + void VCard::insertField( Tag* vcard, const char* field, const std::string& var ) + { + if( field && !var.empty() ) + new Tag( vcard, field, var ); + } + + void VCard::insertField( Tag* vcard, const char* field, bool var ) + { + if( field && var ) + new Tag( vcard, field ); + } + + void VCard::checkField( const Tag* vcard, const char* field, std::string& var ) + { + if( field ) + { + Tag* child = vcard->findChild( field ); + if( child ) + var = child->cdata(); + } + } + + VCard::VCard() + : StanzaExtension( ExtVCard ), m_class( ClassNone ), m_prodid( "gloox" + GLOOX_VERSION ), + m_N( false ), m_PHOTO( false ), m_LOGO( false ) + { + m_valid = true; + } + + VCard::VCard( const Tag* vcard ) + : StanzaExtension( ExtVCard ), m_class( ClassNone ), m_prodid( "gloox" + GLOOX_VERSION ), + m_N( false ), m_PHOTO( false ), m_LOGO( false ) + { + if( !vcard || vcard->name() != "vCard" || vcard->xmlns() != XMLNS_VCARD_TEMP ) + return; + + m_valid = true; + + checkField( vcard, "FN", m_formattedname ); + checkField( vcard, "NICKNAME", m_nickname ); + checkField( vcard, "URL", m_url ); + checkField( vcard, "BDAY", m_bday ); + checkField( vcard, "JABBERID", m_jabberid ); + checkField( vcard, "TITLE", m_title ); + checkField( vcard, "ROLE", m_role ); + checkField( vcard, "NOTE", m_note ); + checkField( vcard, "DESC", m_desc ); + checkField( vcard, "MAILER", m_mailer ); + checkField( vcard, "TZ", m_tz ); + checkField( vcard, "PRODID", m_prodid ); + checkField( vcard, "REV", m_rev ); + checkField( vcard, "SORT-STRING", m_sortstring ); + checkField( vcard, "UID", m_uid ); + + TagList::const_iterator it = vcard->children().begin(); + for( ; it != vcard->children().end(); ++it ) + { + const Tag& tag = *(*it); + if( tag.name() == "N" ) + { + m_N = true; + const Tag * child = tag.findChild( "FAMILY" ); + if( child ) + m_name.family = child->cdata(); + if( ( child = tag.findChild( "GIVEN" ) ) ) + m_name.given = child->cdata(); + if( ( child = tag.findChild( "MIDDLE" ) ) ) + m_name.middle = child->cdata(); + if( ( child = tag.findChild( "PREFIX" ) ) ) + m_name.prefix = child->cdata(); + if( ( child = tag.findChild( "SUFFIX" ) ) ) + m_name.suffix = child->cdata(); + } + else if( tag.name() == "PHOTO" ) + { + if( tag.hasChild( "EXTVAL" ) ) + { + m_photo.extval = tag.findChild( "EXTVAL" )->cdata(); + m_PHOTO = true; + } + else if( tag.hasChild( "TYPE" ) && tag.hasChild( "BINVAL" ) ) + { + std::string binval = tag.findChild( "BINVAL" )->cdata(); + std::string::size_type pos = 0; + while( ( pos = binval.find( '\n' ) ) != std::string::npos ) + binval.erase( pos, 1 ); + while( ( pos = binval.find( '\r' ) ) != std::string::npos ) + binval.erase( pos, 1 ); + m_photo.type = tag.findChild( "TYPE" )->cdata(); + m_photo.binval = Base64::decode64( binval ); + m_PHOTO = true; + } + } + else if( tag.name() == "LOGO" ) + { + if( tag.hasChild( "EXTVAL" ) ) + { + m_logo.extval = tag.findChild( "EXTVAL" )->cdata(); + m_LOGO = true; + } + else if( tag.hasChild( "TYPE" ) && tag.hasChild( "BINVAL" ) ) + { + std::string binval = tag.findChild( "BINVAL" )->cdata(); + std::string::size_type pos = 0; + while( ( pos = binval.find( '\n' ) ) != std::string::npos ) + binval.erase( pos, 1 ); + while( ( pos = binval.find( '\r' ) ) != std::string::npos ) + binval.erase( pos, 1 ); + m_logo.type = tag.findChild( "TYPE" )->cdata(); + m_logo.binval = Base64::decode64( binval ); + m_LOGO = true; + } + } + else if( tag.name() == "EMAIL" && tag.hasChild( "USERID" ) ) + { + Email item; + item.userid = tag.findChild( "USERID" )->cdata(); + item.internet = tag.hasChild( "INTERNET" ); + item.x400 = tag.hasChild( "X400" ); + item.work = tag.hasChild( "WORK" ); + item.home = tag.hasChild( "HOME" ); + item.pref = tag.hasChild( "PREF" ); + m_emailList.push_back( item ); + } + else if( tag.name() == "ADR" ) + { + Address item; + checkField( &tag, "POBOX", item.pobox ); + checkField( &tag, "EXTADD", item.extadd ); + checkField( &tag, "STREET", item.street ); + checkField( &tag, "LOCALITY", item.locality ); + checkField( &tag, "REGION", item.region ); + checkField( &tag, "PCODE", item.pcode ); + checkField( &tag, "CTRY", item.ctry ); + item.postal = tag.hasChild( "POSTAL" ); + item.parcel = tag.hasChild( "PARCEL" ); + item.work = tag.hasChild( "WORK" ); + item.home = tag.hasChild( "HOME" ); + item.pref = tag.hasChild( "PREF" ); + item.dom = tag.hasChild( "DOM" ); + item.intl = !item.dom && tag.hasChild( "INTL" ); + m_addressList.push_back( item ); + } + else if( tag.name() == "LABEL" ) + { + Label item; + TagList::const_iterator it2 = tag.children().begin(); + for( ; it2 != tag.children().end(); ++it2 ) + { + if( (*it2)->name() == "LINE" ) + item.lines.push_back( (*it)->cdata() ); + item.postal = (*it2)->name() == "POSTAL"; + item.parcel = (*it2)->name() == "PARCEL"; + item.work = (*it2)->name() == "WORK"; + item.home = (*it2)->name() == "HOME"; + item.pref = (*it2)->name() == "PREF"; + item.dom = (*it2)->name() == "DOM"; + item.intl = !item.dom && (*it2)->name() == "INTL"; + } + m_labelList.push_back( item ); + } + else if( tag.name() == "TEL" && tag.hasChild( "NUMBER" ) ) + { + Telephone item; + item.number = tag.findChild( "NUMBER" )->cdata(); + item.work = tag.hasChild( "WORK" ); + item.home = tag.hasChild( "HOME" ); + item.voice = tag.hasChild( "VOICE" ); + item.fax = tag.hasChild( "FAX" ); + item.pager = tag.hasChild( "PAGER" ); + item.msg = tag.hasChild( "MSG" ); + item.cell = tag.hasChild( "CELL" ); + item.video = tag.hasChild( "VIDEO" ); + item.bbs = tag.hasChild( "BBS" ); + item.modem = tag.hasChild( "MODEM" ); + item.isdn = tag.hasChild( "ISDN" ); + item.pcs = tag.hasChild( "PCS" ); + item.pref = tag.hasChild( "PREF" ); + m_telephoneList.push_back( item ); + } + else if( tag.name() == "ORG" ) + { + TagList::const_iterator ito = tag.children().begin(); + for( ; ito != tag.children().end(); ++ito ) + { + if( (*ito)->name() == "ORGNAME" ) + m_org.name = (*ito)->cdata(); + else if( (*ito)->name() == "ORGUNIT" ) + m_org.units.push_back( (*ito)->cdata() ); + } + } + else if( tag.name() == "GEO" ) + { + checkField( &tag, "LON", m_geo.longitude ); + checkField( &tag, "LAT", m_geo.latitude ); + } + else if( tag.name() == "CLASS" ) + { + if( tag.hasChild( "PRIVATE" ) ) + m_class = ClassPrivate; + else if( tag.hasChild( "PUBLIC" ) ) + m_class = ClassPublic; + else if( tag.hasChild( "CONFIDENTIAL" ) ) + m_class = ClassConfidential; + } + + } + + } + + void VCard::setName( const std::string& family, const std::string& given, + const std::string& middle, const std::string& prefix, + const std::string& suffix ) + { + m_name.family = family; + m_name.given = given; + m_name.middle = middle; + m_name.prefix = prefix; + m_name.suffix = suffix; + m_N = true; + } + + void VCard::setPhotoUri( const std::string& extval ) + { + if( !extval.empty() ) + { + m_photo.extval= extval; + m_PHOTO = true; + } + } + + void VCard::setPhoto( const std::string& type, const std::string& binval ) + { + if( !type.empty() && !binval.empty() ) + { + m_photo.type = type; + m_photo.binval = binval; + m_PHOTO = true; + } + else + { + m_photo.type = EmptyString; + m_photo.binval = EmptyString; + m_photo.extval = EmptyString; + m_PHOTO = false; + } + } + + void VCard::setLogo( const std::string& extval ) + { + if( !extval.empty() ) + { + m_logo.extval = extval; + m_LOGO = true; + } + } + + void VCard::setLogo( const std::string& type, const std::string& binval ) + { + if( !type.empty() && !binval.empty() ) + { + m_logo.type = type; + m_logo.binval = binval; + m_LOGO = true; + } + else + { + m_logo.type = EmptyString; + m_logo.binval = EmptyString; + m_logo.extval = EmptyString; + m_LOGO = false; + } + } + + void VCard::addEmail( const std::string& userid, int type ) + { + if( userid.empty() ) + return; + + Email item; + item.userid = userid; + item.internet = ((type & AddrTypeInet) == AddrTypeInet); + item.x400 = ((type & AddrTypeX400) == AddrTypeX400); + item.work = ((type & AddrTypeWork) == AddrTypeWork); + item.home = ((type & AddrTypeHome) == AddrTypeHome); + item.pref = ((type & AddrTypePref) == AddrTypePref); + + m_emailList.push_back( item ); + } + + void VCard::addAddress( const std::string& pobox, const std::string& extadd, + const std::string& street, const std::string& locality, + const std::string& region, const std::string& pcode, + const std::string& ctry, int type ) + { + if( pobox.empty() && extadd.empty() && street.empty() && + locality.empty() && region.empty() && pcode.empty() && ctry.empty() ) + return; + + Address item; + item.pobox = pobox; + item.extadd = extadd; + item.street = street; + item.locality = locality; + item.region = region; + item.pcode = pcode; + item.ctry = ctry; + item.home = ((type & AddrTypeHome) == AddrTypeHome); + item.work = ((type & AddrTypeWork) == AddrTypeWork); + item.parcel = ((type & AddrTypeParcel) == AddrTypeParcel); + item.postal = ((type & AddrTypePostal) == AddrTypePostal); + item.dom = ((type & AddrTypeDom) == AddrTypeDom); + item.intl = !item.dom && ((type & AddrTypeIntl) == AddrTypeIntl); + item.pref = ((type & AddrTypePref) == AddrTypePref); + + m_addressList.push_back( item ); + } + + void VCard::addLabel( const StringList& lines, int type ) + { + if( lines.empty() ) + return; + + Label item; + item.lines = lines; + item.work = ((type & AddrTypeWork) == AddrTypeWork); + item.home = ((type & AddrTypeHome) == AddrTypeHome); + item.postal = ((type & AddrTypePostal) == AddrTypePostal); + item.parcel = ((type & AddrTypeParcel) == AddrTypeParcel); + item.pref = ((type & AddrTypePref) == AddrTypePref); + item.dom = ((type & AddrTypeDom) == AddrTypeDom); + item.intl = !item.dom && ((type & AddrTypeIntl) == AddrTypeIntl); + + m_labelList.push_back( item ); + } + + void VCard::addTelephone( const std::string& number, int type ) + { + if( number.empty() ) + return; + + Telephone item; + item.number = number; + item.work = ((type & AddrTypeWork) == AddrTypeWork); + item.home = ((type & AddrTypeHome) == AddrTypeHome); + item.voice = ((type & AddrTypeVoice) == AddrTypeVoice); + item.fax = ((type & AddrTypeFax) == AddrTypeFax); + item.pager = ((type & AddrTypePager) == AddrTypePager); + item.msg = ((type & AddrTypeMsg) == AddrTypeMsg); + item.cell = ((type & AddrTypeCell) == AddrTypeCell); + item.video = ((type & AddrTypeVideo) == AddrTypeVideo); + item.bbs = ((type & AddrTypeBbs) == AddrTypeBbs); + item.modem = ((type & AddrTypeModem) == AddrTypeModem); + item.isdn = ((type & AddrTypeIsdn) == AddrTypeIsdn); + item.pcs = ((type & AddrTypePcs) == AddrTypePcs); + item.pref = ((type & AddrTypePref) == AddrTypePref); + + m_telephoneList.push_back( item ); + } + + void VCard::setGeo( const std::string& lat, const std::string& lon ) + { + if( !lat.empty() && !lon.empty() ) + { + m_geo.latitude = lat; + m_geo.longitude = lon; + } + } + + void VCard::setOrganization( const std::string& orgname, const StringList& orgunits ) + { + if( !orgname.empty() ) + { + m_org.name = orgname; + m_org.units = orgunits; + } + } + + const std::string& VCard::filterString() const + { + static const std::string filter = "/iq/vCard[@xmlns='" + XMLNS_VCARD_TEMP + "']"; + return filter; + } + + Tag* VCard::tag() const + { + Tag* v = new Tag( "vCard" ); + v->setXmlns( XMLNS_VCARD_TEMP ); + + if( !m_valid ) + return v; + + v->addAttribute( "version", "3.0" ); + + insertField( v, "FN", m_formattedname ); + insertField( v, "NICKNAME", m_nickname ); + insertField( v, "URL", m_url ); + insertField( v, "BDAY", m_bday ); + insertField( v, "JABBERID", m_jabberid ); + insertField( v, "TITLE", m_title ); + insertField( v, "ROLE", m_role ); + insertField( v, "NOTE", m_note ); + insertField( v, "DESC", m_desc ); + insertField( v, "MAILER", m_mailer ); + insertField( v, "TZ", m_tz ); + insertField( v, "REV", m_rev ); + insertField( v, "SORT_STRING", m_sortstring ); + insertField( v, "UID", m_uid ); + + if( m_N ) + { + Tag* n = new Tag( v, "N" ); + insertField( n, "FAMILY", m_name.family ); + insertField( n, "GIVEN", m_name.given ); + insertField( n, "MIDDLE", m_name.middle ); + insertField( n, "PREFIX", m_name.prefix ); + insertField( n, "SUFFIX", m_name.suffix ); + } + + if( m_PHOTO ) + { + Tag* p = new Tag( v, "PHOTO" ); + if( !m_photo.extval.empty() ) + { + new Tag( p, "EXTVAL", m_photo.extval ); + } + else if( !m_photo.type.empty() && !m_photo.binval.empty() ) + { + new Tag( p, "TYPE", m_photo.type ); + new Tag( p, "BINVAL", Base64::encode64( m_photo.binval ) ); + } + } + + if( m_LOGO ) + { + Tag* l = new Tag( v, "LOGO" ); + if( !m_logo.extval.empty() ) + { + new Tag( l, "EXTVAL", m_logo.extval ); + } + else if( !m_logo.type.empty() && !m_logo.binval.empty() ) + { + new Tag( l, "TYPE", m_logo.type ); + new Tag( l, "BINVAL", Base64::encode64( m_logo.binval ) ); + } + } + + EmailList::const_iterator ite = m_emailList.begin(); + for( ; ite != m_emailList.end(); ++ite ) + { + Tag* e = new Tag( v, "EMAIL" ); + insertField( e, "INTERNET", (*ite).internet ); + insertField( e, "WORK", (*ite).work ); + insertField( e, "HOME", (*ite).home ); + insertField( e, "X400", (*ite).x400 ); + insertField( e, "PREF", (*ite).pref ); + insertField( e, "USERID", (*ite).userid ); + } + + AddressList::const_iterator ita = m_addressList.begin(); + for( ; ita != m_addressList.end(); ++ita ) + { + Tag* a = new Tag( v, "ADR" ); + insertField( a, "POSTAL", (*ita).postal ); + insertField( a, "PARCEL", (*ita).parcel ); + insertField( a, "HOME", (*ita).home ); + insertField( a, "WORK", (*ita).work ); + insertField( a, "PREF", (*ita).pref ); + insertField( a, "DOM", (*ita).dom ); + if( !(*ita).dom ) + insertField( a, "INTL", (*ita).intl ); + + insertField( a, "POBOX", (*ita).pobox ); + insertField( a, "EXTADD", (*ita).extadd ); + insertField( a, "STREET", (*ita).street ); + insertField( a, "LOCALITY", (*ita).locality ); + insertField( a, "REGION", (*ita).region ); + insertField( a, "PCODE", (*ita).pcode ); + insertField( a, "CTRY", (*ita).ctry ); + } + + TelephoneList::const_iterator itt = m_telephoneList.begin(); + for( ; itt != m_telephoneList.end(); ++itt ) + { + Tag* t = new Tag( v, "TEL" ); + insertField( t, "NUMBER", (*itt).number ); + insertField( t, "HOME", (*itt).home ); + insertField( t, "WORK", (*itt).work ); + insertField( t, "VOICE", (*itt).voice ); + insertField( t, "FAX", (*itt).fax ); + insertField( t, "PAGER", (*itt).pager ); + insertField( t, "MSG", (*itt).msg ); + insertField( t, "CELL", (*itt).cell ); + insertField( t, "VIDEO", (*itt).video ); + insertField( t, "BBS", (*itt).bbs ); + insertField( t, "MODEM", (*itt).modem ); + insertField( t, "ISDN", (*itt).isdn ); + insertField( t, "PCS", (*itt).pcs ); + insertField( t, "PREF", (*itt).pref ); + } + + if( !m_geo.latitude.empty() && !m_geo.longitude.empty() ) + { + Tag* g = new Tag( v, "GEO" ); + new Tag( g, "LAT", m_geo.latitude ); + new Tag( g, "LON", m_geo.longitude ); + } + + if( !m_org.name.empty() ) + { + Tag* o = new Tag( v, "ORG" ); + new Tag( o, "ORGNAME", m_org.name ); + StringList::const_iterator ito = m_org.units.begin(); + for( ; ito != m_org.units.end(); ++ito ) + new Tag( o, "ORGUNIT", (*ito) ); + } + + if( m_class != ClassNone ) + { + Tag* c = new Tag( v, "CLASS" ); + switch( m_class ) + { + case ClassPublic: + new Tag( c, "PUBLIC" ); + break; + case ClassPrivate: + new Tag( c, "PRIVATE" ); + break; + case ClassConfidential: + new Tag( c, "CONFIDENTIAL" ); + break; + default: + break; + } + } + + return v; + } +} diff --git a/smack/smack/src/main/cpp/gloox/src/vcard.h b/smack/smack/src/main/cpp/gloox/src/vcard.h new file mode 100644 index 00000000..ed8f4058 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/vcard.h @@ -0,0 +1,627 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef VCARD_H__ +#define VCARD_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +namespace gloox +{ + + class Tag; + + /** + * @brief A VCard abstraction. + * + * See @link gloox::VCardManager VCardManager @endlink for info on how to + * fetch VCards. + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API VCard : public StanzaExtension + { + public: + /** + * Addressing type indicators. + * @note @c AddrTypeDom and @c AddrTypeIntl are mutually exclusive. If both are present, + * @c AddrTypeDom takes precendence. + * @note Also note that not all adress types are applicable everywhere. For example, + * @c AddrTypeIsdn does not make sense for a postal address. Check @xep{0054} + * for details. + */ + enum AddressType + { + AddrTypeHome = 1, /**< Home address. */ + AddrTypeWork = 2, /**< Work address. */ + AddrTypePref = 4, /**< Preferred address. */ + AddrTypeX400 = 8, /**< X.400 address. */ + AddrTypeInet = 16, /**< Internet address. */ + AddrTypeParcel = 32, /**< Parcel address. */ + AddrTypePostal = 64, /**< Postal address. */ + AddrTypeDom = 128, /**< Domestic(?) address. */ + AddrTypeIntl = 256, /**< International(?) address. */ + AddrTypeVoice = 512, /**< Voice number. */ + AddrTypeFax = 1024, /**< Fax number. */ + AddrTypePager = 2048, /**< Pager. */ + AddrTypeMsg = 4096, /**< MSG(?) */ + AddrTypeCell = 8192, /**< Cell phone number. */ + AddrTypeVideo = 16384, /**< Video chat(?). */ + AddrTypeBbs = 32768, /**< BBS. */ + AddrTypeModem = 65536, /**< Modem. */ + AddrTypeIsdn = 131072, /**< ISDN. */ + AddrTypePcs = 262144 /**< PCS. */ + }; + + /** + * A person's full name. + */ + struct Name + { + std::string family; /**< Family name. */ + std::string given; /**< Given name. */ + std::string middle; /**< Middle name. */ + std::string prefix; /**< Name prefix. */ + std::string suffix; /**< Name suffix. */ + }; + + /** + * Classifies the VCard. + */ + enum VCardClassification + { + ClassNone = 0, /**< Not classified. */ + ClassPublic = 1, /**< Public. */ + ClassPrivate = 2, /**< Private. */ + ClassConfidential = 4 /**< Confidential. */ + }; + + /** + * Describes an email field. + */ + struct Email + { + std::string userid; /**< Email address. */ + bool home; /**< Whether this is a personal address. */ + bool work; /**< Whether this is a work address. */ + bool internet; /**< Whether this is an internet address(?). */ + bool pref; /**< Whether this is the preferred address. */ + bool x400; /**< Whether this is an X.400 address. */ + }; + + /** + * A list of email fields. + */ + typedef std::list EmailList; + + /** + * Describes a telephone number entry. + */ + struct Telephone + { + std::string number; /**< The phone number. */ + bool home; /**< Whether this is a personal number. */ + bool work; /**< Whether this is a work number. */ + bool voice; /**< Whether this is a voice number. */ + bool fax; /**< Whether this is a fax number. */ + bool pager; /**< Whether this is a pager. */ + bool msg; /**< MSG(?) */ + bool cell; /**< Whether this is a cell phone. */ + bool video; /**< Whether this is a video chat(?). */ + bool bbs; /**< Whether this is a BBS. */ + bool modem; /**< Whether this is a modem. */ + bool isdn; /**< Whether this is a ISDN line(?) */ + bool pcs; /**< PCS(?) */ + bool pref; /**< Whether this is the preferred number. */ + }; + + /** + * A list of telephone entries. + */ + typedef std::list TelephoneList; + + /** + * Describes an address entry. + */ + struct Address + { + std::string pobox; /**< Pobox. */ + std::string extadd; /**< Extended address. */ + std::string street; /**< Street. */ + std::string locality; /**< Locality. */ + std::string region; /**< Region. */ + std::string pcode; /**< Postal code. */ + std::string ctry; /**< Country. */ + bool home; /**< Whether this is a personal address. */ + bool work; /**< Whether this is a work address. */ + bool postal; /**< Whether this is a postal address(?). */ + bool parcel; /**< Whether this is a arcel address(?). */ + bool pref; /**< Whether this is the preferred address. */ + bool dom; /**< Whether this is a domestic(?) address. */ + bool intl; /**< Whether this is an international(?) address. */ + }; + + /** + * Describes an address label. + */ + struct Label + { + StringList lines; /**< A list of lines. */ + bool home; /**< Whether this is a personal address. */ + bool work; /**< Whether this is a work address. */ + bool postal; /**< Whether this is a postal address(?). */ + bool parcel; /**< Whether this is a arcel address(?). */ + bool pref; /**< Whether this is the preferred address. */ + bool dom; /**< Whether this is a domestic(?) address. */ + bool intl; /**< Whether this is an international(?) address. */ + }; + + /** + * Describes geo information. + */ + struct Geo + { + std::string latitude; /**< Longitude. */ + std::string longitude; /**< Latitude. */ + }; + + /** + * Describes organization information. + */ + struct Org + { + std::string name; /**< The organizations name. */ + StringList units; /**< A list of units in the organization + * (the VCard's owner belongs to?). */ + }; + + /** + * Describes photo/logo information. + */ + struct Photo + { + std::string extval; /**< The photo is not stored inside the VCard. This is a hint (URL?) + * where to look for it. */ + std::string binval; /**< This is the photo (binary). */ + std::string type; /**< This is a hint at the mime-type. May be forged! */ + }; + + /** + * A list of address entries. + */ + typedef std::list
    AddressList; + + /** + * A list of address labels. + */ + typedef std::list

    Wv?}>GUb16l!2(NN-EO`Mv2N( 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Μp*PQY{x0-yDs!Ku*NxAKS)_0S#aFUm_Mb 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­U=wqsQ?c%8?%*yJIZ$=+MjV$WcAVmMu1HWY58U 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 literal 0 HcmV?d00001 diff --git a/smack/oh-package-lock.json5 b/smack/oh-package-lock.json5 new file mode 100644 index 00000000..bc40219d --- /dev/null +++ b/smack/oh-package-lock.json5 @@ -0,0 +1,13 @@ +{ + "lockfileVersion": 1, + "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", + "specifiers": { + "@ohos/hypium@1.0.6": "@ohos/hypium@1.0.6" + }, + "packages": { + "@ohos/hypium@1.0.6": { + "resolved": "https://repo.harmonyos.com/ohpm/@ohos/hypium/-/hypium-1.0.6.tgz", + "integrity": "sha512-bb3DWeWhYrFqj9mPFV3yZQpkm36kbcK+YYaeY9g292QKSjOdmhEIQR2ULPvyMsgSR4usOBf5nnYrDmaCCXirgQ==" + } + } +} \ No newline at end of file diff --git a/smack/package.json b/smack/package.json new file mode 100644 index 00000000..804d895e --- /dev/null +++ b/smack/package.json @@ -0,0 +1,18 @@ +{ + "license":"GPL", + "devDependencies":{}, + "name":"openharmony_smack", + "ohos":{ + "org":"huawei", + "directoryLevel":"project", + "buildTool":"hvigor" + }, + "description":"example description", + "repository":{}, + "version":"1.0.0", + "dependencies":{ + "@ohos/hypium":"1.0.1", + "@ohos/hvigor-ohos-plugin":"1.1.6", + "@ohos/hvigor":"1.1.6" + } +} \ No newline at end of file diff --git a/smack/smack/.gitignore b/smack/smack/.gitignore new file mode 100644 index 00000000..4f9a9738 --- /dev/null +++ b/smack/smack/.gitignore @@ -0,0 +1,3 @@ +/node_modules +/.preview +/build \ No newline at end of file diff --git a/smack/smack/build-profile.json5 b/smack/smack/build-profile.json5 new file mode 100644 index 00000000..78fa1b77 --- /dev/null +++ b/smack/smack/build-profile.json5 @@ -0,0 +1,22 @@ +{ + "apiType": "stageMode", + "buildOption": { + "externalNativeOptions": { + "path": "./src/main/cpp/CMakeLists.txt", + "arguments": "-v -DOHOS_STL=c++_shared", + "abiFilters": [ + "armeabi-v7a", + "arm64-v8a" + ], + "cppFlags": "", + } + }, + "targets": [ + { + "name": "default", + }, + { + "name": "ohosTest", + } + ] +} diff --git a/smack/smack/hvigorfile.js b/smack/smack/hvigorfile.js new file mode 100644 index 00000000..42ed4b4a --- /dev/null +++ b/smack/smack/hvigorfile.js @@ -0,0 +1,3 @@ +// Script for compiling build behavior. It is built in the build plug-in and cannot be modified currently. +module.exports = require('@ohos/hvigor-ohos-plugin').harTasks + diff --git a/smack/smack/index.ts b/smack/smack/index.ts new file mode 100644 index 00000000..2706ae8b --- /dev/null +++ b/smack/smack/index.ts @@ -0,0 +1,24 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +export { Smack } from './src/main/ets/Smack' +export { RoomConfig } from './src/main/ets/RoomConfig' + +export { PresenceType } from './src/main/ets/PresenceType' + +export { FriendsEntity } from './src/main/ets/FriendsEntity' + +export { MUCRoomAffiliation } from './src/main/ets/MUCRoomAffiliation' + +export { MUCRoomRole } from './src/main/ets/MUCRoomRole' + +export { PresenceRoomType } from './src/main/ets/PresenceRoomType' + +export { MUCOperation } from './src/main/ets/MUCOperation' diff --git a/smack/smack/package.json b/smack/smack/package.json new file mode 100644 index 00000000..3ec91b10 --- /dev/null +++ b/smack/smack/package.json @@ -0,0 +1,26 @@ +{ + "types":"", + "keywords":[ + "OpenHarmony", + "smack" + ], + "author":"hihope", + "license":"GPL-3.0-or-later", + "devDependencies":{ + "@types/libentry.so":"file:./src/main/cpp/types/libentry" + }, + "name":"@ohos/smack", + "version":"1.0.0", + "description":"A client based on XMPP protocol", + "ohos":{ + "org":"opensource" + }, + "tags":[ + "OpenHarmony", + "smack", + "Tool" + ], + "main":"index.ts", + "repository":"https://gitee.com/hihopeorg/smack", + "dependencies":{} +} \ No newline at end of file diff --git a/smack/smack/src/main/cpp/CMakeLists.txt b/smack/smack/src/main/cpp/CMakeLists.txt new file mode 100644 index 00000000..171b9646 --- /dev/null +++ b/smack/smack/src/main/cpp/CMakeLists.txt @@ -0,0 +1,21 @@ +# the minimum version of CMake. +cmake_minimum_required(VERSION 3.4.1) +project(XComponent) + +set(NATIVERENDER_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) +aux_source_directory(gloox/src SOUCE_FILES) +include_directories(${NATIVERENDER_ROOT_PATH} + ${NATIVERENDER_ROOT_PATH}/include + gloox + ) + +add_library(entry SHARED + hello.cpp + log_ohos.cpp + Smack.cpp + room.cpp + registration.cpp + MyMUCInvitationHandler.cpp + ${SOUCE_FILES}) + +target_link_libraries(entry PUBLIC libace_napi.z.so libc++.a libhilog_ndk.z.so) \ No newline at end of file diff --git a/smack/smack/src/main/cpp/MyMUCInvitationHandler.cpp b/smack/smack/src/main/cpp/MyMUCInvitationHandler.cpp new file mode 100644 index 00000000..1d2fd12a --- /dev/null +++ b/smack/smack/src/main/cpp/MyMUCInvitationHandler.cpp @@ -0,0 +1,47 @@ + + +#include "MyMUCInvitationHandler.h" +#include "log.h" + +using namespace gloox; + +void handleMUCInvitationListener(const std::string &v0); + +void MyMUCInvitationHandler::handleMUCInvitation(const JID &room, const JID &from, const std::string &reason, + const std::string &body, const std::string &password, + bool cont, const std::string &thread) { + + std::string jsonStr; + jsonStr.append("{"); + jsonStr.append("\"room\":\""); + jsonStr.append(room.full().c_str()); + jsonStr.append("\","); + jsonStr.append("\"from\":\""); + jsonStr.append(from.full().c_str()); + jsonStr.append("\","); + jsonStr.append("\"reason\":\""); + jsonStr.append(reason.c_str()); + jsonStr.append("\","); + jsonStr.append("\"body\":\""); + jsonStr.append(body.c_str()); + jsonStr.append("\","); + jsonStr.append("\"password\":\""); + jsonStr.append(password.c_str()); + jsonStr.append("\","); + jsonStr.append("\"cont\":\""); + jsonStr.append(""); + jsonStr.append("\","); + jsonStr.append("\"thread\":\""); + jsonStr.append(thread.c_str()); + + jsonStr.append("\""); + jsonStr.append("}"); + LOGW("Test MyMUCInvitationHandler %s",jsonStr.c_str()); + + LOGW("Test MyMUCInvitationHandler handleMUCInvitation room: %s, from:%s, reason:%s, body:%s, password:%s, cont:%s, thread:%s", room.full().c_str(), from.full().c_str(), reason.c_str(), body.c_str(), password.c_str(), cont, thread.c_str()); + handleMUCInvitationListener(jsonStr.c_str()); +} + +MyMUCInvitationHandler::MyMUCInvitationHandler(ClientBase *parent) : MUCInvitationHandler(parent) { + clientBase = parent; +} diff --git a/smack/smack/src/main/cpp/MyMUCInvitationHandler.h b/smack/smack/src/main/cpp/MyMUCInvitationHandler.h new file mode 100644 index 00000000..ec8f3803 --- /dev/null +++ b/smack/smack/src/main/cpp/MyMUCInvitationHandler.h @@ -0,0 +1,38 @@ +#ifndef ohosXmppClient_MyMUCInvitationHandler_H +#define ohosXmppClient_MyMUCInvitationHandler_H + + +#include +#include +#include + +using namespace gloox; + + + class MyMUCInvitationHandler : public MUCInvitationHandler + { + public: + + MyMUCInvitationHandler(ClientBase *parent); + + /** + * This function is called for incoming invitations to MUC rooms. + * @param room The JID of the room you're being invited to. + * @param from The JID of the inviter. + * @param reason A reason for the invitation. + * @param body The body of the message. May contain a MUC-service generated invitation message. + * @param password Optionally, a password for the room. + * @param cont Indicates whether or not the multi-user chat is a continuation of a private chat. + * @param thread An optional thread identifier in case this is a + * continued chat. + */ + virtual void handleMUCInvitation( const JID& room, const JID& from, const std::string& reason, + const std::string& body, const std::string& password, + bool cont, const std::string& thread ); + + private: + ClientBase * clientBase; + }; + +#endif //ohosXmppClient_MyMUCInvitationHandler_H + diff --git a/smack/smack/src/main/cpp/Smack.cpp b/smack/smack/src/main/cpp/Smack.cpp new file mode 100644 index 00000000..4a74f1ac --- /dev/null +++ b/smack/smack/src/main/cpp/Smack.cpp @@ -0,0 +1,594 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +#include +#include +#include +#include +#include +#include "Smack.h" +#include +#include "gloox/src/disco.h" + +#include "log.h" +#include "src/gloox.h" + +/** + * + * @param jidStr 当前登陆用的地址 例如:user@10.50.40.65/gloox + * @param pwd 当前用户的登陆密码 + * + * 注:当前的返回值没有添加 + * 返回-1 表示登陆失败 + * 返回 1 表示登陆成功 + */ +int UserState = -1; +void delay_msec(int msec) { + clock_t now = clock(); + while (clock() - now < msec) + ; +} + +Smack::Smack() { + j = new Client(""); +}; +bool Smack::connect() { + if (userName == "" || userName.empty()) { + throw "userName empty,set userName!!!"; + } + std::string server = j->server(); + if (server == "" || server.empty()) { + throw "server empty,set server!!!"; + } + std::string resource = j->resource(); + if (resource.empty()) { + throw "resource empty,set resource!!!"; + } + JID jids(userName + "@" + server + "/" + resource); + j->setJID(jids); + j->registerConnectionListener(this); + + j->logInstance().registerLogHandler(LogLevelDebug, LogAreaAll, this); + if (j->connect(false)) { + } + return isConnected(); +} + +bool Smack::isConnected() { + ConnectionState state = j->state(); + return state >= StateConnected; +} + +std::string Smack::username() { + return j->username(); +} +void Smack::setServer(const std::string &server) { + j->setServer(server); +} + +void Smack::setUsernameAndPassword(std::string username, std::string pwd) { + userName = username; + setPassword(pwd); +} + +void Smack::setPassword(const std::string &password) { + j->setPassword(password); +} + +void Smack::setPort(int port) { + j->setPort(port); +} +std::string Smack::password() { + return j->password(); +} + +std::string Smack::resource() { + return j->resource(); +} +void Smack::setResource(const std::string &resource) { + j->setResource(resource); +} +JID &Smack::getMyJID() { + return m_jid; +} +Client *Smack::getClent() { + return j; +} +bool Smack::login() { + //Registration + m_reg = new Registration(j); + m_reg->registerRegistrationHandler(this); + + MUCInvitationHandler *handler = new MyMUCInvitationHandler(j); + //注册房间邀请监听 + j->registerMUCInvitationHandler(handler); + + //rosterManager + j->rosterManager()->registerRosterListener(this); + + j->registerSubscriptionHandler(this); + + j->registerPresenceHandler(this); + j->registerMessageHandler(this); + j->registerMessageSessionHandler(this, 0); + // j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + j->disco()->setVersion("messageTest", GLOOX_VERSION, "OHOS"); + j->disco()->setIdentity("client", "bot"); + j->disco()->addFeature(XMLNS_CHAT_STATES); + + { + std::thread t1(&Smack::loop, this); + t1.detach(); + } + + delay_msec(5 * 1000 * 60); //延时5秒 + return presenceType == 0; +} +std::string Smack::server() { + return j->server(); +} +int Smack::authed() { + return j->authed() ? 1 : 0; +} +int Smack::port() { + return j->port(); +} +int Smack::compression() { + return j->compression() ? 1 : 0; +} + +int Smack::login(const std::string &jidStr, const std::string &pwd) { + UserState = -1; + + JID jid(jidStr); + m_jid = jid; + j = new Client(jid, pwd); + + j->registerConnectionListener(this); + + //Registration + m_reg = new Registration(j); + m_reg->registerRegistrationHandler(this); + + MUCInvitationHandler *handler = new MyMUCInvitationHandler(j); + //注册房间邀请监听 + j->registerMUCInvitationHandler(handler); + + //rosterManager + j->rosterManager()->registerRosterListener(this); + + j->registerSubscriptionHandler(this); + + j->registerPresenceHandler(this); + j->registerMessageHandler(this); + j->registerMessageSessionHandler(this, 0); + j->logInstance().registerLogHandler(LogLevelDebug, LogAreaAll, this); + j->disco()->setVersion("messageTest", GLOOX_VERSION, "OHOS"); + j->disco()->setIdentity("client", "bot"); + j->disco()->addFeature(XMLNS_CHAT_STATES); + + bool value = j->connect(false); + if (value) { + std::thread t1(&Smack::loop, this); + t1.detach(); + } + delay_msec(5 * 1000 * 500); + + return UserState; +} + +/** + * 修改用户状态 + * @param pres + * @param priority + * @param status + */ +void Smack::changePresence(const std::string &statusType, const std::string &status) { + if (statusType.compare("0") == 0) { + j->setPresence(Presence::PresenceType::Chat, 50, status); + } else if (statusType.compare("1") == 0) { + j->setPresence(Presence::PresenceType::Available, 50, status); + } else if (statusType.compare("2") == 0) { + j->setPresence(Presence::PresenceType::Away, 50, status); + } else if (statusType.compare("3") == 0) { + j->setPresence(Presence::PresenceType::XA, 50, status); + } else if (statusType.compare("4") == 0) { + j->setPresence(Presence::PresenceType::DND, 50, status); + } +} + +/** + * 获取好友以及分组信息 + * @param jidStr + */ +std::string Smack::getFriendList() { + RosterManager *rosterManager = j->rosterManager(); + Roster *roster = rosterManager->roster(); + Roster::const_iterator it = roster->begin(); + std::string name; + name.append("["); + for (; it != roster->end(); ++it) { + name.append("{"); + name.append("\"jid\":"); + name.append("\""); + name.append((*it).second->jidJID().full().c_str()); + name.append("\""); + name.append(",\"name\":"); + name.append("\""); + name.append((*it).second->name().c_str()); + name.append("\""); + + StringList g = (*it).second->groups(); + StringList::const_iterator it_g = g.begin(); + for (; it_g != g.end(); ++it_g) { + name.append(",\"group\":"); + name.append("\""); + name.append((*it_g).c_str()); + name.append("\""); + } + name.append("},"); + RosterItem::ResourceMap::const_iterator rit = (*it).second->resources().begin(); + } + name.append("]"); + return name.c_str(); +} + +/** + * 用户注销 接口 + * 无返回值 + */ +void Smack ::Loginout() { + j->disconnect(); +} + +void Smack::receiveMsg(const std::string &jidStr, const std::string &msg) { +} + +void Smack::changePasswords(const std::string &password) { + m_reg->changePassword(j->username(), password); +} + +void Smack::loop() { + ConnectionError ce = ConnNoError; + while (ce == ConnNoError) { + ce = j->recv(); + } +} + +/** + * 消息发送 接口 + * @param jidStr 指定的用户地址 例如 :user@he-202101111234/HE-202101111234 拼接规则 用户名称 + 主机名称 +随便加 + * @param text 需要发送的消息 + * + * 无返回值 + */ +void Smack::send(const std::string &jidStr, const std::string &text) { + JID to(jidStr); + Message msg(Message::MessageType::Chat, to, text); + j->send(msg); +} + +/** + * 添加好友到指定分组 + * @param jidStr + * @param username + * @param group + * @return + */ +void Smack::addFriends(const std::string &jidStr, const std::string &username, const std::string &group) { + RosterManager *rosterManager = j->rosterManager(); + StringList gl; + gl.clear(); + gl.push_back(group); + JID jid(jidStr); + rosterManager->subscribe(JID(jidStr), username, gl); +} + +/** + * 删除好友 + * @param jidStr + */ +void Smack::delfriends(const std::string &jidStr) { + RosterManager *rosterManager = j->rosterManager(); + rosterManager->fill(); + JID jid(jidStr); + rosterManager->remove(jid); +} + +void Smack::changeFriendGroup(const std::string &jidStr, const std::string &group) { + RosterManager *rosterManager = j->rosterManager(); + StringList gl; + gl.clear(); + gl.push_back(group); + JID jid(jidStr); + rosterManager->add(jid, jid.username(), gl); + rosterManager->fill(); +} + +void Smack::changeGroup(const std::string &oldGroup, const std::string &newGroup) { + RosterManager *rosterManager = j->rosterManager(); + Roster *roster = rosterManager->roster(); + Roster::const_iterator it = roster->begin(); + + StringList gl; + gl.clear(); + gl.push_back(newGroup); + for (; it != roster->end(); ++it) { + StringList g = (*it).second->groups(); + StringList::const_iterator it_g = g.begin(); + for (; it_g != g.end(); ++it_g) { + if ((*it_g).compare(oldGroup) == 0) { + rosterManager->add((*it).second->jidJID(), (*it).second->name().c_str(), gl); + } + } + RosterItem::ResourceMap::const_iterator rit = (*it).second->resources().begin(); + } +} + +/** + * 创建分组 + * @param group + */ +void Smack::createGroup(const std::string &group) { + RosterManager *rosterManager = j->rosterManager(); + rosterManager->fill(); + RosterItem *m_self = new RosterItem(j->jid().bare()); + + StringList gl; + gl.clear(); + gl.push_back(group); + m_self->setGroups(gl); +} + +void Smack::removeAccounts() { + m_reg->removeAccount(); +} + +void Smack::onConnect() { + LOGW("onConnect!!!\n"); +} + +void Smack::onDisconnect(ConnectionError e) { + LOGW("onDisconnect: %d\n", e); + if (e == ConnAuthenticationFailed) + LOGD("auth failed. reason: %d\n", j->authError()); +} + +bool Smack::onTLSConnect(const CertInfo &info) { + time_t from(info.date_from); + time_t to(info.date_to); + + LOGW("onTLSConnect status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime(&from), ctime(&to)); + return true; +} + +void Smack::onResourceBind(const std::string &resource) { + LOGW("onResourceBind: %s", resource.c_str()); +} + +void Smack::onResourceBindError(const Error *error) { + LOGW("onResourceBindError: %d\n", error); +} + +void Smack::onSessionCreateError(const Error *error) { + LOGW("onSessionCreateError: %d\n", error); +} + +void Smack::handleLog(LogLevel level, LogArea area, const std::string &message) { + LOGW("handleLog area: 0x%x, msg: %s", area, message.c_str()); +} + +void message_received(const std::string &id, const std::string &msg); +void Smack::handleMessage(const Message &msg, MessageSession *session) { + auto body = msg.body(); + LOGW("handleLog area: handleMessage msg: %s", msg.from().full().c_str()); + message_received(msg.from().full().c_str(), body.c_str()); +} + +void Smack::handleMessageEvent(const JID &from, MessageEventType event) { + LOGW("received event: %d from: %s\n", event, from.full().c_str()); +} + +void Smack::handleChatState(const JID &from, ChatStateType state) { + LOGW("received state: %d from: %s\n", state, from.full().c_str()); +} + +void Smack::handleMessageSession(MessageSession *session) { + LOGW("got new session"); + j->disposeMessageSession(m_session); + m_session = session; + m_session->registerMessageHandler(this); + m_messageEventFilter = new MessageEventFilter(m_session); + m_messageEventFilter->registerMessageEventHandler(this); + m_chatStateFilter = new ChatStateFilter(m_session); + m_chatStateFilter->registerChatStateHandler(this); +} + +void Smack::declineInvitation(const std::string &roomStr, const std::string &invitorStr, const std::string &reason) { + + LOGD("smark declineInvitation roomStr:%s, invitorStr:%s, reason:%s,", roomStr.c_str(), invitorStr.c_str(), reason.c_str()); + JID room(roomStr); + JID invitor(invitorStr); + Message *msg = MUCRoom::declineInvitation(room, invitor, reason); + LOGD("smark declineInvitation result msg:%s", msg->tag()->xml().c_str()); + + Tag *tag = msg->tag(); + j->send(tag); +} + +void Smack::onStreamEvent(StreamEvent event) { + LOGW("onStreamEvent"); +} +void Smack::handlePresence(const Presence &presence) { + UserState = 1; + LOGW("handlePresence roster: %s state: %d", presence.from().full().c_str(), presence.presence()); + presenceType = presence.presence(); +} + +/****************账户管理开始***********************/ +void Smack::handleRegistrationFields(const JID &from, int fields, + std::string instructions) { + LOGW("handleRegistrationFields fields: %d instructions: %s ", fields, instructions.c_str()); +} + +void Smack::handleRegistrationResult(const JID & /*from*/, RegistrationResult result) { + LOGW("result: %d\n", result); +} + +void Smack::handleAlreadyRegistered(const JID & /*from*/) { + LOGW("handleAlreadyRegistered the account already exists.\n"); +} + +void Smack::handleDataForm(const JID & /*from*/, const DataForm & /*form*/) { + LOGW("handleDataForm datForm received\n"); +} + +void Smack::handleOOB(const JID & /*from*/, const OOB &oob) { + LOGW("handleOOB OOB registration requested. %s: %s\n", oob.desc().c_str(), oob.url().c_str()); +} + +/****************用户管理开始***********************/ +void Smack::handleItemSubscribed(const JID &jid) { + LOGW("handleItemSubscribed subscribed %s\n", jid.bare().c_str()); +} + +void Smack::handleItemAdded(const JID &jid) { + LOGW("handleItemAdded added %s\n", jid.bare().c_str()); +} + +void Smack::handleItemUnsubscribed(const JID &jid) { + LOGW("handleItemUnsubscribed unsubscribed %s\n", jid.bare().c_str()); +} + +void Smack::handleItemRemoved(const JID &jid) { + LOGW("handleItemRemoved removed %s\n", jid.bare().c_str()); +} + +void Smack::handleItemUpdated(const JID &jid) { + LOGW("handleItemUpdated updated %s\n", jid.bare().c_str()); +} + +void Smack::handleRoster(const Roster &roster) { + LOGW("roster arriving \nitems:\n"); + Roster::const_iterator it = roster.begin(); + for (; it != roster.end(); ++it) { + LOGW("roster arriving jid: %s, name: %s, subscription: %d\n", + (*it).second->jidJID().full().c_str(), (*it).second->name().c_str(), + (*it).second->subscription()); + StringList g = (*it).second->groups(); + StringList::const_iterator it_g = g.begin(); + for (; it_g != g.end(); ++it_g) { + LOGW("\t roster arriving group: %s\n", (*it_g).c_str()); + } + RosterItem::ResourceMap::const_iterator rit = (*it).second->resources().begin(); + for (; rit != (*it).second->resources().end(); ++rit) { + LOGW("roster arriving resource: %s\n", (*rit).first.c_str()); + } + } +} + +void Smack::handleRosterError(const IQ &) { + LOGW("a roster-related error occured\n"); +} + +void Smack::handleRosterPresence(const RosterItem &item, const std::string &resource, + Presence::PresenceType presence, const std::string & /*msg*/) { + LOGW("handleRosterPresence received: %s/%s -- %d\n", item.jidJID().full().c_str(), resource.c_str(), presence); +} + +void Smack::handleSelfPresence(const RosterItem &item, const std::string &resource, + Presence::PresenceType presence, const std::string & /*msg*/) { + LOGW("handleSelfPresence received: %s/%s -- %d\n", item.jidJID().full().c_str(), resource.c_str(), presence); +} + +void handleSubscriptionCall(const std::string &resultStr); + +bool Smack::handleSubscriptionRequest(const JID &jid, const std::string &msg) { +// LOGW("smack handleSubscriptionRequest jid:%s, name:%s, msg:%s\n", jid.bare().c_str(), jid.username().c_str(), msg.c_str()); + std::string resultStr = ""; + resultStr.append("{"); + resultStr.append("\"jid\":"); + resultStr.append("\""); + resultStr.append(jid.bare().c_str()); + resultStr.append("\""); + resultStr.append(",\"name\":"); + resultStr.append("\""); + resultStr.append(jid.username().c_str()); + resultStr.append("\""); + resultStr.append(",\"msg\":"); + resultStr.append("\""); + resultStr.append(msg.c_str()); + resultStr.append("\""); + resultStr.append("}"); + +// LOGW("smack handleSubscriptionRequest resultStr:%s", resultStr.c_str()); + handleSubscriptionCall(resultStr); + return true; +} + +void Smack::receiveFriends(const std::string &jidStr, const std::string &groupName, const std::string &hello = EmptyString) { + JID jid(jidStr); + StringList groups; + groups.clear(); + + RosterManager *rosterManager = j->rosterManager(); + + Roster *roster = rosterManager->roster(); + Roster::const_iterator it = roster->begin(); + + bool has = false; + for (; it != roster->end(); ++it) { + std::string fjid = (*it).second->jidJID().full(); + int result = fjid.compare(jid.full()); + + if (result == 0) { + StringList g = (*it).second->groups(); + StringList::const_iterator it_g = g.begin(); + for (; it_g != g.end(); ++it_g) { + groups.push_back((*it_g).c_str()); + has = true; + } + break; + } + } + + if (!has) { + groups.push_back(groupName); + } + + rosterManager->subscribe(jid, jid.username().c_str(), groups, hello); +} + + + +void Smack::rejectFriends(const std::string &jidStr, const std::string &reason = EmptyString) { + JID jid(jidStr); + RosterManager *rosterManager = j->rosterManager(); + rosterManager->unsubscribe(jid, reason); + rosterManager->remove(jid); + +} + +bool Smack::handleUnsubscriptionRequest(const JID &jid, const std::string & /*msg*/) { + LOGW("unsubscription: %s\n", jid.bare().c_str()); + return true; +} + +void Smack::handleNonrosterPresence(const Presence &presence) { + LOGW("handleNonrosterPresence received presence from entity not in the roster: %s to %s state: %d\n", presence.from().full().c_str(), presence.to().full().c_str(), presence.presence()); +} + +void Smack::handleSubscription(const Subscription &subscription) { + LOGW("handleSubscription subscription type: %d", subscription.subtype()); +} diff --git a/smack/smack/src/main/cpp/Smack.h b/smack/smack/src/main/cpp/Smack.h new file mode 100644 index 00000000..ae4b2960 --- /dev/null +++ b/smack/smack/src/main/cpp/Smack.h @@ -0,0 +1,129 @@ +/* + Copyright (C) 2022 Huawei Device Co., Ltd. + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + This software is distributed without any warranty. +*/ + +#ifndef ohosXmppClient_Smack_H +#define ohosXmppClient_Smack_H + +#include "src/messageeventfilter.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include "MyMUCInvitationHandler.h" + +using namespace gloox; + +class Smack : PresenceHandler, ConnectionListener, LogHandler, MessageHandler, MessageEventHandler, MessageSessionHandler, ChatStateHandler, RegistrationHandler, RosterListener, SubscriptionHandler { + public: + Smack(); + int login(const std::string &jid, const std::string &pwd); + void loop(); + void Loginout(); + void send(const std::string &jidStr, const std::string &msg); + void receiveMsg(const std::string &jidStr, const std::string &msg); + void removeAccounts(); + void changePasswords(const std::string &password); + void addFriends(const std::string &jidStr, const std::string &username, const std::string &group); + void createGroup(const std::string &group); + void delfriends(const std::string &jidStr); + std::string getFriendList(); + void changeGroup(const std::string &oldGroup, const std::string &newGroup); + + void declineInvitation(const std::string & /*JID&*/ room, const std::string & /*JID&*/ invitor, + const std::string &reason); + bool isConnected(); + std::string username(); + void setUsernameAndPassword(std::string username, std::string pwd); + void setPort(int port); + bool connect(); + void setServer(const std::string &server); + void setPassword(const std::string &password); + std::string password(); + std::string resource(); + void setResource(const std::string &resource); + bool login(); + void receiveFriends( const std::string &jidStr,const std::string &groupName, const std::string &hello); + void rejectFriends( const std::string &jidStr, const std::string &reason); + std::string server(); + int authed(); + int port(); + int compression(); + //获取当前登录的JID + JID &getMyJID(); + //获取clent + Client *getClent(); + + //变更用户状态 + void changePresence(const std::string &statusType, const std::string &status); + void changeFriendGroup(const std::string &jidStr, const std::string &group); + + virtual void handlePresence(const Presence &presence); + virtual void onConnect(); + virtual void onDisconnect(ConnectionError e); + virtual void onResourceBind(const std::string &resource); + virtual void onResourceBindError(const Error *error); + virtual void onSessionCreateError(const Error *error); + virtual bool onTLSConnect(const CertInfo &info); + virtual void onStreamEvent(StreamEvent event); + + virtual void handleLog(LogLevel level, LogArea area, const std::string &message); + virtual void handleMessage(const Message &msg, MessageSession *session = 0); + virtual void handleMessageEvent(const JID &from, MessageEventType event); + virtual void handleMessageSession(MessageSession *session); + virtual void handleChatState(const JID &from, ChatStateType state); + + /****************账户管理***********************/ + virtual void handleRegistrationFields(const JID &from, int fields, + std::string instructions); + virtual void handleAlreadyRegistered(const JID &from); + virtual void handleRegistrationResult(const JID &from, RegistrationResult regResult); + virtual void handleDataForm(const JID &from, const DataForm &form); + virtual void handleOOB(const JID &from, const OOB &oob); + + /****************用户管理***********************/ + virtual void handleItemAdded(const JID &jid); + virtual void handleItemSubscribed(const JID &jid); + virtual void handleItemRemoved(const JID &jid); + virtual void handleItemUpdated(const JID &jid); + virtual void handleItemUnsubscribed(const JID &jid); + virtual void handleRoster(const Roster &roster); + virtual void handleRosterPresence(const RosterItem &item, const std::string &resource, + Presence::PresenceType presence, const std::string &msg); + virtual void handleSelfPresence(const RosterItem &item, const std::string &resource, + Presence::PresenceType presence, const std::string &msg); + virtual bool handleSubscriptionRequest(const JID &jid, const std::string &msg); + virtual bool handleUnsubscriptionRequest(const JID &jid, const std::string &msg); + virtual void handleNonrosterPresence(const Presence &presence); + virtual void handleRosterError(const IQ &iq); + virtual void handleSubscription(const Subscription &subscription); + + private: + Client *j = nullptr; + MessageSession *m_session = nullptr; + MessageEventFilter *m_messageEventFilter = nullptr; + ChatStateFilter *m_chatStateFilter = nullptr; + JID m_jid; + Registration *m_reg; + int32_t presenceType = -1; + std::string userName = ""; +}; +#endif //ohosXmppClient_Smack_H diff --git a/smack/smack/src/main/cpp/gloox/AUTHORS b/smack/smack/src/main/cpp/gloox/AUTHORS new file mode 100644 index 00000000..b00297fe --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/AUTHORS @@ -0,0 +1 @@ +Jakob Schrter diff --git a/smack/smack/src/main/cpp/gloox/COPYING b/smack/smack/src/main/cpp/gloox/COPYING new file mode 100644 index 00000000..f45422f0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/COPYING @@ -0,0 +1,2 @@ +see the file LICENSE for the license of this distribution. + diff --git a/smack/smack/src/main/cpp/gloox/ChangeLog b/smack/smack/src/main/cpp/gloox/ChangeLog new file mode 100644 index 00000000..396d61c3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/ChangeLog @@ -0,0 +1,863 @@ +v1.0.13 -- 01 Feb 2015 +---------------------- +Note: This release is not binary compatible with previous releases. It is source compatible. + +- fixed compilation with libressl (thanks to Heiko Becker) +- added IO Data (XEP-0244) +- serialise access to compressionZlib::cleanup for thread safety (thanks to Stephen Hilliard) +- prevent infinite loop in Tag::setCData() (thanks to Stephen Hilliard) +- TLSOpenSSL: memory leak on every client connection attempt (thanks to Stephen Hilliard) +- Client: initialize m_smWanted to avoid connection failures (thanks to Stephen Hilliard) + + + +v1.0.12 -- 12 Nov 2014 +---------------------- +- TLSOpenSSLClient/Server: disabled SSLv3, Google & co. finally support TLS + + + +v1.0.11 -- 13 Sep 2014 +---------------------- +- GnuTLS: updated use of priority API +- LinkLocal*: compile fixes for MSVC 2008 (thanks to Serhiy M. Vasylenko) +- fixed Debian bug #746857, worked around #758899 +- fixed memory leak (#240) +- fixed compatibility with recent GnuTLS versions, fixed GnuTLS check (thanks to Andreas Metzler) (#231) +- Jingle::Session: fixed state error (thanks to leerymatthew) (#236) + + + +v1.0.10 -- 09 Apr 2014 +--------------------- +- TLSSChannel: use malloc/realloc/free instead of their legacy Local* variants (fixes #222) +- VCard: remove \r from vcard photos. Fixes a recent change Facebook made to their vcard pictures (patch by Fernando Sanchez) +- Jingle: fixed replying; distinguish between 'from' and 'initiator'; added Jingle::Session::setInitiator() +- Jingle: fixed ::ICEUDP to actually add candidates; added ::Session::initiator(), ::setHandler(), ::sessionAccept( PluginList ); fixed storing of new sessions in ::SessionManager (patches by Erich Keane) +- Jingle: removed Jingle::setInitiator() and ::setResponder() (now provided by ctor) +- AtomicRefCount: fixed compilation on iOS (patch by Erich Keane) +- Jingle::Plugin: added JinglePluginType, pluginType(), and findPlugin() to easily look for and retrieve specific plugins +- ConnectionBOSH: fixed return value for recv() (patch by Sudarshan Prasad) +- Parser: get rid of bogus isValid() (fixes #180, #224) + + + +v1.0.9 -- 15 Oct 2013 +--------------------- +- changed colon to dash in uid generation to possibly fix #191 +- added Channel Binding (needed for SASL SCRAM-SHA-1-PLUS) to SChannel on win32 (untested) +- fixed SCRAM-SHA-1-PLUS + + + +v1.0.8 -- 15 Oct 2013 +--------------------- +- ConnectionTLS: make stacked TLS/SSL connections work again with HTTP proxies +- added SASL SCRAM-SHA-1/SCRAM-SHA-1-PLUS authentication mechanisms (GnuTLS & OpenSSL only) (#201) +- properly seed the RNG +- SHA::hex(): finalize() only once + + + +v1.0.7.1 -- 11 Oct 2013 +--------------------- +- fixed/updated the win32 project files + + + +v1.0.7 -- 11 Oct 2013 +--------------------- +- added Jingle (XEP-0166) +- added Jingle ICE-UDP Transport (XEP-0176) +- added Jingle File Transfer (XEP-0234) +- fixed compilation in iOS7 SDK (thanks to Kurt Vermeersch) +- fixed bug in stanza handling/counting related to Stream Management (patch by Norbert Riedlin) +- added protected ClientBase::stanzasSent() to return sent stanzas (if Stream Management enabled) + + + +v1.0.6 -- 04 Sep 2013 +--------------------- +- ClientBase: removed check for empty message body --> messages of type chat with empty bodies will be passed on to listeners - required for Message Carbons +- MessageSession: removed check for empty message body --> messages of type chat with empty bodies will be passed on to listeners - required for Message Carbons +- don't send presence after stream resumption +- added ClientBase::sendQueue() +- documentation updates and fixes + + + +v1.0.5 -- 02 Sep 2013 +--------------------- +- added support for Stanza Forwarding (XEP-0297) +- added support for Message Carbons (XEP-0280) + + + +v1.0.4 -- 30 Aug 2013 +--------------------- +- added support for Stream Management (XEP-0198) +- Fix some iterator usage for portability related to erase (patch by Daniel Bowen) +- Ensure setting a connection does not leave a deleted value in the member variable for a time (patch by Daniel Bowen) +- Add operator< and relatives to JID so that it can be in a map (patch by Daniel Bowen) +- Sandboxing on Apple doesn't like getprotobyname (patch by Daniel Bowen) +- MessageSession::send(): removed default argument of 2nd parameter to remove ambiguity of MS::send( string ) (#206) (source incompatible!) +- VCard: renamed setPhoto( string ) to setPhotoUri( string ) (#166) (source and binary incompatible) + + + +v1.0.3 -- 22 Jul 2013 +--------------------- +- Changed license to GPLv3 +- removed space from VS project name (--> gloox-1.0) +- VCardUpdate: fixed handling of empty hash (#203) +- VCardUpdate: added hasPhoto() to inidicate whether there was a photo tag (#203) +- compilation fixed when using getaddrinfo (patch by Roy van Dam) +- Receipt: recognize id attribute (patch by Dídac Pérez) (#208) +- MessageSession: added MS::send( string& ) to properly provide a base for MUCMS::send( string& ) (#206) +- really fixed memory leak in prep::idna() +- gloox.vcproj: removed not-yet-present tlsgnutlsserver.cpp/.h + + + +v1.0.2 -- 05 Jul 2013 +--------------------- +- SOCKS5Bytestream: Don't wait for incoming data, notify about open stream immediately upon +connection (patch by Erik Horemans) +- fixed/updated Code::Blocks and VS project files (fixes #197, #198) +- fixed memory leak in ClientBase (fixes #204) +- fixed memory leak in prep::idna() + + + +v1.0.1 -- 29 Jun 2013 +--------------------- +- Added support for Serverless Messaging (XEP-0174) +- TLSOpenSSLServer: compilation fix +- don't bail on DNS TCP queries +- fixed µs timeout value (now defaults to 1.000.000) +- omit port in initial greeting (usually -1 anyway) +- fixed SHA1 hashes of 55 byte strings (#164) +- fixed CFLAGS and LIBS in pkg-config file (#163) +- fixed SOCKS5Bytestream double close notification +- tell gcrypt that we're using pthreads (if available) +- ClientBase: send IQ error response for unsupported features +- ClientBase: fixed potential infinite loop on IQ error +- ClientBase: fixed NTLM auth +- ClientBase, SEF: mutex-protected SE handling +- PubSub: added 'subscribe & configure' +- PubSub: added optional subid +- SOCKS5BytestreamServer: expose local socket +- RosterManager: don't use string-comparison on JIDs; use JID class +- NonSASLAuth: fixed resource usage by deprecating ClientBase::m_selectedResource +- InBandBytestream: don't call handler in dtor +- util: fixed long2string() +- fixed a few leaks in GnuTLS client code (#181) +- VCard: made getters const (#186) (binary-incompatible change!) +- PubsubManager: fixed using wrong Tag (#190) +- Search: fixed search() (#193) +- DNS: fix socket leak if no network connection is available (#192) +- PubsubManager: unconditionally call handleItemPublication() (#194) +- configure: Added -lgcrypt (dependency of GNUTLS) + + + +v1.0 -- 31 Oct 2009 +--------------------- + +general changes and additions: +- XEP-0020 (Feature Negotiation) wrapper +- XEP-0060 (Publish-Subscribe) +- XEP-0071 (XHTML-IM) wrapper +- XEP-0115 (Entity Capabilities) +- XEP-0124 (BOSH) +- XEP-0172 (User Nickname) +- XEP-0184 (Message Receipts) +- XEP-0199 (XMPP Ping) +- XEP-0206 (XMPP Over BOSH) +- integrated XEP-0047 (In-Band Bytestreams) with XEP-0096 (File Transfer) +- integrated XEP-0066 (Out-of-Band Data) with XEP-0096 (File Transfer) +- added IQ, Message, Subscription, Presence classes +- added SASL error malformed-request from RFC 3920bis +- added StanzaExtension and ported all XEPs +- DataForm: removed 'Form' prefix from DataForm::DataFormType enum members +- DataForm: removed 'Field' prefix from DataForm::FieldType enum members +- JID: made setters return success/failure +- Parser: feed() returns -1 on success, parse error position otherwise +- Parser and Tag: support mixed content xml +- Parser: XML namespace support +- ConnectionListener: added onResourceBind( resource ) to notify about successfully bound resources +- ConnectionListener: onResourceBindError() takes pointer to Error object +- ConnectionListener: onSessionCreateError() takes pointer to Error object +- Client: support for binding and unbinding of additional resources +- SIProfileFTHandler: handleFTRequest() doesn't pass an id anymore, just a sid +- SIProfileFT: acceptFTRequest() and declineFTRequest() don't take an id argument anymore, just a sid +- Tag: check input for XML conformance +- Tag: made findTag(), findTagList(), findCData() const +- RosterItem: SubscriptionEnum moved to gloox namespace; renamed to SubscriptionType +- MessageSession::send(): added StanzaExtensionList parameter +- added SASL NTLM authentication (experimental, windows only) +- added VC++ Express 2008 project file, updated Code::Blocks and MSVC++ project files + +deprecated: +- MUCRoomHandler::handleMUCMessage( MUCRoom*, string, string, bool, string, bool ), + use handleMUCMessage( MUCRoom*, Message&, bool ) + +removed: +- class XDelayedDelivery, use DelayedDelivery +- JID::fullJID(), use ctor +- JID::empty(), use operator bool() +- Tag::empty(), use operator bool() +- Stanza::createMessageStanza(), Stanza::createPresenceStanza(), + Stanza::createIqStanza(), Stanza::createSubscriptionStanza(), + use Message, Presence, IQ, Subscription instead + +... and many more... + + +v0.9.9.12 -- 31 Oct 2009 +------------------------ +- removed apparent openssl chunk size limit +- win32 compile fixes (WIN32 --> _WIN32) +- defined DLL_EXPORT in Code::Blocks project file +- SChannel::decrypt(): defer cleanup in error case +- SChannel: support over-sized TLS fragments + + +v0.9.9.11 -- 22 Oct 2009 +------------------------ +- fixed potential crash in SOCKS5BytestreamManager + + +v0.9.9.10 -- 19 Oct 2009 +------------------------ +- fixed potential crash in Rostermanager::fill() (when reusing the RosterManager) +- fixed gnutls check in configure.ac (using pkg-config) + + +v0.9.9.9 -- 23 Sep 2009 +----------------------- +- fixed SChannel on NT4 +- fixed configure.ac tests for FreeBSD +- preliminary workaround for connection problems when using recent OpenSSL + gtalk +- accept DLL_EXPORT + + +v0.9.9.8 -- 16 Aug 2009 +----------------------- +- support tls zlib compression with openssl (wrong magic number used) +- fixed setting client cert/key in gnutls +- properly exported InstantMUCRoom and UniqueMUCRoom (GLOOX_API) +- added MUCRoom::setRoomConfig() + + +v0.9.9.7 -- 07 Mar 2009 +----------------------- +- #define GLOOX_IMPORTS for the examples, fixes compilation in MinGW +- removed use of deprecated ns_get16() +- allow destruction of a MUC room if not currently in the room + + +v0.9.9.6 -- 28 Feb 2009 +----------------------- +- prevent crashes when closing a MUCRoom +- compile fix for gcc 4.4, fixes debian bug 505333 +- MacOS compile fix +- fixed a potential crash when the server sends no 'version' attribute in the opening stream + + +v0.9.9.5 -- 22 Mar 2008 +----------------------- +- added Parser::reset() +- added Client::login() +- fixed detection of res_query (Gentoo bug #212316) + + +v0.9.9.4 -- 05 Mar 2008 +----------------------- +- MUCRoom: don't leak a MessageSession on presence error +- compile fix for gcc 4.3 (thanks to Cyril Brulebois) + + +v0.9.9.3 -- 18 Jan 2008 +----------------------- +- MUCRoom: properly recover after nick name conflict +- TLSSChannel: properly recover after disconnect + + +v0.9.9.2 -- 17 Jan 2008 +----------------------- +- fix for the gcc 4.3 compile fix + + +v0.9.9.1 -- 16 Jan 2008 +----------------------- +- gcc 4.3 compile fix + + +v0.9.9 -- 16 Jan 2008 +--------------------- +- MUCRoom: fixed finding the 'delayed delivery' stamp +- MUCRoom: fixed adding of chat history to rooms +- Client: fixed TLSRequired policy +- RosterManager: fixed (removed) 'from' attribute for subscription stanzas +- call removeIDHandler() from more places +- VCard: work around MIME-like photo/logo formatting +- TLSOpenSSL: provide date_from/date_to in certinfo + + +v0.9.8 -- 07 Dec 2007 +--------------------- +- Client: clear list of presence exts in removePresenceExtensions() +- SIManager: fixed ID tracking +- MUCRoom: fixed bit clearing +- MessageEventFilter: fixed bit clearing + + +v0.9.7 -- 13 Nov 2007 +--------------------- +- InbandBytestreamManager: marked as deprecated +- InbandBytestreamManager: fixed ID tracking +- MessageSession: added setThreadID() +- better overall MinGW support + + +v0.9.6.1 -- 25 Oct 2007 +----------------------- +- win32 build fix + + +v0.9.6 -- 25 Oct 2007 +--------------------- +- fixed position of GLOOX_DEPRECATED macro in tag.h +- ClientBase: added private copy & assignment ctors +- SOCKS5Bytestream: recognize established connections (when using local streamhost) +- SOCKS5BytestreamServer: avoid a crash when a connection is closed prematurely +- SIProfileFTHandler, SIHandler, SOCKS5BytestreamHandler: pass SID to handle*Error() functions +- CompressionZlib: made thread-safe +- ConnectionTCPBase: avoid multi-threading issue in recv()/disconnect()/cleanup() +- TLSSChannel: fixed off-by-one error + + +v0.9.5 -- 27 Sep 2007 +--------------------- + +general changes and additions: +- PrivacyManager: do not allow store()'ing of empty lists (aka removeList) +- PrivacyManager: properly handle the error case in handleIqID() +- JID: added operator bool() +- Tag: added operator bool() +- DelayedDelivery: added setReason() +- skip zlib tests if zlib is not available + +deprecated functions: +- JID::fullJID(), use ctor +- JID::empty(), use operator bool() +- Tag::empty(), use operator bool() +- XDelayedDelivery::XDelayedDelivery( JID, string, string ), the spec is deprecated, use DelayedDelivery +- DelayedDelivery::setBody(), typo, use setReason() + + +v0.9.4.1 -- 15 Aug 2007 +----------------------- +- ClientBase: fix TLS wrapper instantiation + + +v0.9.4 -- 14 Aug 2007 +--------------------- +- ChatStateHandler: make sure to never send the same chat state twice in a row +- Tag: make ctors explicit +- ClientBase: added setTls( TLSPolicy ) to allow enforcing of TLS +- ClientBase: deprecated setTls( bool ) +- conform to XEP-0170 (Recommended Order of Stream Feature Negotiation) +- ConnectionTCPBase: avoid race condition in cleanup() +- ConnectionTCPBase: reset byte counters on disconnect +- DataFormBase: added addField( DataFormFieldType, ... ) +- DataFormField: added addOption( string, string ) +- MUCRoom: fix potential crash in dtor +- SHA: fix potential crash in hex() +- MUCRoom: fix detection of nick changes +- UniqueMUCRoom: fix creation of unique room names +- XPath: support expressions like /abc[@foo='bar']/def[@bar='foo'] +- MessageFilter: enabled writing of custom MessageFilters +- ChatStateFilter: made members protected +- MessageSession: added resetResource() +- Search: made members protected +- DNS: re-use server port if setsockopt() is available +- XPath: accept any characters in string literals +- Tag: deprecated relax() and escape() + + +v0.9.3 -- 18 Jul 2007 +--------------------- +- SOCKS5BytestreamManager: include error child in IQ of type error +- allow a default value to be set for data form fields of type FieldTypeListSingle (thanks to Roelof Naude) +- DelayedDelivery: fixed SE type +- Registration: fixed error handling +- Parser: disallow ", ' and > again for full XMPP compliance +- XPath: accept @ in string literals + + +v0.9.2 -- 23 Jun 2007 +--------------------- +- Parser: accept ' and > in attribute values and cdata +- Parser: log parse errors +- SIManager, SIProfileFT: return requested stream's id (SID) +- SIProfileFTHandler: new argument: stream's ID (SID) + + +v0.9.1 -- 20 Jun 2007 +--------------------- +- MessageSession: fix potential crash when ClientBase deletes MessageSessions in its dtor +- DNS: increase verbosity if no SRV record found +- ClientBase: avoid double call of onDisconnect() under rare circumstances +- ClientBase: reply with 'service-unavailable' to unhandled IQs +- documentation updates and fixes +- ClientBase: avoid disconnect loop if TLS failed +- Client: added Session Creation event + + +v0.9 -- 17 Jun 2007 +------------------- +- rewrote XML parser (no dependency on iksemel anymore) +- XEP-0045 (Multi-User Chat) +- XEP-0065 (SOCKS5 Bytestreams) +- XEP-0095 (Stream Initiation) +- XEP-0096 (File Transfer) +- added StanzaExtensions + - XEP-0027 (Current Jabber OpenPGP Usage) abstraction + - XEP-0066 (Out of Band Data) abstraction + - XEP-0091 (Delayed Delivery) abstraction + - XEP-0153 (vCard-Based Avatars) abstraction + - XEP-0203 (Delayed Delivery) abstraction +- added msec timeout to recv() +- Client: fetch roster immediately after requesting roster:delimiter +- delete() --> delete +- Registration: allow registration with services +- implement dataforms as list of pointers to DataFormFields +- ClientBase: cleaner Stanza deleting +- Adhoc: full Adhoc support +- Disco::getDiscoItems() and ::getDiscoInfo() take JIDs instead of std::strings +- Tag: added virtual void addChild( const Tag *child ) +- DataForm: added ::type() +- RosterManager: take JIDs in un/subscribe()/add() +- RosterListener: announce JIDs, not std::strings +- DataFormBase: added addField() to add a single field +- DNS: SRV record resolving on win32 (thanks to Marc Rousseau) +- Client: removed setInitialPriority() and setAutoPresence() in favour of setPresence() +- support for SASL authorization id != authentication id +- Disco: added removeFeature() +- Tag: added setAttributes() +- merged patch by Marc Rousseau to distiguish between incoming and outgoing Tags/Stanzas +- moved several structs and enums into gloox namespace (mostly from *Handlers) +- move Resource into gloox namespace (from RosterItem) +- MessageEventFilter: fixed a bug where error messages triggered events +- MessageEventFilter: honor feature-not-implemented error +- Connection: included server name in dns error message (--> 'server.tld: connection refused') +- ClientBase: onDisconnect() gets called if the connection got refused or DNS error occurred +- statistics interface (connection/compression/encryption statistics and status, etc) +- Tag: added 'TagList findChildren( std::string& )' +- Disco: lifted limit of one DiscoNodeHandler per Node +- Parser: install parser.h +- Tag: added operator== & operator!= +- ClientBase: added setCompression( bool ) to switch stream compression on/off +- renamed Stanza::show() --> Stanza::presence() +- RosterListener: moved Roster to gloox namespace +- RosterListener: new handleRosterPresence() replaces itemUn/Available() and presenceUpdated() +- RosterListener: added handleSelfPresence() +- RosterListener: added 'handle' prefix to function names +- MessageHandler: handleMessage() takes optional MessageSession arg +- DiscoNodeHandler: added DiscoNodeItem to properly represent a disco#item +- ClientBase: removed setAutoMessageSession() in favor of registerMessageSessionHandler() +- PrivacyItem: renamed enum members from ALL_UPPER_CASE to MixedCase +- PrivateXMLHandler: renamed enum members from ALL_UPPER_CASE to MixedCase +- MessageSession: added filtering by message type +- AdhocHandler: added 'handleAdhoc' prefix +- Adhoc: handle Disco errors +- removed unmaintained Dev-C++ project (in favor of Code::Blocks project) +- ClientBase: added whitespacePing() +- HTTP proxy support, incl. Basic auth support +- Tag: basic XPath support +- DNS: cleanup +- TagHandler: now receives Tag, not Stanza +- Parser: cleanup, now uses TagHandler +- ClientBase: added removeIDHandler() to cancel trackID() operations +- added DataFormField( const std::string& name, const std::string& label = "", + const std::string& value = "", DataFormFieldType type = FieldTypeTextSingle ); +- ClientBase: added setSASLMechanisms() +- revamped and modularized the entire connection backend +- Adhoc: added JID to Adhoc item (thanks to Roelof Naude) +- MUCRoom: fixed memleak (thanks to Roelof Naude) +- ClientBase: added registerPresenceHandler( const JID& jid, PresenceHandler *ph ) +- MUCRoomParticipant: added 'status' member to hold the presence's status message +- ClientBase/MessageSession: conform to XEP-0201 +- ClientBase: don't delete a MessageSession manually, use ClientBase::disposeMessageSession() +- MessageSession: don't delete a MessageFilter manually, use MessageSession::disposeMessageFilter() +- JID: added fullJID() & bareJID(), returning JID objects +- Stanza: added setThread() +- MUCRoomParticipant: added status member +- VCardManager: allow cancellation of VCard operations +- ConnectionListener/Client/Component: added stream events/onStreamEvent() +- ClientBase: removed fileDescriptor(). Use ConnectionTCP instead. +- Search::search(): Dataform *form --> const DataForm& form +- Registration: fixed createAccount( const DataForm& form ) to do something useful +- ported to Win CE/Mobile (experimental). see README.wince +- ClientBase::setServer: update's Connection(Base)'s server as well +- VCard: const *List& *() --> *List& *() to allow modification +- SOCKS5 proxy support (RFC 1928), incl. username/password auth (RFC 1929) +- Disco: minor spec compliance fixes +- Adhoc: minor spec compliance fixes +- Tag: added ctors to easily create a single attribute +- ConnectionTCP: protected send() and recv() with simple Mutexes +- GCC 4.3 compile fixes +- OpenSSL: check cert dates +- Parser: don't throw parse error on incoming +- SIProfileFT: fixed ranged file transfers +- Disco: more spec compliance fixes +- DataFormField: added addValue() +- Stanza: removed clone(), use: new Stanza( Tag* ); Tag::clone() is not affected +- RosterManager: added cancel() +- RosterManager: split unsubscribe() into unsubscribe() + remove() +- Client: added presence(), status() +- RosterListener: added handleRosterError() +- PrivacyListHandler: handle unknown errors +- TLSOpenSSL: don't throw handshake errors if the connection was closed by the server +- allow manual deletion of MessageSessions again (thanks to Martin Milata) + + +v0.8.8-sic -- 24 Apr 2007 +------------------------- +- ClientBase/Client/NonSaslAuth: made re-connect-safe +- MessageEventFilter: fixed sending of MessageEventCancel +- MessageEventFilter: fixed handling of IDs +- ChatStateFilter: fixed hypothetical revival of chat states +- Connection: fixed timeout conversion +- Connection: fixed 'valid from' and 'valid to' with gnutls +- compile fix for gcc 4.3 (thanks to Martin Michlmayr) +- Registration: fixed createAccount( const DataForm& form ) to do something useful + + +v0.8.7-sic -- 06 Mar 2007 +------------------------- +- ClientBase: allow cancellation of ID tracking +- VCardManager: allow cancellation of VCard operations +- ClientBase: ugly fix to avoid onDisconnect() being called twice + + +v0.8.6-sic -- 14 Dec 2006 +------------------------- +- Tag: proper escaping of names/attributes/cdata (thanks to Marc Rousseau) +- VCardManager: call handleVCard if VCard is empty +- ClientBase: some disconnect fixes (thanks to Marc Rousseau) +- Adhoc: de-registrataion of commands +- Adhoc: supply IQ id in handleAdhocCommand() + + +v0.8.5-sic -- 10 Nov 2006 +------------------------- +- JEP-0055 (Jabber Search) +- DataForm::tag() returns non-const Tag +- enable DataForm to parse and elements +- DataFormBase: FieldList holds pointers to DataFormFields now +- DataForm: added simplified ctor +- MessageSession::send(): added default for subject param (empty) +- MessageSession: allow conversation started with bare JID to 'upgrade' + to full JID when reply comes in +- RosterManager: keep Roster up-to-date even if no RosterListener is registered +- ClientBase: only log stanzas if actually sent +- ClientBase: more correct return value on disconnect + +v0.8.4-sic -- 18 Sep 2006 +------------------------- +- compile fix for Mac OS X (thanks to Geoff Schmidt) + + +v0.8.3-sic -- 14 Sep 2006 +------------------------- +- ClientBase: added whitespace ping() +- VCard: fixed typo (vcard --> vCard) + + +v0.8.2-sic -- 11 Sep 2006 +------------------------- +- find dn_skipname on Mac OS X (thanks to Geoff Schmidt) +- look for libgnutls-config in specified path, if given +- VCardHandler: return non-const VCard (*) +- fixed compilation on SkyOS +- maybe-fixed resolver on HPUX +- **experimental** native TLS support on win32 +(*) these changes render 0.8.2 source incompatible compared to 0.8 + +v0.8.1-sic -- 28 Jul 2006 +------------------------- +- Registration: allow registration with services (*) +- async inbandbytestreams ack +- fixed memory leak in RosterItem +- RosterListener: announce un/available resource in itemUn/Available() (*) +- RosterManager: don't sync self contact to server +- PrivacyManager: give a privacy list a proper name (thanks to Chris Bond) +- InBandBytestreams: ack closing with correct ID +- Adhoc: provide requesting entities JID in the callback (*) +- DataForm: fixed few minor field handling bugs +- Client: allow lazy username provisioning +(*) these changes render 0.8.1 source incompatible compared to 0.8 + + +v0.8 -- 08 Apr 2006 +------------------- +- added an extensible message session abstraction +- added automatic MessageSession creation facilities upon incoming messages +- JEP-0022 (Message Events) +- JEP-0047 (In-Band Bytestreams) +- JEP-0054 (vcard-temp) +- JEP-0085 (Chat State Notifications) +- 'ported' to Linux on Arm (Intel XScale on gumstix in this case) +- RosterManager: returning true from RosterListener::unsubscriptionRequest() + makes the RosterManager no longer remove the item from the roster. It is + unsubscribed from only. Use unsubscribe( jid, msg, true ) to remove it manually. +- RosterListener: renamed itemChanged() --> presenceUpdated() +- RosterListener: added nonrosterPresenceReceived() +- revamped logging system, introducing per-ClientBase log instance +- Tag: renamed addAttrib() --> addAttribute() +- RosterItem & RosterListener: more const & return values and parameters +- RosterItem: support for multiple resources, introducing RosterItem::Resource +- Stanza: added 'int priority()' +- renamed enum members from ALL_UPPER_CASE to MixedCase +- SASL EXTERNAL and support for client key/cert +- RosterManager: added RosterItem* getRosterItem( const JID& jid ) +- added extern "C" const char* gloox_version() +- Tag: made findChild(...) return 0 instead of new Tag (reverted change from 0.7.6) +- Tag: added addAttribute( const std::string, int ) +- revamped MessageSession to accept external MessageFilters +- Disco: added const StringList& features() +- allow for immediate re-connect() after disconnect() +- fixed compilation with gcc 4.1 +- semi-fixed missing onDisconnect() call if file descriptor has been fetched and stream error occured + + +v0.7.6.1 -- 10 Feb 2006 +----------------------- +- fixed OpenSSL check on MinGW + + +v0.7.6 -- 07 Feb 2006 +-------------------- +- fixed alignment issues on ARM +- more const'ness where possible (thanks to Marc Rousseau) +- configure checks for res_querydomain et.al. +- doc updates +- Tag: added findChild( name, attr, value ) +- Tag: made findChild(...) return new Tag instead of 0 +- DataForm (JEP-0004) awareness for Registration class +- workaround for iksemel's base64 bug + SASL Plain with GTalk and SASL Digest-MD5 with Wildfire now possible +- XMPP version requirement relaxed for Components +- added __declspec( dllimport ) on win32 (thanks to Low Weng Liong) +- fixed OpenSSL lib dependency on MinGW (thanks to Low Weng Liong) +- 'ported' to Syllable + + +v0.7.5 -- 05 Jan 2006 +-------------------- +- fixed a crash occuring if no DNS servers could be reached +- added virtual destructors to *Handlers +- fixed " bug +- various documentation updates + + +v0.7.4 -- 15 Dec 2005 +-------------------- +- RosterListener: added asynchronous subscription request notification +- LastActivity: fixed bug were stanza was not sent +- NonSaslAuth: don't confuse auth failure reason +- Connection: return correct disconnect reason if non-SASL auth fails in non-blocking connect mode +- RosterManager: handle 'early presence' correctly +- when using OpenSSL: imply: no cert == invalid cert +- RosterItem: added statusMsg() + + +v0.7.3 -- 10 Dec 2005 +-------------------- +- added optional OpenSSL support + + +v0.7.2 -- 06 Dec 2005 +-------------------- +- RosterManager: fixed a problem with servers not supporting private XML storage + + +v0.7.1 -- 24 Nov 2005 +-------------------- +- ported to NetBSD 2.1 +- RosterManager: use the group's name, not 'group' (thanks to Maciej Paszta) +- RosterManager: update/set an item's name +- include config.h.win in distribution +- Stanza: allow presence broadcasting in createPresenceStanza() +- Client: allow registration with server which supports SASL ANONYMOUS +- Client: init m_jid::server for registration + + +v0.7 -- 02 Nov 2005 +------------------- +- JEP-0004 (Data Forms) (complete, experimental) +- JEP-0013 (Flexible Offline Message Retrieval) (complete) +- JEP-0083 (Nested Roster Groups) (complete) +- JEP-0138 (Stream Compression) (experimental) +- removed pkg-config dependency (in check for iksemel) +- fixed pkg-config file (all libs) +- RosterItem: added status(); made setStatus() take a PresenceStatus +- RosterManager: added self-contact (optional; hard-wired in Client for now) +- Disco: no need to register the handler to receive query results (still necessary for 'set's) +- PrivateXML: no need to register the handler to store or receive private XML +- added IQ error handling in PrivateXML class +- port to Win32; SRV lookups do not work. See README.win32 for more information. +- some MacOS X #include fixes +- added Tag::clone() and Stanza::clone() +- added static functions to Stanza to create common packet types (IQ, Message, Presence, Subscription) +- gloox-config script +- call onDisconnect() in non-blocking connect() mode +- added debug notice about remote server not being XMPP compliant +- added an API docs notice about unsupported legacy SSL connections to port 5223 +- fixed a presence related bug in Stanza, where presence always was reported as 'available' (thanks to +Luis Cidoncha) +- made code ISO C++ compliant (-pedantic et al.) +- various API doc fixes +- many more virtuals in the handler interfaces instead of empty functions +- export raw file descriptor +- got rid of libm(ath) dependency (by using ostringstream) +- always use pre-increment instead of post-increment in for-loops +- export classes on w32 +- let configure check for libresolv +- don't use resolver functions on SkyOS for now (thanks to Peter Speybrouck & Robert Szeleney) +- made ClientBase::streamErrorAppCondition() const +- added ClientBase::removeConnectionListener() +- namespace checking for SASL success + + +v0.6.3 -- 15 Sep 2005 +--------------------- +- #include fixes for MacOS X + + +v0.6.2 -- 23 Sep 2005 +--------------------- +- pkgconfig file + + +v0.6.1 -- 22 Sep 2005 +--------------------- +- fixed Makefile.ams for make distcheck +- removed unused iksemel types and includes +- made void ClientBase::send( const std::string& ) private +- made void ClientBase::send( Tag* ) virtual +- Tag constructor: parent must know about its new child +- avoid non-constant array sizes in getID() et al. + + +v0.6 -- 02 Sep 2005 +------------------- +- more namespace checking +- extraction of application-specific error condition element of stream & stanza errors +- SASL Anonymous mechanism +- JEP-0012 (Last Activity) (experimental) +- fixes for a couple of small problems reported by Konstantin Klyagin +- made checkStreamVersion() a protected virtual +- extensive doc update: mainpage +- added 'from' attribute to presence stanzas (seems necessary under some circumstances, reported by Johan Bondeson) +- disabled sending of ack'ing 'subscribe'/'unsubscribe' in response to 'subscribed'/'unsubscribed' due to problems with jabberd2 + + +v0.5 -- 28 Aug 2005 +------------------- +- xml:lang for initial stream +- xml:lang support for subject, body and status of message and presence stanzas, respectively +- added ability to specify a server to connect to which is different from the JID's domain part +- xmpp version check +- recognition of all stream errors as defined in RFC 3920, including xml:lang of the text element +- recognition of all SASL/Non-SASL error conditions as defined in RFC 3920 and JEP-0078 +- added a LogHandler for external (non-tty) logging (thanks to Konstantin Klyagin) +- re-introduction of non-blocking connect (thanks to Konstantin Klyagin) +- recognition of all stanza errors as defined in RFC 3920, including xml:lang of the text element +- only include non-empty attributes +- prefer child elements over cdata when returning a tag's xml, prevents empty log if whitespace was sent +- correctly detect availability presence +- take autoPresence etc. into account when doing non-SASL auth +- in the JEP-0092 (Software Version) implementation: OS support, create a valid 'result' type of packet + + +v0.4.1 -- 25 Aug 2005 +--------------------- +- install missing header files (gloox.h, tag.h, stanza.h) + + +v0.4 -- 25 Aug 2005 +------------------- +- fixed some memory leaks +- renamed classes: JClient --> Client + JComponent --> Component +- got rid of the Iksemelmm wrapper classes +- added native Tag and Stanza classes +- added a (dummy) Parser class which currently only converts from Iksemel + types to gloox native types +- natively handle connection (send & recv), incl. TLS/SSL +- a generic tag handler (for non-XMPP:Core elements) +- fixed roster management (somehow everything but the jid in the initial + roster was ignored) +- process resource binding response +- process session creation response +- added forgotten 'autojoin' attribute to bookmark storage +- got rid of the thread +- TLS/SSL certificate verification +- changed license to GNU GPL + + +v0.3.2 -- 09 Aug 2005 +--------------------- +- fixed namespace typos +- correctly handle explicitely given port numbers + + +v0.3.1 -- 09 Aug 2005 +--------------------- +- documentation updates +- fixed crash with bare JID in constructor of JClient + + +v0.3 -- 08 Aug 2005 +--------------------- +- use ID tracking whereever possible/feasible +- privacy lists (RFC 3921) +- wrapped everything in 'gloox' namespace +- JEP-0048 (Bookmark Storage) +- JEP-0145 (Annotations) +- replaced IQ-Tag handler with better IQ-Namespace handler +- removed generic (catch-all) IQ handler +- JEP-0114 (Jabber Component Protocol) +- unregister *Handlers and *Listeners on destruction (thanks to Ray Keung) +- overhauled Private XML Storage +- revision of JEP-0050 (Ad-hoc Commands) +- revision of JEP-0030 (Service Discovery) +- overhauled Roster management + - finished RosterItem class +- JEP-0078 (Non-SASL Authentication) +- SRV lookups (w/o sorting by weight/cost) +- fix for JEP-0077 implementation to be compatible with ejabberd 0.9.1 which + sends registration values back in the result. + + +v0.2 -- 08 Jul 2005 +--------------------- +- JEP-0077 (In-Band Registration) +- prepping of JIDs according to RFC 3920 + + +v0.1 -- 04 May 2005 +--------------------- +* initial release with support for + - JEP-0030 (Service Discovery) + - JEP-0049 (Private XML Storage) + - JEP-0050 (Ad-hoc Commands) (providing commands to remote entities is implemented) + - JEP-0092 (Software Version) +- removed iksemelmm dependency +- iq xmlns filter +- introduced result handler +- extracted disco into separate class diff --git a/smack/smack/src/main/cpp/gloox/Doxyfile b/smack/smack/src/main/cpp/gloox/Doxyfile new file mode 100644 index 00000000..094ef6ae --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/Doxyfile @@ -0,0 +1,234 @@ +# Doxyfile 1.4.5 + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +PROJECT_NAME = gloox +PROJECT_NUMBER = 1.0.13 +OUTPUT_DIRECTORY = ./api/ +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English +USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = NO +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +DETAILS_AT_TOP = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 8 +ALIASES = xep{1}="XEP-\1" +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +BUILTIN_STL_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = NO +SUBGROUPING = YES +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = NO +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = YES +EXTRACT_LOCAL_METHODS = NO +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = YES +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = YES +SORT_BRIEF_DOCS = NO +SORT_BY_SCOPE_NAME = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = YES +SHOW_DIRECTORIES = YES +FILE_VERSION_FILTER = +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- +INPUT = ./src/ \ + ./UPGRADING +FILE_PATTERNS = *.cpp \ + *.h +RECURSIVE = YES +EXCLUDE = src/tests \ + src/examples \ + src/z \ + src/ex +EXCLUDE_SYMLINKS = YES +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = YES +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +USE_HTAGS = NO +VERBATIM_HEADERS = YES +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 4 +IGNORE_PREFIX = +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = YES +HTML_OUTPUT = . +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = NO +ENUM_VALUES_PER_LINE = 4 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- +GENERATE_LATEX = NO +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = +PDF_HYPERLINKS = NO +USE_PDFLATEX = NO +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- +GENERATE_RTF = NO +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- +GENERATE_MAN = NO +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = +XML_PROGRAMLISTING = YES +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- +GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = HAVE_TLS \ + HAVE_GNUTLS \ + HAVE_OPENSSL \ + HAVE_ZLIB \ + HAVE_WINTLS \ + HAVE_WINDNS \ + HAVE_MDNS +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- +CLASS_DIAGRAMS = NO +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +GROUP_GRAPHS = YES +UML_LOOK = NO +TEMPLATE_RELATIONS = YES +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = NO +DIRECTORY_GRAPH = YES +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +MAX_DOT_GRAPH_WIDTH = 1024 +MAX_DOT_GRAPH_HEIGHT = 1024 +MAX_DOT_GRAPH_DEPTH = 0 +DOT_TRANSPARENT = NO +DOT_MULTI_TARGETS = NO +GENERATE_LEGEND = YES +DOT_CLEANUP = YES +#--------------------------------------------------------------------------- +# Configuration::additions related to the search engine +#--------------------------------------------------------------------------- +SEARCHENGINE = NO diff --git a/smack/smack/src/main/cpp/gloox/INSTALL b/smack/smack/src/main/cpp/gloox/INSTALL new file mode 100644 index 00000000..eca01bd9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/INSTALL @@ -0,0 +1,28 @@ + +usual installation +------------------ + +./configure +make +make install + + +building from svn +----------------- + +./autogen.sh +./configure +make +make install + + +relevant configure options +-------------------------- + +By default, GnuTLS will be used for stream encryption if it is found. If not, +the system will be checked for OpenSSL. If you don't want to use GnuTLS even +though you have it installed, use the --without-gnutls switch to configure. + +Also by default, unit tests and example programs will be built. To save some time, +specify --without-examples and --without-tests to disable building the examples and +tests, respectively. diff --git a/smack/smack/src/main/cpp/gloox/LICENSE b/smack/smack/src/main/cpp/gloox/LICENSE new file mode 100644 index 00000000..c1100b0e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/LICENSE @@ -0,0 +1,693 @@ +An exception to the GPLv3 below to allow linking gloox against the OpenSSL library +can be found at the bottom of this file. + + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. 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 +them 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 prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. 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. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey 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; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If 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 convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + 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. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +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. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + 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 +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program 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, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + + + +OpenSSL exception +----------------- + +In addition, as a special exception, the copyright holders give +permission to link the code of portions of this program with the +OpenSSL library, and distribute linked combinations +including the two. +You must obey the GNU General Public License in all respects +for all of the code used other than OpenSSL. If you modify +file(s) with this exception, you may extend this exception to your +version of the file(s), but you are not obligated to do so. + \ No newline at end of file diff --git a/smack/smack/src/main/cpp/gloox/Makefile.am b/smack/smack/src/main/cpp/gloox/Makefile.am new file mode 100644 index 00000000..25330c45 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/Makefile.am @@ -0,0 +1,28 @@ +## +## Process this file with automake to produce Makefile.in +## + +SUBDIRS = src + +EXTRA_DIST = LICENSE Doxyfile gloox.pc.in gloox.cbp gloox.dsp gloox.vcproj README README.win32 README.wince README.symbian INSTALL config.h.win config.h.symbian UPGRADING bld.inf gloox.mmp + +pkgconfigdir=$(libdir)/pkgconfig +pkgconfig_DATA = gloox.pc + +bin_SCRIPTS = gloox-config + +apidox: + doxygen + +check: test + +test: + make -C src test + +leakcheck: leaktest + +leaktest: + make -C src leaktest + +includetest: + make -C src includetest diff --git a/smack/smack/src/main/cpp/gloox/Makefile.in b/smack/smack/src/main/cpp/gloox/Makefile.in new file mode 100644 index 00000000..be50d49e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/Makefile.in @@ -0,0 +1,895 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.unix.in \ + $(srcdir)/gloox-config.in $(srcdir)/gloox.pc.in \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + TODO config.guess config.sub depcomp install-sh ltmain.sh \ + missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h.unix +CONFIG_CLEAN_FILES = gloox.pc gloox-config +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)" +SCRIPTS = $(bin_SCRIPTS) +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +DATA = $(pkgconfig_DATA) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir dist dist-all distcheck +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = src +EXTRA_DIST = LICENSE Doxyfile gloox.pc.in gloox.cbp gloox.dsp gloox.vcproj README README.win32 README.wince README.symbian INSTALL config.h.win config.h.symbian UPGRADING bld.inf gloox.mmp +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = gloox.pc +bin_SCRIPTS = gloox-config +all: config.h.unix + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h.unix: stamp-h1 + @if test ! -f $@; then rm -f stamp-h1; else :; fi + @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi + +stamp-h1: $(srcdir)/config.h.unix.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h.unix +$(srcdir)/config.h.unix.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h.unix stamp-h1 +gloox.pc: $(top_builddir)/config.status $(srcdir)/gloox.pc.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +gloox-config: $(top_builddir)/config.status $(srcdir)/gloox-config.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f "$$d$$p"; then echo "$$d$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n' \ + -e 'h;s|.*|.|' \ + -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1; } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) { files[d] = files[d] " " $$1; \ + if (++n[d] == $(am__install_max)) { \ + print "f", d, files[d]; n[d] = 0; files[d] = "" } } \ + else { print "f", d "/" $$4, $$1 } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_SCRIPT) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; test -n "$(bindir)" || exit 0; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 's,.*/,,;$(transform)'`; \ + dir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir) + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool config.lt +install-pkgconfigDATA: $(pkgconfig_DATA) + @$(NORMAL_INSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ + done + +uninstall-pkgconfigDATA: + @$(NORMAL_UNINSTALL) + @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.unix.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.h.unix.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.unix.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.unix.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod u+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile $(SCRIPTS) $(DATA) config.h.unix +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkgconfigdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr \ + distclean-libtool distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-pkgconfigDATA + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-binSCRIPTS + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-binSCRIPTS uninstall-pkgconfigDATA + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ + ctags-recursive install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am am--refresh check check-am clean clean-generic \ + clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ + dist-zip distcheck distclean distclean-generic distclean-hdr \ + distclean-libtool distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-binSCRIPTS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-pkgconfigDATA install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags tags-recursive uninstall uninstall-am \ + uninstall-binSCRIPTS uninstall-pkgconfigDATA + + +apidox: + doxygen + +check: test + +test: + make -C src test + +leakcheck: leaktest + +leaktest: + make -C src leaktest + +includetest: + make -C src includetest + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/NEWS b/smack/smack/src/main/cpp/gloox/NEWS new file mode 100644 index 00000000..e69de29b diff --git a/smack/smack/src/main/cpp/gloox/README b/smack/smack/src/main/cpp/gloox/README new file mode 100644 index 00000000..b5b966bf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/README @@ -0,0 +1,19 @@ + +For build instructions on *NIX/Linux/BSD-like systems see INSTALL. +For build instructions on Windows see README.win32. +For build instructions on Windows CE/Mobile see README.wince. +For build instructions on Symbian/Nokia S60 see README.symbian. + + +For API documentation run make apidox, run doxygen directly, or go to http://camaya.net/api/gloox/ + +If you plan to contribute to gloox, please be aware of the following: + +Due to the commercial licensing which is available for the gloox library, +I have to request the copyright to any modifications which go into the +official distribution. I will not include code for which I don't have the +copyright. If you do not agree with this, please don't send any code to me +or the mailing list. + +Thanks, +Jakob diff --git a/smack/smack/src/main/cpp/gloox/README.symbian b/smack/smack/src/main/cpp/gloox/README.symbian new file mode 100644 index 00000000..54d29cbb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/README.symbian @@ -0,0 +1,25 @@ +Building on Symbian/Nokia S60 using S60 SDK 3rd Edition +------------------------------------------------------- + +gloox compiles (at least) on: +- Linux cross-compile environment (see http://martin.st/symbian) +- Carbide.c++ 2.0 + +You will need the Open C/C++ plugin for the S60 SDK. + +No other compilers are officially supported at this point. Please let me know about +your experiences with other compilers. + +Project files (bld.inf, gloox.mmp) are included. They can be imported into Carbide.c++. + +- Edit config.h.symbian to suit your needs. The defaults should be fine. +- build + + +NOTE WELL +--------- +The code has not been tested on Symbian/S60 by the author. It has only been compiled. +Feedback is welcome. + +The OpenSSL server code (class OpenSSLServer from tlsopensslserver.h/cpp) does not +compile at this point. diff --git a/smack/smack/src/main/cpp/gloox/README.win32 b/smack/smack/src/main/cpp/gloox/README.win32 new file mode 100644 index 00000000..308c3db4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/README.win32 @@ -0,0 +1,60 @@ +Building on Win32 +----------------- + +gloox compiles (at least) on: +- MinGW (http://mingw.org) +- MS Visual C++ Express 2008 + +As of 1.0-alpha1, gloox DOES NOT compile on: +- MSVC 6 + +No other compilers are officially supported at this point. Please let me know about +your experiences with other compilers. + +See README.wince for info on building gloox for Win CE/Mobile + +Project files for Code::Blocks (gloox.cbp), Visual C++ Express 2008 (gloox.vcproj), +and MSVC 6 (gloox.dsp) are included. The latter can be imported by other IDEs. + +- Edit config.h.win to suit your needs. +- Add additional libs you have available to the project. +- If you have an old Platform SDK (e.g. the one shipped with stock MSVC6, which lacks windns.h), + undefine HAVE_WINDNS_H in config.h.win. SRV resolving is disabled in this case. +- You will also need a newer Platform SDK if you wanted to use winapi's TLS implementation (SChannel). + Undefine HAVE_WINTLS in config.h.win if you don't have schannel.h. + + +Building gloox in MinGW and Code::Blocks +---------------------------------------- + +gloox should build out of the box on MinGW. If using MSys, you should run configure with +the --with-schannel flag. + + +Building gloox on MSVC++ +------------------------ + +- use the included project file or create your own +- adjust include + library paths if necessary +- to receive any debug output you should use the LogSink facilities (this is not win32-specific) +- build + + +Building libidn in Win32 +------------------------ + +- install mingw + msys from http://www.mingw.org, including mingw-utils +- build libidn 1.1 or above in msys/mingw + +If you want to use libidn in MSVC, type the following in a shell to create msvc import libs: + $ pexports libidn-11.dll > libidn-11.def + $ lib /def:libidn-11.def + +pexports is part of the mingw-utils package. + + +Linking your application against gloox +-------------------------------------- + +- When building a program that links against gloox, make sure you have GLOOX_IMPORTS defined. +- Make sure you use the same runtime library for both gloox and your app. diff --git a/smack/smack/src/main/cpp/gloox/README.wince b/smack/smack/src/main/cpp/gloox/README.wince new file mode 100644 index 00000000..6a7d07c2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/README.wince @@ -0,0 +1,22 @@ +Note: The following is not currently verified to be true for gloox 1.0-alpha1. + +Building on Win CE/Pocket PC 2003 +--------------------------------- + +gloox compiles (at least) on +- eMbedded Visual C++ 4.0 + +No other compilers have been tested. + +A project file for eVC++4 is included. + +For eVC++ 4 you will need: +- the STL update from http://users.libero.it/g.govi/ or + http://www.pocketpcdn.com/libraries/stl.html +- RTTI fixes from http://support.microsoft.com/kb/830482 + +- Edit config.h.win to suit your needs. As far as I know you should comment out everything. + +disabled features: +- SRV record support +- In-Band Bytestreams diff --git a/smack/smack/src/main/cpp/gloox/TODO b/smack/smack/src/main/cpp/gloox/TODO new file mode 100644 index 00000000..ce8c7e8d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/TODO @@ -0,0 +1,56 @@ +Todo +---- + +for 1.0 +- XEP-0155 (Stanza Session Negotiation) +- XEP-0213 (XMPP Intermediate IM Client 2008) (Stanza Session Negotiation) +- complete XEP-0077 (DataForms) +- check again for conformance to XEP-0085 +- check again for conformance to XEP-0022 +- in FT, add Fast Mode: + http://delta.affinix.com/specs/stream.html +- comply with rfc3920bis/rfc3921bis (or current drafts), which includes at least: + - look into (removed) acks for presence subscribed, unsubscribe, unsubscribed +- more XPath + - XPath stanza filter +- check serverRaw() use (ClientBase::m_server) +- comply with RFC2831, Section 7.2, i.e. escape SASL-special chars in usernames +- check Openfire/no-SSL + gloox. seems to cause problems after requesting the roster. -- not reproducible +- get rid of IQ::m_tag/IQ::query()/IQ::xmlns() +- add inspector? + +- unit tests for: PrivacyManager, LastActivity, FlexOff + + +optional for 1.0: +- XEP-0174 (Link-Local Messaging) + - zeroconf support in XEP-0065 +- ClientBase: Tag queueing? + +- libidn replacement? + +- unit tests +- dns, linux, dyndns and 127.0.0.1 + +- overhaul all XEP implementations (and note implemented version number) +- RosterItem::status ::statusMsg for highest prio + +- XEP-0166 (Jingle Signaling) +- XEP-0175 (Best Practices for Use of SASL ANONYMOUS) +- XEP-0186 (Invisible Command) +- XEP-0198 (Stanza Acknowledgements) +- vcard-temp: support AGENT, CATEGORIES, SOUND, KEY +- make socket tunable (keepalive) +- allow for registration and immediate connection from within the same Client object +- bindings (C, ...) (SWIG) +- add prePresenceHook (for XEP-0182 (Invisible Command)) +- fix STLport support/configure check (broken on autoconf 2.61?) +- IPv6 support + + +- check subjectAltName for JIDs (core sec. 5.1 rule 8) +- introduce some 'randomness' for IDs +- introduce return values for *Handlers to indicate whether following handlers should be invoked as well +- empty passwords allowed? + + diff --git a/smack/smack/src/main/cpp/gloox/UPGRADING b/smack/smack/src/main/cpp/gloox/UPGRADING new file mode 100644 index 00000000..062b9526 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/UPGRADING @@ -0,0 +1,324 @@ +/** + * @page upgrading Upgrading from earlier versions + * + * This page contains information about upgrading gloox from an earlier version to the current one. + * It lists the API changes that were made and how to change your code to achieve the same + * (or better) functionality as with the earlier version. + * + * @tableofcontents + * + * @section upgrading_09_10 1. Upgrading from 0.9.x to 1.0 + * + * Besides the changes detailed below, a major change is that the Stanza class now is an abstract + * base for more specialized + * @link gloox::Message Message @endlink, @link gloox::Presence Presence @endlink, + * @link gloox::IQ IQ @endlink, and @link gloox::Subscription Subscription @endlink classes. + * Therefore, + * @link gloox::PresenceHandler PresenceHandler @endlink, + * @link gloox::MessageHandler MessageHandler @endlink, + * @link gloox::SubscriptionHandler SubscriptionHandler @endlink, and + * @link gloox::IqHandler IqHandler @endlink no longer take a Stanza* argument, but receive + * a pointer to the respective specialized class. Additionally, in a move to get away from + * unsafe pointers to safer references, these pointer-taking functions have been deprecated + * (but will continue to be available throughout the 1.0.x cycle). + * The recommended usage looks as follows: + * + * Old code: + * @code + * void MyClass::handlePresence( Stanza* stanza ) + * { + * // ... + * } + * @endcode + * + * New code (deprecated): + * @code + * void MyClass::handlePresence( Presence* pres ) + * { + * // ... + * } + * @endcode + * or + * New code (recommended): + * @code + * void MyClass::handlePresence( const Presence& pres ) + * { + * // ... + * } + * @endcode + * + * @subsection deprecated_10 1.1 Deprecated classes and functions + * + * @subsubsection func_MUCRoomHandler_handleMucMessage 1.1.1 MUCRoomHandler::handleMUCMessage( MUCRoom*, string, string, bool, string, bool ), + * + * Use @link gloox::MUCRoomHandler::handleMUCMessage( MUCRoom*, const Message&, bool ) handleMUCMessage( MUCRoom*, Message&, bool ) @endlink instead. + * + * Due to the newly available StanzaExtensions, some of handleMUCMessage()'s arguments are obsolete: + * Instead of single values, all of these are included in the new @c msg parameter, which is the + * full Message stanza: + * + * @li the speaker's nick name, + * @code const std::string nick = msg.from().resource(); @endcode + * @li the message body, + * @code const std::string body = msg.body(); @endcode + * @li whether this message is part of the room history, + * @code + * bool history = msg.when() ? true : false; + * @endcode + * @li the message's time stamp. + * @code + * const DelayedDelivery* dd = msg.when(); + * if( dd ) + * printf( "message was sent at %s\n", dd->stamp().c_str() ); + * @endcode + * + * @subsubsection func_ClientBase_trackID 1.1.2 ClientBase::trackID() + * + * The functionality provided by this function really makes sense only for IQ stanzas of type + * get or set. As a result, there is a new function + * @link gloox::ClientBase::send( IQ&, IqHandler*, int, bool ) ClientBase::send( IQ&, IqHandler*, int ) @endlink + * that combines trackID()'s and send()'s functionality. + * + * Old code: + * @code + * const std::string& id = m_client->getID(); + * Tag* iq = ... + * iq->addAtrribute( "id", id ); + * ... + * m_client->trackID( this, id, SomeContext ); + * m_client->send( iq ); + * @endcode + * + * New code: + * @code + * IQ iq( IQ::Set, recipientJID ); + * ... + * m_client->send( iq, this, SomeContext ); + * @endcode + * + * Further, it is no longer necessary to explicitely add an ID to the IQ (for requests of type + * 'get' or 'set; 'result' and 'error' IQs need to have the IQ's ID passed they are supposed + * to answer). send() will take care of this. + * + * @subsubsection func_DiscoHandler_handleDiscoInfoResult 1.1.3 DiscoHandler::handleDiscoInfoResult() + * + * The function + * gloox::DiscoHandler::handleDiscoInfoResult() + * has been removed. Replacement is: + * @link gloox::DiscoHandler::handleDiscoInfo() DiscoHandler::handleDiscoInfo() @endlink. + * + * @subsubsection func_DiscoHandler_handleDiscoItemsResult 1.1.4 DiscoHandler::handleDiscoItemsResult() + * + * The function + * gloox::DiscoHandler::handleDiscoItemsResult() + * has been removed. Replacement is: + * @link gloox::DiscoHandler::handleDiscoItems() DiscoHandler::handleDiscoItems() @endlink. + * + * @subsubsection func_DiscoHandler_handleDiscoError 1.1.5 DiscoHandler::handleDiscoError() + * + * The function + * gloox::DiscoHandler::handleDiscoError( IQ*, int ) + * has been removed. Replacement is: + * @link gloox::DiscoHandler::handleDiscoError( const JID&, const Error*, int ) DiscoHandler::handleDiscoError( const JID&, const Error*, int ) @endlink. + * + * @subsubsection func_MUCRoom_destroy 1.1.6 MUCRoom::destroy() + * + * The default argument now is a const reference to a JID -- defaulting to en empty JID -- + * instead of a pointer to a JID object. + * + * + * + * + * @subsection removed_10 1.2 Removed classes and functions + * + * @subsubsection class_XDelayedDelivery 1.2.1 XDelayedDelivery + * + * The class XDelayedDelivery has been removed as the XSF replaced XEP-0091 with XEP-0203. The class + * @link gloox::DelayedDelivery DelayedDelivery @endlink covers both XEPs. + * + * @subsubsection func_JID_fullJID 1.2.2 JID::fullJID() + * + * Use the copy constructor instead. E.g.: + * + * Old code: + * @code + * JID j( "somejid" ); + * JID copy = j.fullJID(); + * @endcode + * + * New code: + * @code + * JID j( "somejid" ); + * JID copy( j ); + * @endcode + * + * @subsubsection func_JID_empty 1.2.3 JID::empty() + * + * This function has been replaced by JID::operator bool(). This has the added benefit of validity + * checking. E.g.: + * + * Old code: + * @code + * JID j; + * // ... + * if( !j.empty() ) + * { + * // do something + * } + * @endcode + * + * New code: + * @code + * JID j; + * // ... + * if( j ) // this evaluates to true only if the JID is not empty and if the contained JID + * // is in fact valid, i.e. if no prepping operation failed. + * { + * // do something + * } + * @endcode + * + * @subsubsection func_Tag_empty 1.2.4 Tag::empty() + * + * This function has been replaced by Tag::operator bool(). This has the added benefit of validity + * checking. E.g.: + * + * Old code: + * @code + * Tag t; + * // ... + * if( !t.empty() ) + * { + * // do something + * } + * @endcode + * Or: + * @code + * Tag* t = new Tag( "foo" ); + * // ... + * if( !t->empty() ) + * { + * // do something + * } + * @endcode + * + * New code: + * @code + * Tag t; + * // ... + * if( t ) + * { + * // do something + * } + * @endcode + * Or: + * @code + * Tag* t = new Tag( "foo" ); + * // ... + * if( *t ) + * { + * // do something + * } + * @endcode + * + * @subsubsection func_Tag_attributes 1.2.5 Tag::attributes() (non-const) + * + * This function has been removed. Use the const version instead. To delete an attribute, + * use the new @link gloox::Tag::removeAttribute() removeAttribute() @endlink. + * + * @subsubsection func_Tag_attributes 1.2.6 Tag::children() (non-const) + * + * This function has been removed. Use the const version instead. To delete a child element, + * use @link gloox::Tag::removeChild() removeChild() @endlink. + * + * @subsubsection func_createStanzas 1.2.7 Stanza::createMessageStanza(), Stanza::createPresenceStanza(), Stanza::createIqStanza(), Stanza::createSubscriptionStanza() + * + * These functions have been removed in favour of the more specialized classes + * @link gloox::Message Message @endlink, @link gloox::Presence Presence @endlink, + * @link gloox::IQ IQ @endlink, and @link gloox::Subscription Subscription @endlink. + * + * @subsubsection class_InBandBytestreamManager 1.2.8 InBandBytestreamManager + * + * The Message-based Inband Bytestream implementation has been removed in favour of an IQ-based one. + * Also, Inband Bytestreams are now handled (transparently) by @link gloox::SIProfileFT SIProfileFT @endlink. + * + * @subsubsection func_AdhocHandler_handleAdhocError 1.2.9 AdhocHandler::handleAdhocError( const JID&, StanzaError ) + * + * This function has been removed in favor of + * @link gloox::AdhocHandler::handleAdhocError( const JID&, const Error* ) handleAdhocError( const JID&, const Error* ) @endlink. + * + * @subsubsection func_SIProfileFTHandler_handleFTRequestError 1.2.10 SIProfileFTHandler::handleFTRequestError( IQ*, const std::string& ) + * + * This function has been removed in favor of + * @link gloox::SIProfileFTHandler::handleFTRequestError( const IQ&, const std::string& ) handleFTRequestError( const IQ&, const std::string& ) @endlink. + * + * @subsubsection func_BytestreamHandler_handelBytestreamError 1.2.11 BytestreamHandler::handleBytestreamError( IQ* iq, const std::string& sid ) + * + * This function has been removed in favor of + * @link gloox::BytestreamHandler::handleBytestreamError( const IQ& iq, const std::string& ) handleBytestreamError( const IQ& iq, const std::string& sid ) @endlink. + * + * @subsubsection func_BytestreamDataHandler_handelBytestreamError 1.2.12 BytestreamDataHandler::handleBytestreamError( Bytestream* bs, IQ* ) + * + * This function has been removed in favor of + * @link gloox::BytestreamDataHandler::handleBytestreamError( Bytestream* bs, const IQ& ) handleBytestreamError( Bytestream* bs, const IQ& ) @endlink. + * + * @subsubsection func_Disco_category 1.2.13 Disco::category() + * + * This function has been removed. Use @link gloox::Disco::identities() Disco::identities() @endlink + * instead. + * + * @subsubsection func_Disco_type 1.2.14 Disco::type() + * + * This function has been removed. Use @link gloox::Disco::identities() Disco::identities() @endlink + * instead. + * + * @subsubsection func_PrivateXMLHandler_handlePrivateXML 1.2.15 PrivateXMLHandler::handlePrivateXML( const std::string&, Tag* ) + * + * This function has been removed in favor of + * @link gloox::PrivateXMLHandler::handlePrivateXML() PrivateXMLHandler::handlePrivateXML( const Tag* ) @endlink. + * + * @subsubsection func_PrivateXML_storeXML 1.2.16 PrivateXML::storeXML( Tag*, PrivateXMLHandler* ) + * + * This function has been removed in favor of + * @link gloox::PrivateXML::storeXML() PrivateXML::storeXML( const Tag*, PrivateXMLHandler* ) @endlink. + * + * @subsubsection func_Client 1.2.17 Client::Client( string, string, string, string, int ) + * + * This function has been removed. The only recommended alternative is + * @link gloox::Client::Client() Client::Client( const JID&, const std::string&, int ) @endlink. + * + * + * + * + * + * + * @subsection semantics_10 1.3 Semantic Changes + * + * @subsubsection param_handleFTRequest 1.3.1 SIProfileFTHandler::handleFTRequest() + * + * The second parameter is now a Session ID (sid). This should be used with + * @link gloox::SIProfileFT::acceptFT() SIProfileFT::acceptFTRequest() @endlink or + * @link gloox::SIProfileFT::declineFT() SIProfileFT::declineFTRequest() @endlink. + * + * @subsubsection param_acceptFTRequest 1.3.2 SIProfileFT::acceptFTRequest() + * + * The second parameter is now a Session ID (sid). It must be the same value as the Session ID (sid) + * passed to + * @link gloox::SIProfileFTHandler::handleFTRequest() SIProfileFTHandler::handleFTRequest() @endlink. + * Further, the function has been renamed to + * @link gloox::SIProfileFT::acceptFT() acceptFT() @endlink. + * + * @subsubsection param_declineFTRequest 1.3.3 SIProfileFT::declineFTRequest() + * + * The second parameter is now a Session ID (sid). It must be the same value as the Session ID (sid) + * passed to + * @link gloox::SIProfileFTHandler::handleFTRequest() SIProfileFTHandler::handleFTRequest() @endlink. + * Further, the function has been renamed to + * @link gloox::SIProfileFT::declineFT() declineFT() @endlink. + * + * @section upgrading_10_101 2. Upgrading from to 1.0 to 1.0.1 + * + * NB: 1.0.1 is not binary-compatible to 1.0. The reason for that is the addition of support for XEP-0174, which made it + * necessary to add a parameter to @link gloox::ClientBase::handleStartNode( const Tag* ) ClientBase::handleStartNode() @endlink. + * + */ diff --git a/smack/smack/src/main/cpp/gloox/acinclude.m4 b/smack/smack/src/main/cpp/gloox/acinclude.m4 new file mode 100644 index 00000000..ab8e8392 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/acinclude.m4 @@ -0,0 +1,194 @@ +AC_DEFUN([ACX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_SAVE +AC_LANG_C +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes) + AC_MSG_RESULT($acx_pthread_ok) + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no) + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + AC_TRY_LINK([#include ], + [pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); ], + [acx_pthread_ok=yes]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT($acx_pthread_ok) + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_TRY_LINK([#include ], [int attr=$attr; return attr;], + [attr_name=$attr; break]) + done + AC_MSG_RESULT($attr_name) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + AC_MSG_RESULT(${flag}) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + +AC_SUBST(PTHREAD_LIBS) +AC_SUBST(PTHREAD_CFLAGS) +AC_SUBST(PTHREAD_CC) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) + : +else + acx_pthread_ok=no + $2 +fi +AC_LANG_RESTORE +])dnl ACX_PTHREAD diff --git a/smack/smack/src/main/cpp/gloox/aclocal.m4 b/smack/smack/src/main/cpp/gloox/aclocal.m4 new file mode 100644 index 00000000..fc8130c2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/aclocal.m4 @@ -0,0 +1,9732 @@ +# generated automatically by aclocal 1.11.6 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, +# Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +]) + +# serial 57 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +m4_defun([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from `configure', and `config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# `config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain="$ac_aux_dir/ltmain.sh" +])# _LT_PROG_LTMAIN + + + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the `libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to `config.status' so that its +# declaration there will have the same value as in `configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags="_LT_TAGS"dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into `config.status', and then the shell code to quote escape them in +# for loops in `config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# `#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test $lt_write_fail = 0 && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +\`$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test $[#] != 0 +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try \`$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try \`$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test "$silent" = yes && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +_LT_COPYING +_LT_LIBTOOL_TAGS + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + _LT_PROG_REPLACE_SHELLFNS + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + m4_if([$1], [CXX], +[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script which will find a shell with a builtin +# printf (which we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case "$ECHO" in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[ --with-sysroot[=DIR] Search for dependent libraries within DIR + (or the compiler's sysroot if not specified).], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([${with_sysroot}]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and in which our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test x"[$]$2" = xyes; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links="nottested" +if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", + [Define to the sub-directory in which libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || + test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], + [Run-time system search path for libraries]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program which can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program which can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi]) +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + _LT_TAGVAR(link_all_deplibs, $1)=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + _LT_TAGVAR(link_all_deplibs, $1)=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS="$save_LDFLAGS"]) + if test "$lt_cv_irix_exported_symbol" = yes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting ${shlibpath_var} if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report which library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC="$lt_save_CC" +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to `libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + + _LT_TAGVAR(GCC, $1)="$GXX" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)="${prev}${p}" + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)="$p" + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)="$p" + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test "X$F77" = "Xno"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_F77" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$G77" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC="$lt_save_CC" + CFLAGS="$lt_save_CFLAGS" +fi # test "$_lt_disable_F77" != yes + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test "X$FC" = "Xno"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_disable_FC" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC="$CC" + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" + _LT_TAGVAR(LD, $1)="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test "$_lt_disable_FC" != yes + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)="$LD" +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to `libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +AC_MSG_RESULT([$xsi_shell]) +_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) + +AC_MSG_CHECKING([whether the shell understands "+="]) +lt_shell_append=no +( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +AC_MSG_RESULT([$lt_shell_append]) +_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) +# ------------------------------------------------------ +# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and +# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. +m4_defun([_LT_PROG_FUNCTION_REPLACE], +[dnl { +sed -e '/^$1 ()$/,/^} # $1 /c\ +$1 ()\ +{\ +m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) +} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: +]) + + +# _LT_PROG_REPLACE_SHELLFNS +# ------------------------- +# Replace existing portable implementations of several shell functions with +# equivalent extended shell implementations where those features are available.. +m4_defun([_LT_PROG_REPLACE_SHELLFNS], +[if test x"$xsi_shell" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl + case ${1} in + */*) func_dirname_result="${1%/*}${2}" ;; + * ) func_dirname_result="${3}" ;; + esac + func_basename_result="${1##*/}"]) + + _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary parameter first. + func_stripname_result=${3} + func_stripname_result=${func_stripname_result#"${1}"} + func_stripname_result=${func_stripname_result%"${2}"}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl + func_split_long_opt_name=${1%%=*} + func_split_long_opt_arg=${1#*=}]) + + _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) + + _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl + case ${1} in + *.lo) func_lo2o_result=${1%.lo}.${objext} ;; + *) func_lo2o_result=${1} ;; + esac]) + + _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) + + _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) + + _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) +fi + +if test x"$lt_shell_append" = xyes; then + _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) + + _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl + func_quote_for_eval "${2}" +dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ + eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) +fi +]) + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine which file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS + +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 7 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option `$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl `shared' nor `disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + ]) +])# _LT_SET_OPTIONS + + + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the `shared' and +# `disable-shared' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the `static' and +# `disable-static' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the `fast-install' +# and `disable-fast-install' LT_INIT options. +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the `disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the `pic-only' and `no-pic' +# LT_INIT options. +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [pic_mode=default]) + +test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the `pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) + +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59 which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) + +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 3337 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.2]) +m4_define([LT_PACKAGE_REVISION], [1.3337]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.2' +macro_revision='1.3337' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) + +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) + +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant . +# +# 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.6], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.6])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, +# 2010, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 12 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, +# Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software +# Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 1 + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 3 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + +m4_include([acinclude.m4]) diff --git a/smack/smack/src/main/cpp/gloox/bld.inf b/smack/smack/src/main/cpp/gloox/bld.inf new file mode 100644 index 00000000..ec10d1c2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/bld.inf @@ -0,0 +1,15 @@ +/* + Copyright (c) 2009-2013 by Jakob Schroeter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +prj_mmpfiles + +gloox.mmp diff --git a/smack/smack/src/main/cpp/gloox/config.guess b/smack/smack/src/main/cpp/gloox/config.guess new file mode 100644 index 00000000..d622a44e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/config.guess @@ -0,0 +1,1530 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-02-10' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/smack/smack/src/main/cpp/gloox/config.h.android b/smack/smack/src/main/cpp/gloox/config.h.android new file mode 100644 index 00000000..6c443355 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/config.h.android @@ -0,0 +1,130 @@ +/* config.h.unix. Generated from config.h.unix.in by configure. */ +/* config.h.unix.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `dn_skipname' function. */ +#define HAVE_DN_SKIPNAME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if GCC atomic builtins are available */ +#define HAVE_GCC_ATOMIC_BUILTINS 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +/* #undef HAVE_GETADDRINFO */ + +/* Define to 1 if you want TLS support (GnuTLS). Undefine HAVE_OPENSSL. */ +/* #undef HAVE_GNUTLS */ + +/* Define to 1 if you have GnuTLS 2.12.0 or above. */ +/* #undef HAVE_GNUTLS_SESSION_CHANNEL_BINDING */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `bind' library (-lbind). */ +/* #undef HAVE_LIBBIND */ + +/* Define to 1 if you want IDN support. */ +/* #undef HAVE_LIBIDN */ + +/* Define to 1 if you have the `resolv' library (-lresolv). */ +/* #undef HAVE_LIBRESOLV */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* enable mdns support */ +/* #undef HAVE_MDNS */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you want TLS support (OpenSSL). Undefine HAVE_GNUTLS. */ +/* #undef HAVE_OPENSSL */ + +/* Define if you have POSIX threads libraries and header files. */ +#define HAVE_PTHREAD 1 + +/* Define to 1 if you have the `res_query' function. */ +#define HAVE_RES_QUERY 1 + +/* Define to 1 if you have the `res_querydomain' function. */ +/* #undef HAVE_RES_QUERYDOMAIN */ + +/* Define to 1 if you have the `setsockopt' function. */ +#define HAVE_SETSOCKOPT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you want Stream Compression support. */ +/* #undef HAVE_ZLIB */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "gloox" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "js@camaya.net" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "gloox" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "gloox 1.0.13" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "gloox" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.0.13" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "1.0.13" + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif diff --git a/smack/smack/src/main/cpp/gloox/config.h.ohos b/smack/smack/src/main/cpp/gloox/config.h.ohos new file mode 100644 index 00000000..6c443355 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/config.h.ohos @@ -0,0 +1,130 @@ +/* config.h.unix. Generated from config.h.unix.in by configure. */ +/* config.h.unix.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_NAMESER_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `dn_skipname' function. */ +#define HAVE_DN_SKIPNAME 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if GCC atomic builtins are available */ +#define HAVE_GCC_ATOMIC_BUILTINS 1 + +/* Define to 1 if you have the `getaddrinfo' function. */ +/* #undef HAVE_GETADDRINFO */ + +/* Define to 1 if you want TLS support (GnuTLS). Undefine HAVE_OPENSSL. */ +/* #undef HAVE_GNUTLS */ + +/* Define to 1 if you have GnuTLS 2.12.0 or above. */ +/* #undef HAVE_GNUTLS_SESSION_CHANNEL_BINDING */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `bind' library (-lbind). */ +/* #undef HAVE_LIBBIND */ + +/* Define to 1 if you want IDN support. */ +/* #undef HAVE_LIBIDN */ + +/* Define to 1 if you have the `resolv' library (-lresolv). */ +/* #undef HAVE_LIBRESOLV */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* enable mdns support */ +/* #undef HAVE_MDNS */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you want TLS support (OpenSSL). Undefine HAVE_GNUTLS. */ +/* #undef HAVE_OPENSSL */ + +/* Define if you have POSIX threads libraries and header files. */ +#define HAVE_PTHREAD 1 + +/* Define to 1 if you have the `res_query' function. */ +#define HAVE_RES_QUERY 1 + +/* Define to 1 if you have the `res_querydomain' function. */ +/* #undef HAVE_RES_QUERYDOMAIN */ + +/* Define to 1 if you have the `setsockopt' function. */ +#define HAVE_SETSOCKOPT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you want Stream Compression support. */ +/* #undef HAVE_ZLIB */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define LT_OBJDIR ".libs/" + +/* Name of package */ +#define PACKAGE "gloox" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "js@camaya.net" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "gloox" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "gloox 1.0.13" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "gloox" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.0.13" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION "1.0.13" + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif diff --git a/smack/smack/src/main/cpp/gloox/config.h.symbian b/smack/smack/src/main/cpp/gloox/config.h.symbian new file mode 100644 index 00000000..b08f844e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/config.h.symbian @@ -0,0 +1,15 @@ +/** + * Uncomment whichever lib you have installed. + */ + +/* Comment out if you don't have zlib available or don't want to use it */ +#define HAVE_ZLIB 1 + +/* Comment out if you don't have OpenSSL available or don't want to use it */ +#define HAVE_OPENSSL 1 + +/* Uncomment if you have LibIDN available and want to use it */ +// #define HAVE_LIBIDN 1 + +/* Comment out if you don't have the `setsockopt' function. Usually available. */ +#define HAVE_SETSOCKOPT 1 diff --git a/smack/smack/src/main/cpp/gloox/config.h.unix.in b/smack/smack/src/main/cpp/gloox/config.h.unix.in new file mode 100644 index 00000000..ca76c122 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/config.h.unix.in @@ -0,0 +1,129 @@ +/* config.h.unix.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_NAMESER_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `dn_skipname' function. */ +#undef HAVE_DN_SKIPNAME + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if GCC atomic builtins are available */ +#undef HAVE_GCC_ATOMIC_BUILTINS + +/* Define to 1 if you have the `getaddrinfo' function. */ +#undef HAVE_GETADDRINFO + +/* Define to 1 if you want TLS support (GnuTLS). Undefine HAVE_OPENSSL. */ +#undef HAVE_GNUTLS + +/* Define to 1 if you have GnuTLS 2.12.0 or above. */ +#undef HAVE_GNUTLS_SESSION_CHANNEL_BINDING + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `bind' library (-lbind). */ +#undef HAVE_LIBBIND + +/* Define to 1 if you want IDN support. */ +#undef HAVE_LIBIDN + +/* Define to 1 if you have the `resolv' library (-lresolv). */ +#undef HAVE_LIBRESOLV + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* enable mdns support */ +#undef HAVE_MDNS + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you want TLS support (OpenSSL). Undefine HAVE_GNUTLS. */ +#undef HAVE_OPENSSL + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Define to 1 if you have the `res_query' function. */ +#undef HAVE_RES_QUERY + +/* Define to 1 if you have the `res_querydomain' function. */ +#undef HAVE_RES_QUERYDOMAIN + +/* Define to 1 if you have the `setsockopt' function. */ +#undef HAVE_SETSOCKOPT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you want Stream Compression support. */ +#undef HAVE_ZLIB + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif diff --git a/smack/smack/src/main/cpp/gloox/config.h.win b/smack/smack/src/main/cpp/gloox/config.h.win new file mode 100644 index 00000000..aa8becf6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/config.h.win @@ -0,0 +1,50 @@ +/** + * Uncomment whichever lib you have installed. + */ + +/* Uncomment if you have zlib available and want to use it */ +// #define HAVE_ZLIB 1 + +/* Comment out if you don't want to use Win's native TLS functions */ +#define HAVE_WINTLS 1 + +/* Uncomment if you are compiling for Windows 7 or above, or Windows Server 2008 R2 and above, and + * want to be able to use Channel Binding (with SASL SCRAM-SHA-1-PLUS). */ +// #define HAVE_WINTLS_CHANNEL_BINDING 1 + +/* Uncomment if you have GnuTLS available and want to use it */ +// #define HAVE_GNUTLS 1 + +/* Uncomment if you have GnuTLS 2.12.0 or above */ +// #define HAVE_GNUTLS_SESSION_CHANNEL_BINDING 1 + +/* Uncomment if you have OpenSSL available and want to use it */ +// #define HAVE_OPENSSL 1 + +/* Uncomment if you have LibIDN available and want to use it */ +// #define HAVE_LIBIDN 1 + +/* Uncomment if you have the getaddrinfo function and want IPv6 support (XP and up) */ +// #define HAVE_GETADDRINFO 1 + +/* Comment out if you don't have windns.h (e.g. if you use an old Platform SDK) */ +#define HAVE_WINDNS_H 1 + +/* Comment out if you don't have the `setsockopt' function. Usually available. */ +#define HAVE_SETSOCKOPT 1 + +#ifdef _MSC_VER +#pragma comment( lib, "Dnsapi.lib" ) +#pragma comment( lib, "Secur32.lib" ) +#pragma comment( lib, "Crypt32.lib" ) +#pragma comment( lib, "ws2_32.lib" ) + +/* The following silences a few C4355 warnings ('this' : used in member initializer list). + This is only used with Parser which doesn't do anything with its TagHandler in the ctor, + so muting C4355 is safe. */ +#pragma warning( disable : 4355 ) + +/* The following silcences warnings concerning "unsafe" functions (sprintf, strncpy, etc.). + They are used in a safe way here, though. */ +#pragma warning( disable : 4996 ) +#endif diff --git a/smack/smack/src/main/cpp/gloox/config.sub b/smack/smack/src/main/cpp/gloox/config.sub new file mode 100644 index 00000000..6205f842 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/config.sub @@ -0,0 +1,1782 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +timestamp='2012-04-18' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i386-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/smack/smack/src/main/cpp/gloox/configure b/smack/smack/src/main/cpp/gloox/configure new file mode 100644 index 00000000..f45f84a0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/configure @@ -0,0 +1,19654 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for gloox 1.0.13. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 + + test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ + || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and js@camaya.net +$0: about your system, including any error possibly output +$0: before this message. Then install a modern shell, or +$0: manually run the script under such a shell if you do +$0: have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + +SHELL=${CONFIG_SHELL-/bin/sh} + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='gloox' +PACKAGE_TARNAME='gloox' +PACKAGE_VERSION='1.0.13' +PACKAGE_STRING='gloox 1.0.13' +PACKAGE_BUGREPORT='js@camaya.net' +PACKAGE_URL='' + +ac_unique_file="src/gloox.cpp" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +MAYBE_EXAMPLES +MAYBE_TESTS +MAYBE_LIB_mdns +PTHREAD_CFLAGS +PTHREAD_LIBS +PTHREAD_CC +acx_pthread_config +GNUTLS_LIBS +GNUTLS_CFLAGS +PKG_CONFIG_LIBDIR +PKG_CONFIG_PATH +PKG_CONFIG +HAVE_GCC_ATOMIC_BUILTINS +CXXCPP +CPP +OTOOL64 +OTOOL +LIPO +NMEDIT +DSYMUTIL +MANIFEST_TOOL +ac_ct_AR +AR +DLLTOOL +OBJDUMP +LN_S +NM +ac_ct_DUMPBIN +DUMPBIN +LD +FGREP +EGREP +GREP +SED +LIBTOOL +RANLIB +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +ISODATE +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +enable_shared +enable_static +with_pic +enable_fast_install +with_gnu_ld +with_sysroot +enable_libtool_lock +with_extra_include_path +with_extra_library_path +with_libidn +with_schannel +with_gnutls +with_openssl +with_zlib +enable_debug +enable_getaddrinfo +enable_mdns +with_tests +with_examples +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC +CPP +CXXCPP +PKG_CONFIG +PKG_CONFIG_PATH +PKG_CONFIG_LIBDIR +GNUTLS_CFLAGS +GNUTLS_LIBS' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures gloox 1.0.13 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/gloox] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of gloox 1.0.13:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-debug turn on debugging [default=no] + --enable-getaddrinfo use getaddrinfo for dns lookups [default=no] + --enable-mdns use mdns [default=no] + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use + both] + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-sysroot=DIR Search for dependent libraries within DIR + (or the compiler's sysroot if not specified). + --with-extra-include-path + use additional include paths + --with-extra-library-path + use additional library paths + --with-libidn=DIR Support IDN (needs GNU Libidn) + --with-schannel Support Stream Encryption (win32 only) + --with-gnutls=yes/no Support Stream Encryption (needs GnuTLS) + --with-openssl=DIR Support Stream Encryption (needs OpenSSL) + --with-zlib=DIR Support Stream Compression (needs Zlib) + --with-tests Build unit tests (default=yes + --with-examples Build example programs (default=yes) + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CPP C preprocessor + CXXCPP C++ preprocessor + PKG_CONFIG path to pkg-config utility + PKG_CONFIG_PATH + directories to add to pkg-config's search path + PKG_CONFIG_LIBDIR + path overriding pkg-config's built-in search path + GNUTLS_CFLAGS + C compiler flags for GNUTLS, overriding pkg-config + GNUTLS_LIBS linker flags for GNUTLS, overriding pkg-config + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +gloox configure 1.0.13 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_cxx_try_cpp LINENO +# ------------------------ +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_cpp + +# ac_fn_cxx_try_link LINENO +# ------------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_link + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if eval \${$3+:} false; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.i conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( $as_echo "## ---------------------------- ## +## Report this to js@camaya.net ## +## ---------------------------- ##" + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_mongrel +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by gloox $as_me 1.0.13, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=gloox + VERSION=1.0.13 + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +ac_config_headers="$ac_config_headers config.h.unix" + + + + +ISODATE=`date +%Y-%m-%d` + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if ${ac_cv_build+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if ${ac_cv_host+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +case `pwd` in + *\ * | *\ *) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 +$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; +esac + + + +macro_version='2.4.2' +macro_revision='1.3337' + + + + + + + + + + + + + +ltmain="$ac_aux_dir/ltmain.sh" + +# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 +$as_echo_n "checking how to print strings... " >&6; } +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "" +} + +case "$ECHO" in + printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 +$as_echo "printf" >&6; } ;; + print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 +$as_echo "print -r" >&6; } ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 +$as_echo "cat" >&6; } ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if ${ac_cv_path_SED+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for ac_i in 1 2 3 4 5 6 7; do + ac_script="$ac_script$as_nl$ac_script" + done + echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed + { ac_script=; unset ac_script;} + if test -z "$SED"; then + ac_path_SED_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_SED" || continue +# Check for GNU ac_path_SED and select it if it is found. + # Check for GNU $ac_path_SED +case `"$ac_path_SED" --version 2>&1` in +*GNU*) + ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '' >> "conftest.nl" + "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_SED_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_SED="$ac_path_SED" + ac_path_SED_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_SED_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_SED"; then + as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 + fi +else + ac_cv_path_SED=$SED +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 +$as_echo "$ac_cv_path_SED" >&6; } + SED="$ac_cv_path_SED" + rm -f conftest.sed + +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if ${ac_cv_path_GREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_GREP" || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if ${ac_cv_path_EGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_EGREP" || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 +$as_echo_n "checking for fgrep... " >&6; } +if ${ac_cv_path_FGREP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 + then ac_cv_path_FGREP="$GREP -F" + else + if test -z "$FGREP"; then + ac_path_FGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in fgrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" + as_fn_executable_p "$ac_path_FGREP" || continue +# Check for GNU ac_path_FGREP and select it if it is found. + # Check for GNU $ac_path_FGREP +case `"$ac_path_FGREP" --version 2>&1` in +*GNU*) + ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'FGREP' >> "conftest.nl" + "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_FGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_FGREP="$ac_path_FGREP" + ac_path_FGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_FGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_FGREP"; then + as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_FGREP=$FGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 +$as_echo "$ac_cv_path_FGREP" >&6; } + FGREP="$ac_cv_path_FGREP" + + +test -z "$GREP" && GREP=grep + + + + + + + + + + + + + + + + + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 +$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } +if ${lt_cv_path_NM+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + : ${lt_cv_path_NM=no} +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +if test "$lt_cv_path_NM" != "no"; then + NM="$lt_cv_path_NM" +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + if test -n "$ac_tool_prefix"; then + for ac_prog in dumpbin "link -dump" + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DUMPBIN"; then + ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DUMPBIN=$ac_cv_prog_DUMPBIN +if test -n "$DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 +$as_echo "$DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DUMPBIN" && break + done +fi +if test -z "$DUMPBIN"; then + ac_ct_DUMPBIN=$DUMPBIN + for ac_prog in dumpbin "link -dump" +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DUMPBIN"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN +if test -n "$ac_ct_DUMPBIN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 +$as_echo "$ac_ct_DUMPBIN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_DUMPBIN" && break +done + + if test "x$ac_ct_DUMPBIN" = x; then + DUMPBIN=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DUMPBIN=$ac_ct_DUMPBIN + fi +fi + + case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols" + ;; + *) + DUMPBIN=: + ;; + esac + fi + + if test "$DUMPBIN" != ":"; then + NM="$DUMPBIN" + fi +fi +test -z "$NM" && NM=nm + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 +$as_echo_n "checking the name lister ($NM) interface... " >&6; } +if ${lt_cv_nm_interface+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&5 + (eval echo "\"\$as_me:$LINENO: output\"" >&5) + cat conftest.out >&5 + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 +$as_echo "$lt_cv_nm_interface" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +# find the maximum length of command line arguments +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if ${lt_cv_sys_max_cmd_len+:} false; then : + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8 ; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 +$as_echo "none" >&6; } +fi +max_cmd_len=$lt_cv_sys_max_cmd_len + + + + + + +: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 +$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } +# Try some XSI features +xsi_shell=no +( _lt_dummy="a/b/c" + test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ + = c,a/b,b/c, \ + && eval 'test $(( 1 + 1 )) -eq 2 \ + && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ + && xsi_shell=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 +$as_echo "$xsi_shell" >&6; } + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 +$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } +lt_shell_append=no +( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ + >/dev/null 2>&1 \ + && lt_shell_append=yes +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 +$as_echo "$lt_shell_append" >&6; } + + +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi + + + + + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 +$as_echo_n "checking how to convert $build file names to $host format... " >&6; } +if ${lt_cv_to_host_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac + +fi + +to_host_file_cmd=$lt_cv_to_host_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 +$as_echo "$lt_cv_to_host_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 +$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } +if ${lt_cv_to_tool_file_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + #assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac + +fi + +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 +$as_echo "$lt_cv_to_tool_file_cmd" >&6; } + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if ${lt_cv_ld_reload_flag+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + if test "$GCC" != yes; then + reload_cmds=false + fi + ;; + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + +test -z "$OBJDUMP" && OBJDUMP=objdump + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if ${lt_cv_deplibs_check_method+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. + if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + + + + + + + + + + + + + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + +test -z "$DLLTOOL" && DLLTOOL=dlltool + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 +$as_echo_n "checking how to associate runtime and link libraries... " >&6; } +if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh + # decide which to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd="$ECHO" + ;; +esac + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 +$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + + + + + + + + +if test -n "$ac_tool_prefix"; then + for ac_prog in ar + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AR" && break + done +fi +if test -z "$AR"; then + ac_ct_AR=$AR + for ac_prog in ar +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_AR+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_AR" && break +done + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +fi + +: ${AR=ar} +: ${AR_FLAGS=cru} + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 +$as_echo_n "checking for archiver @FILE support... " >&6; } +if ${lt_cv_ar_at_file+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ar_at_file=no + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -eq 0; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 + (eval $lt_ar_try) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if test "$ac_status" -ne 0; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 +$as_echo "$lt_cv_ar_at_file" >&6; } + +if test "x$lt_cv_ar_at_file" = xno; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi + + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +test -z "$STRIP" && STRIP=: + + + + + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +test -z "$RANLIB" && RANLIB=: + + + + + + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if ${lt_cv_sys_global_symbol_pipe+:} false; then : + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[ABCDGISTW]' + ;; +hpux*) + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function + # and D for any global variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK '"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ +" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ +" s[1]~/^[@?]/{print s[1], s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 + (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 +$as_echo_n "checking for sysroot... " >&6; } + +# Check whether --with-sysroot was given. +if test "${with_sysroot+set}" = set; then : + withval=$with_sysroot; +else + with_sysroot=no +fi + + +lt_sysroot= +case ${with_sysroot} in #( + yes) + if test "$GCC" = yes; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 +$as_echo "${with_sysroot}" >&6; } + as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 + ;; +esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 +$as_echo "${lt_sysroot:-no}" >&6; } + + + + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then : + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line '$LINENO' "configure"' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if ${lt_cv_cc_needs_belf+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_cc_needs_belf=yes +else + lt_cv_cc_needs_belf=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD="${LD-ld}_sol2" + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks="$enable_libtool_lock" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. +set dummy ${ac_tool_prefix}mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$MANIFEST_TOOL"; then + ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL +if test -n "$MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 +$as_echo "$MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_MANIFEST_TOOL"; then + ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL + # Extract the first word of "mt", so it can be a program name with args. +set dummy mt; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_MANIFEST_TOOL"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL +if test -n "$ac_ct_MANIFEST_TOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 +$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_MANIFEST_TOOL" = x; then + MANIFEST_TOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + fi +else + MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" +fi + +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 +$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } +if ${lt_cv_path_mainfest_tool+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&5 + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest* +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 +$as_echo "$lt_cv_path_mainfest_tool" >&6; } +if test "x$lt_cv_path_mainfest_tool" != xyes; then + MANIFEST_TOOL=: +fi + + + + + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. +set dummy ${ac_tool_prefix}lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$LIPO"; then + ac_cv_prog_LIPO="$LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LIPO="${ac_tool_prefix}lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +LIPO=$ac_cv_prog_LIPO +if test -n "$LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 +$as_echo "$LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_LIPO"; then + ac_ct_LIPO=$LIPO + # Extract the first word of "lipo", so it can be a program name with args. +set dummy lipo; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_LIPO+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_LIPO"; then + ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_LIPO="lipo" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO +if test -n "$ac_ct_LIPO"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 +$as_echo "$ac_ct_LIPO" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_LIPO" = x; then + LIPO=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + LIPO=$ac_ct_LIPO + fi +else + LIPO="$ac_cv_prog_LIPO" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL"; then + ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL="${ac_tool_prefix}otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL=$ac_cv_prog_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL"; then + ac_ct_OTOOL=$OTOOL + # Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL"; then + ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL="otool" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL +if test -n "$ac_ct_OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 +$as_echo "$ac_ct_OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL" = x; then + OTOOL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL=$ac_ct_OTOOL + fi +else + OTOOL="$ac_cv_prog_OTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. +set dummy ${ac_tool_prefix}otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OTOOL64"; then + ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OTOOL64=$ac_cv_prog_OTOOL64 +if test -n "$OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 +$as_echo "$OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OTOOL64"; then + ac_ct_OTOOL64=$OTOOL64 + # Extract the first word of "otool64", so it can be a program name with args. +set dummy otool64; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OTOOL64"; then + ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_OTOOL64="otool64" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 +if test -n "$ac_ct_OTOOL64"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 +$as_echo "$ac_ct_OTOOL64" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OTOOL64" = x; then + OTOOL64=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OTOOL64=$ac_ct_OTOOL64 + fi +else + OTOOL64="$ac_cv_prog_OTOOL64" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if ${lt_cv_apple_cc_single_mod+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&5 + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test $_lt_result -eq 0; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&5 + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if ${lt_cv_ld_exported_symbols_list+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_ld_exported_symbols_list=yes +else + lt_cv_ld_exported_symbols_list=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 +$as_echo_n "checking for -force_load linker flag... " >&6; } +if ${lt_cv_ld_force_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 + echo "$AR cru libconftest.a conftest.o" >&5 + $AR cru libconftest.a conftest.o 2>&5 + echo "$RANLIB libconftest.a" >&5 + $RANLIB libconftest.a 2>&5 + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&5 + elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&5 + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 +$as_echo "$lt_cv_ld_force_load" >&6; } + case $host_os in + rhapsody* | darwin1.[012]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # darwin 5.x on + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + fi + if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if ${ac_cv_prog_CPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in dlfcn.h +do : + ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default +" +if test "x$ac_cv_header_dlfcn_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DLFCN_H 1 +_ACEOF + +fi + +done + + + + +func_stripname_cnf () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname_cnf + + + + + +# Set options + + + + enable_dlopen=no + + + enable_win32_dll=no + + + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then : + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + + + + + + + + + # Check whether --enable-static was given. +if test "${enable_static+set}" = set; then : + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + + + + + + + + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then : + withval=$with_pic; lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for lt_pkg in $withval; do + IFS="$lt_save_ifs" + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + pic_mode=default +fi + + +test -z "$pic_mode" && pic_mode=default + + + + + + + + # Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then : + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + + + + + + + + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ltmain" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +test -z "$LN_S" && LN_S="ln -s" + + + + + + + + + + + + + + +if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if ${lt_cv_objdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +cat >>confdefs.h <<_ACEOF +#define LT_OBJDIR "$lt_cv_objdir/" +_ACEOF + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld="$lt_cv_prog_gnu_ld" + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if ${lt_cv_path_MAGIC_CMD+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + +# Use C for the default configuration in the libtool script + +lt_save_CC="$CC" +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + +if test -n "$compiler"; then + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + case $cc_basename in + nvcc*) + lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; + *) + lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + + + + + + + lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + lt_prog_compiler_wl='-Xlinker ' + if test -n "$lt_prog_compiler_pic"; then + lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64 which still supported -KPIC. + ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='--shared' + lt_prog_compiler_static='--static' + ;; + nagfor*) + # NAG Fortran compiler + lt_prog_compiler_wl='-Wl,-Wl,,' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-qpic' + lt_prog_compiler_static='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + *Sun\ F* | *Sun*Fortran*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Intel*\ [CF]*Compiler*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fPIC' + lt_prog_compiler_static='-static' + ;; + *Portland\ Group*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic=$lt_prog_compiler_pic +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 +$as_echo "$lt_cv_prog_compiler_pic" >&6; } +lt_prog_compiler_pic=$lt_cv_prog_compiler_pic + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if ${lt_cv_prog_compiler_pic_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi + + + + + + + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + always_export_symbols=no + archive_cmds= + archive_expsym_cmds= + compiler_needs_object=no + enable_shared_with_static_runtimes=no + export_dynamic_flag_spec= + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + hardcode_automatic=no + hardcode_direct=no + hardcode_direct_absolute=no + hardcode_libdir_flag_spec= + hardcode_libdir_separator= + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + inherit_rpath=no + link_all_deplibs=unknown + module_cmds= + module_expsym_cmds= + old_archive_from_new_cmds= + old_archive_from_expsyms_cmds= + thread_safe_flag_spec= + whole_archive_flag_spec= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs=no + ;; + esac + + ld_shlibs=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test "$with_gnu_ld" = yes; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; + *\ \(GNU\ Binutils\)\ [3-9]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test "$lt_use_gnu_ld_interface" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + export_dynamic_flag_spec='${wl}--export-all-symbols' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + haiku*) + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs=yes + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test "$host_os" = linux-dietlibc; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test "$tmp_diet" = no + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + whole_archive_flag_spec= + tmp_sharedflag='--shared' ;; + xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + ld_shlibs=no + fi + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global + # defined symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_direct_absolute=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + file_list_spec='${wl}-f,' + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + link_all_deplibs=no + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath_+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath_"; then + lt_cv_aix_libpath_="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath_ +fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + fi + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='' + ;; + m68k) + archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + esac + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + always_export_symbols=yes + file_list_spec='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, )='true' + enable_shared_with_static_runtimes=yes + exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + old_postinstall_cmds='chmod 644 $oldlib' + postlink_cmds='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + enable_shared_with_static_runtimes=yes + ;; + esac + ;; + + darwin* | rhapsody*) + + + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec='' + fi + link_all_deplibs=yes + allow_undefined_flag="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + + else + ld_shlibs=no + fi + + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes && test "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 +$as_echo_n "checking if $CC understands -b... " >&6; } +if ${lt_cv_prog_compiler__b+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler__b=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -b" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler__b=yes + fi + else + lt_cv_prog_compiler__b=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 +$as_echo "$lt_cv_prog_compiler__b" >&6; } + +if test x"$lt_cv_prog_compiler__b" = xyes; then + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' +else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' +fi + + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + hardcode_direct_absolute=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 +$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } +if ${lt_cv_irix_exported_symbol+:} false; then : + $as_echo_n "(cached) " >&6 +else + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int foo (void) { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + lt_cv_irix_exported_symbol=yes +else + lt_cv_irix_exported_symbol=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 +$as_echo "$lt_cv_irix_exported_symbol" >&6; } + if test "$lt_cv_irix_exported_symbol" = yes; then + archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' + fi + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + inherit_rpath=yes + link_all_deplibs=yes + ;; + + netbsd* | netbsdelf*-gnu) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + *nto* | *qnx*) + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + hardcode_direct_absolute=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + fi + archive_cmds_need_lc='no' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + archive_cmds_need_lc='no' + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z defs' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='${wl}' + archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + + if test x$host_vendor = xsni; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + export_dynamic_flag_spec='${wl}-Blargedynsym' + ;; + esac + fi + fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +with_gnu_ld=$with_gnu_ld + + + + + + + + + + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc=no + else + lt_cv_archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } + archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; + *) lt_sed_strip_eq="s,=/,/,g" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's,/\([A-Za-z]:\),\1,g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || + test -n "$runpath_var" || + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink || + test "$inherit_rpath" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" +if test "x$ac_cv_func_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if ${ac_cv_lib_dld_shl_load+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_shl_load=yes +else + ac_cv_lib_dld_shl_load=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = xyes; then : + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" +if test "x$ac_cv_func_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if ${ac_cv_lib_dl_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dl_dlopen=yes +else + ac_cv_lib_dl_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if ${ac_cv_lib_svld_dlopen+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_svld_dlopen=yes +else + ac_cv_lib_svld_dlopen=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = xyes; then : + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if ${ac_cv_lib_dld_dld_link+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dld_dld_link=yes +else + ac_cv_lib_dld_dld_link=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = xyes; then : + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if ${lt_cv_dlopen_self_static+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisbility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +} +_LT_EOF + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + + + + + + + + + + + + + + + + +striplib= +old_striplib= +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + fi + ;; + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + + + + + + + + + + + + + # Report which library types will actually be built + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } + test "$can_build_shared" = "no" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } + # Make sure either enable_shared or enable_static is yes. + test "$enable_shared" = yes || enable_static=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + + + + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if ${ac_cv_prog_CXXCPP+:} false; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.i conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_cxx_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.i conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.i conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details" "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +else + _lt_caught_CXX_error=yes +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +compiler_needs_object_CXX=no +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_direct_absolute_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +inherit_rpath_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +reload_flag_CXX=$reload_flag +reload_cmds_CXX=$reload_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test "$_lt_caught_CXX_error" != yes; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + + + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + + # save warnings/boilerplate of simple test code + ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* + + ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* + + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + compiler_CXX=$CC + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` + + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' + else + lt_prog_compiler_no_builtin_flag_CXX= + fi + + if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then : + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if ${lt_cv_path_LD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if ${lt_cv_prog_gnu_ld+:} false; then : + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + ld_shlibs_CXX=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + file_list_spec_CXX='${wl}-f,' + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + export_dynamic_flag_spec_CXX='${wl}-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty + # executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + if test "${lt_cv_aix_libpath+set}" = set; then + aix_libpath=$lt_cv_aix_libpath +else + if ${lt_cv_aix_libpath__CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + + lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }' + lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test -z "$lt_cv_aix_libpath__CXX"; then + lt_cv_aix_libpath__CXX="/usr/lib:/lib" + fi + +fi + + aix_libpath=$lt_cv_aix_libpath__CXX +fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + if test "$with_gnu_ld" = yes; then + # We only use this code for GNU lds that support --whole-archive. + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + fi + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared + # libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_CXX=' ' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=yes + file_list_spec_CXX='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; + else + $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' + enable_shared_with_static_runtimes_CXX=yes + # Don't use ranlib + old_postinstall_cmds_CXX='chmod 644 $oldlib' + postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile="$lt_outputfile.exe" + lt_tool_outputfile="$lt_tool_outputfile.exe" + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + + + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + if test "$lt_cv_ld_force_load" = "yes"; then + whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + + else + whole_archive_flag_spec_CXX='' + fi + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + case $cc_basename in + ifort*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test "$_lt_dar_can_shared" = "yes"; then + output_verbose_link_cmd=func_echo_all + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + + else + ld_shlibs_CXX=no + fi + + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + ld_shlibs_CXX=no + ;; + + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + + haiku*) + archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + link_all_deplibs_CXX=yes + ;; + + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_direct_absolute_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + inherit_rpath_CXX=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [1-5].* | *pgcpp\ [1-5].*) + prelink_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + old_archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + archive_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + if test "x$supports_anon_versioning" = xyes; then + archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + compiler_needs_object_CXX=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + ld_shlibs_CXX=yes + ;; + + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + hardcode_direct_absolute_CXX=yes + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + ld_shlibs_CXX=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + case $host in + osf3*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + ;; + *) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ + $RM $lib.exp' + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + ;; + esac + + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + case $host in + osf3*) + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + *) + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + ;; + esac + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ + '"$old_archive_cmds_CXX" + reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ + '"$reload_cmds_CXX" + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } + test "$ld_shlibs_CXX" = no && can_build_shared=no + + GCC_CXX="$GXX" + LD_CXX="$LD" + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + # Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= + +cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF + + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case ${prev}${p} in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" || + test $p = "-R"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test "$pre_test_object_deps_done" = no; then + case ${prev} in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC* | sunCC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + compiler_lib_search_dirs_CXX= +if test -n "${compiler_lib_search_path_CXX}"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + lt_prog_compiler_pic_CXX='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + lt_prog_compiler_static_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64 which still supported -KPIC. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-qpic' + lt_prog_compiler_static_CXX='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd* | netbsdelf*-gnu) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + lt_prog_compiler_pic_CXX='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } +if ${lt_cv_prog_compiler_pic_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } +lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi + + + + + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $RM -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + # Also, AIX nm treats weak defined symbols like other global defined + # symbols, whereas GNU nm marks them as "W". + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' + exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + ;; + esac + ;; + linux* | k*bsd*-gnu | gnu*) + link_all_deplibs_CXX=no + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +with_gnu_ld_CXX=$with_gnu_ld + + + + + + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } +if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + $RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 + (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + then + lt_cv_archive_cmds_need_lc_CXX=no + else + lt_cv_archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 +$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } + archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX + ;; + esac + fi + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } + +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + library_names_spec='${libname}.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec="$LIB" + if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[23].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=yes + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[3-9]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + if ${lt_cv_shlibpath_overrides_runpath+:} false; then : + $as_echo_n "(cached) " >&6 +else + lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ + LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : + lt_cv_shlibpath_overrides_runpath=yes +fi +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + +fi + + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsdelf*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='NetBSD ld.elf_so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +fi +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || + test -n "$runpath_var_CXX" || + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existent directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink || + test "$inherit_rpath_CXX" = yes; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + + + + + + + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test "$_lt_caught_CXX_error" != yes + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + + + + + + + + + + + + + + ac_config_commands="$ac_config_commands libtool" + + + + +# Only expand once: + + + + + + +# Check whether --with-extra_include_path was given. +if test "${with_extra_include_path+set}" = set; then : + withval=$with_extra_include_path; extra_include_path=$withval +fi + +split_includes="`echo $extra_include_path | sed -e 's/:/ /g'`" +for incpath in $split_includes ; do + CPPFLAGS="-I$incpath $CPPFLAGS" +done + + +# Check whether --with-extra_library_path was given. +if test "${with_extra_library_path+set}" = set; then : + withval=$with_extra_library_path; extra_library_path=$withval +fi + +split_libs="`echo $extra_library_path | sed -e 's/:/ /g'`" +for libpath in $split_libs ; do + LDFLAGS="-L$libpath $LDFLAGS" +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GCC atomic builtins are available" >&5 +$as_echo_n "checking whether GCC atomic builtins are available... " >&6; } +echo 'int main(int argc, char* argv) { int i; __sync_add_and_fetch(&i, 1); __sync_sub_and_fetch(&i, 1); return 0; } ' > check_atomicbuiltins.c +if test -z "`${CC} check_atomicbuiltins.c -o check_atomicbuiltins 2>&1`" ; then + HAVE_GCC_ATOMIC_BUILTINS=yes + +$as_echo "#define HAVE_GCC_ATOMIC_BUILTINS 1" >>confdefs.h + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + if test $cross_compiling == "yes"; then + # Some platforms don't seem to be fully happy for libraries using GCC atomic builtins + # unless -lgcc and -lgcc_s are explicitly included. + # (Errors like + # ld: hidden symbol `__sync_add_and_fetch_4' in .../libgcc.a(linux-atomic.o) is referenced by DSO + # ld: final link failed: Nonrepresentable section on output) + LDFLAGS="$LDFLAGS -lgcc -lgcc_s" + fi +else + HAVE_GCC_ATOMIC_BUILTINS=no + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi +rm -f check_atomicbuiltins* +HAVE_GCC_ATOMIC_BUILTINS=$HAVE_GCC_ATOMIC_BUILTINS + + + + + +# Check whether --with-libidn was given. +if test "${with_libidn+set}" = set; then : + withval=$with_libidn; libidn=$withval +else + libidn=yes +fi + +if test "$libidn" != "no"; then + if test "$libidn" != "yes"; then + LDFLAGS="${LDFLAGS} -L$libidn/lib" + CPPFLAGS="${CPPFLAGS} -I$libidn/include" + fi + ac_fn_c_check_header_mongrel "$LINENO" "idna.h" "ac_cv_header_idna_h" "$ac_includes_default" +if test "x$ac_cv_header_idna_h" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stringprep_check_version in -lidn" >&5 +$as_echo_n "checking for stringprep_check_version in -lidn... " >&6; } +if ${ac_cv_lib_idn_stringprep_check_version+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lidn $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char stringprep_check_version (); +int +main () +{ +return stringprep_check_version (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_idn_stringprep_check_version=yes +else + ac_cv_lib_idn_stringprep_check_version=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_idn_stringprep_check_version" >&5 +$as_echo "$ac_cv_lib_idn_stringprep_check_version" >&6; } +if test "x$ac_cv_lib_idn_stringprep_check_version" = xyes; then : + libidn=yes LIBS="${LIBS} -lidn" +else + libidn=no +fi + +else + libidn=no +fi + + +fi +if test "$libidn" != "no" ; then + +$as_echo "#define HAVE_LIBIDN 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libidn not found" >&5 +$as_echo "$as_me: WARNING: Libidn not found" >&2;} +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Libidn should be used" >&5 +$as_echo_n "checking if Libidn should be used... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libidn" >&5 +$as_echo "$libidn" >&6; } + + +case "$host_os" in + *mingw*|*cygwin*) + LIBS="${LIBS} -lwsock32 -lgdi32 -ldnsapi";; + *) + CXXFLAGS="$CXXFLAGS -ansi";; +esac + + +ssl=no + + +# Check whether --with-schannel was given. +if test "${with_schannel+set}" = set; then : + withval=$with_schannel; schannel=yes +else + schannel=no +fi + +if test "$schannel" = "yes"; then + case "$host_os" in + *mingw*|*cygwin*) + ssl=yes + LIBS="${LIBS} -lcrypt32 -lsecur32";; + *) + schannel=no + echo "*" + echo "* You provided the '--with-schannel' switch. SChannel is only available in MinGW/cygwin. Ignoring." + echo "*";; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if SChannel should be used" >&5 +$as_echo_n "checking if SChannel should be used... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $schannel" >&5 +$as_echo "$schannel" >&6; } +fi + +if test "$ssl" = "no"; then + +# Check whether --with-gnutls was given. +if test "${with_gnutls+set}" = set; then : + withval=$with_gnutls; gnutls=$withval +else + gnutls=yes +fi + + if test "$gnutls" != "no"; then + + + + + + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi +fi + +pkg_failed=no +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUTLS" >&5 +$as_echo_n "checking for GNUTLS... " >&6; } + +if test -n "$GNUTLS_CFLAGS"; then + pkg_cv_GNUTLS_CFLAGS="$GNUTLS_CFLAGS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls >= 2.12\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gnutls >= 2.12") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GNUTLS_CFLAGS=`$PKG_CONFIG --cflags "gnutls >= 2.12" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi +if test -n "$GNUTLS_LIBS"; then + pkg_cv_GNUTLS_LIBS="$GNUTLS_LIBS" + elif test -n "$PKG_CONFIG"; then + if test -n "$PKG_CONFIG" && \ + { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnutls >= 2.12\""; } >&5 + ($PKG_CONFIG --exists --print-errors "gnutls >= 2.12") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then + pkg_cv_GNUTLS_LIBS=`$PKG_CONFIG --libs "gnutls >= 2.12" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes +else + pkg_failed=yes +fi + else + pkg_failed=untried +fi + + + +if test $pkg_failed = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi + if test $_pkg_short_errors_supported = yes; then + GNUTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gnutls >= 2.12" 2>&1` + else + GNUTLS_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gnutls >= 2.12" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$GNUTLS_PKG_ERRORS" >&5 + + gnutls=no +elif test $pkg_failed = untried; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + gnutls=no +else + GNUTLS_CFLAGS=$pkg_cv_GNUTLS_CFLAGS + GNUTLS_LIBS=$pkg_cv_GNUTLS_LIBS + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + gnutls=yes +fi + if test "$gnutls" = "yes" ; then + LIBS="${LIBS} ${GNUTLS_LIBS}" + CPPFLAGS="${CPPFLAGS} ${GNUTLS_CFLAGS}" + +$as_echo "#define HAVE_GNUTLS 1" >>confdefs.h + + +$as_echo "#define HAVE_GNUTLS_SESSION_CHANNEL_BINDING 1" >>confdefs.h + + ssl=yes + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: GnuTLS not found" >&5 +$as_echo "$as_me: WARNING: GnuTLS not found" >&2;} + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if GnuTLS should be used" >&5 +$as_echo_n "checking if GnuTLS should be used... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gnutls" >&5 +$as_echo "$gnutls" >&6; } +fi + +if test "$ssl" = "no"; then + +# Check whether --with-openssl was given. +if test "${with_openssl+set}" = set; then : + withval=$with_openssl; openssl=$withval +else + openssl=yes +fi + + if test "$openssl" != "no"; then + if test "$openssl" != "yes"; then + LDFLAGS="${LDFLAGS} -L$openssl/lib" + CPPFLAGS="${CPPFLAGS} -I$openssl/include" + fi + LIBS_TMP=${LIBS} + LIBS="${LIBS} -lssl -lcrypto" + ac_fn_c_check_header_mongrel "$LINENO" "openssl/ssl.h" "ac_cv_header_openssl_ssl_h" "$ac_includes_default" +if test "x$ac_cv_header_openssl_ssl_h" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSL_library_init in -lssl" >&5 +$as_echo_n "checking for SSL_library_init in -lssl... " >&6; } +if ${ac_cv_lib_ssl_SSL_library_init+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lssl $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char SSL_library_init (); +int +main () +{ +return SSL_library_init (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_ssl_SSL_library_init=yes +else + ac_cv_lib_ssl_SSL_library_init=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ssl_SSL_library_init" >&5 +$as_echo "$ac_cv_lib_ssl_SSL_library_init" >&6; } +if test "x$ac_cv_lib_ssl_SSL_library_init" = xyes; then : + openssl=yes +else + openssl=no +fi + +else + openssl=no LIBS=${LIBS_TMP} +fi + + + fi + if test "$openssl" != "no" ; then + +$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: OpenSSL not found" >&5 +$as_echo "$as_me: WARNING: OpenSSL not found" >&2;} + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if OpenSSL should be used" >&5 +$as_echo_n "checking if OpenSSL should be used... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $openssl" >&5 +$as_echo "$openssl" >&6; } +fi + + +# Check whether --with-zlib was given. +if test "${with_zlib+set}" = set; then : + withval=$with_zlib; zlib=$withval +else + zlib=yes +fi + +if test "$zlib" != "no"; then + if test "$zlib" != "yes"; then + LDFLAGS="${LDFLAGS} -L$zlib/lib" + CPPFLAGS="${CPPFLAGS} -I$zlib/include" + fi + ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" +if test "x$ac_cv_header_zlib_h" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for zlibVersion in -lz" >&5 +$as_echo_n "checking for zlibVersion in -lz... " >&6; } +if ${ac_cv_lib_z_zlibVersion+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char zlibVersion (); +int +main () +{ +return zlibVersion (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_z_zlibVersion=yes +else + ac_cv_lib_z_zlibVersion=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_zlibVersion" >&5 +$as_echo "$ac_cv_lib_z_zlibVersion" >&6; } +if test "x$ac_cv_lib_z_zlibVersion" = xyes; then : + zlib=yes LIBS="${LIBS} -lz" +else + zlib=no +fi + +else + zlib=no +fi + + +fi +if test "$zlib" != "no" ; then + +$as_echo "#define HAVE_ZLIB 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Zlib not found" >&5 +$as_echo "$as_me: WARNING: Zlib not found" >&2;} +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if Zlib should be used" >&5 +$as_echo_n "checking if Zlib should be used... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $zlib" >&5 +$as_echo "$zlib" >&6; } + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +acx_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5 +$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; } + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char pthread_join (); +int +main () +{ +return pthread_join (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + acx_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test x"$acx_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case "${host_cpu}-${host_os}" in + *solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (We need to link with -pthreads/-mt/ + # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather + # a function called by this macro, so we could check for that, but + # who knows whether they'll stub that too in a future libc.) So, + # we'll just look for -pthreads and -lpthread first: + + acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags" + ;; +esac + +if test x"$acx_pthread_ok" = xno; then +for flag in $acx_pthread_flags; do + + case $flag in + none) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 +$as_echo_n "checking whether pthreads work without any flags... " >&6; } + ;; + + -*) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5 +$as_echo_n "checking whether pthreads work with $flag... " >&6; } + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + # Extract the first word of "pthread-config", so it can be a program name with args. +set dummy pthread-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_acx_pthread_config+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$acx_pthread_config"; then + ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_acx_pthread_config="yes" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no" +fi +fi +acx_pthread_config=$ac_cv_prog_acx_pthread_config +if test -n "$acx_pthread_config"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5 +$as_echo "$acx_pthread_config" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test x"$acx_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5 +$as_echo_n "checking for the pthreads library -l$flag... " >&6; } + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +pthread_t th; pthread_join(th, 0); + pthread_attr_init(0); pthread_cleanup_push(0, 0); + pthread_create(0,0,0,0); pthread_cleanup_pop(0); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + acx_pthread_ok=yes +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5 +$as_echo "$acx_pthread_ok" >&6; } + if test "x$acx_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$acx_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 +$as_echo_n "checking for joinable pthread attribute... " >&6; } + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +int attr=$attr; return attr; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + attr_name=$attr; break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5 +$as_echo "$attr_name" >&6; } + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + +cat >>confdefs.h <<_ACEOF +#define PTHREAD_CREATE_JOINABLE $attr_name +_ACEOF + + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5 +$as_echo_n "checking if more special flags are required for pthreads... " >&6; } + flag=no + case "${host_cpu}-${host_os}" in + *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; + *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; + esac + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5 +$as_echo "${flag}" >&6; } + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: must compile with xlc_r or cc_r + if test x"$GCC" != xyes; then + for ac_prog in xlc_r cc_r +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_PTHREAD_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PTHREAD_CC"; then + ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_PTHREAD_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PTHREAD_CC=$ac_cv_prog_PTHREAD_CC +if test -n "$PTHREAD_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 +$as_echo "$PTHREAD_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PTHREAD_CC" && break +done +test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}" + + else + PTHREAD_CC=$CC + fi +else + PTHREAD_CC="$CC" +fi + + + + + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test x"$acx_pthread_ok" = xyes; then + +$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h + + : +else + acx_pthread_ok=no + +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +LIBS="$PTHREAD_LIBS $LIBS" +CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS" +LDFLAGS="$LDFLAGS $PTHREAD_CFLAGS" + +for ac_func in res_querydomain +do : + ac_fn_c_check_func "$LINENO" "res_querydomain" "ac_cv_func_res_querydomain" +if test "x$ac_cv_func_res_querydomain" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_RES_QUERYDOMAIN 1 +_ACEOF + +fi +done + +if test "x-$ac_cv_func_res_querydomain" = "x-yes" ; then + have_res_querydomain=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_querydomain in -lresolv" >&5 +$as_echo_n "checking for res_querydomain in -lresolv... " >&6; } +if ${ac_cv_lib_resolv_res_querydomain+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char res_querydomain (); +int +main () +{ +return res_querydomain (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv_res_querydomain=yes +else + ac_cv_lib_resolv_res_querydomain=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_querydomain" >&5 +$as_echo "$ac_cv_lib_resolv_res_querydomain" >&6; } +if test "x$ac_cv_lib_resolv_res_querydomain" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRESOLV 1 +_ACEOF + + LIBS="-lresolv $LIBS" + +fi + + if test "x-$ac_cv_lib_resolv_res_querydomain" = "x-yes" ; then + have_res_querydomain=yes + $as_echo "#define HAVE_RES_QUERYDOMAIN 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_querydomain in -lbind" >&5 +$as_echo_n "checking for res_querydomain in -lbind... " >&6; } +if ${ac_cv_lib_bind_res_querydomain+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char res_querydomain (); +int +main () +{ +return res_querydomain (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind_res_querydomain=yes +else + ac_cv_lib_bind_res_querydomain=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_res_querydomain" >&5 +$as_echo "$ac_cv_lib_bind_res_querydomain" >&6; } +if test "x$ac_cv_lib_bind_res_querydomain" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBBIND 1 +_ACEOF + + LIBS="-lbind $LIBS" + +fi + + if test "x-$ac_cv_lib_bind_res_querydomain" = "x-yes" ; then + have_res_querydomain=yes + $as_echo "#define HAVE_RES_QUERYDOMAIN 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_querydomain in -lresolv (alternate version)" >&5 +$as_echo_n "checking for res_querydomain in -lresolv (alternate version)... " >&6; } + save_libs="$LIBS" + LIBS="-lresolv $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +res_querydomain(0,0,0,0,0,0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_RES_QUERYDOMAIN 1" >>confdefs.h + + have_res_querydomain=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + LIBS="$save_libs" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + fi +fi + +for ac_func in dn_skipname +do : + ac_fn_c_check_func "$LINENO" "dn_skipname" "ac_cv_func_dn_skipname" +if test "x$ac_cv_func_dn_skipname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_DN_SKIPNAME 1 +_ACEOF + +fi +done + +if test "x-$ac_cv_func_dn_skipname" = "x-yes" ; then + have_dn_skipname=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dn_skipname in -lresolv" >&5 +$as_echo_n "checking for dn_skipname in -lresolv... " >&6; } +if ${ac_cv_lib_resolv_dn_skipname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dn_skipname (); +int +main () +{ +return dn_skipname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv_dn_skipname=yes +else + ac_cv_lib_resolv_dn_skipname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_dn_skipname" >&5 +$as_echo "$ac_cv_lib_resolv_dn_skipname" >&6; } +if test "x$ac_cv_lib_resolv_dn_skipname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRESOLV 1 +_ACEOF + + LIBS="-lresolv $LIBS" + +fi + + if test "x-$ac_cv_lib_resolv_dn_skipname" = "x-yes" ; then + have_dn_skipname=yes + $as_echo "#define HAVE_DN_SKIPNAME 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dn_skipname in -lbind" >&5 +$as_echo_n "checking for dn_skipname in -lbind... " >&6; } +if ${ac_cv_lib_bind_dn_skipname+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dn_skipname (); +int +main () +{ +return dn_skipname (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind_dn_skipname=yes +else + ac_cv_lib_bind_dn_skipname=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_dn_skipname" >&5 +$as_echo "$ac_cv_lib_bind_dn_skipname" >&6; } +if test "x$ac_cv_lib_bind_dn_skipname" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBBIND 1 +_ACEOF + + LIBS="-lbind $LIBS" + +fi + + if test "x-$ac_cv_lib_bind_dn_skipname" = "x-yes" ; then + have_dn_skipname=yes + $as_echo "#define HAVE_DN_SKIPNAME 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dn_skipname in -lresolv (alternate version)" >&5 +$as_echo_n "checking for dn_skipname in -lresolv (alternate version)... " >&6; } + save_libs="$LIBS" + LIBS="-lresolv $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + #include +int +main () +{ +dn_skipname(0,0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_DN_SKIPNAME 1" >>confdefs.h + + have_dn_skipname=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + LIBS="$save_libs" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + fi +fi + +for ac_func in res_query +do : + ac_fn_c_check_func "$LINENO" "res_query" "ac_cv_func_res_query" +if test "x$ac_cv_func_res_query" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_RES_QUERY 1 +_ACEOF + +fi +done + +if test "x-$ac_cv_func_res_query" = "x-yes" ; then + have_res_query=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv" >&5 +$as_echo_n "checking for res_query in -lresolv... " >&6; } +if ${ac_cv_lib_resolv_res_query+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char res_query (); +int +main () +{ +return res_query (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_resolv_res_query=yes +else + ac_cv_lib_resolv_res_query=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_res_query" >&5 +$as_echo "$ac_cv_lib_resolv_res_query" >&6; } +if test "x$ac_cv_lib_resolv_res_query" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRESOLV 1 +_ACEOF + + LIBS="-lresolv $LIBS" + +fi + + if test "x-$ac_cv_lib_resolv_res_query" = "x-yes" ; then + have_res_query=yes + $as_echo "#define HAVE_RES_QUERY 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lbind" >&5 +$as_echo_n "checking for res_query in -lbind... " >&6; } +if ${ac_cv_lib_bind_res_query+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbind $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char res_query (); +int +main () +{ +return res_query (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_bind_res_query=yes +else + ac_cv_lib_bind_res_query=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_res_query" >&5 +$as_echo "$ac_cv_lib_bind_res_query" >&6; } +if test "x$ac_cv_lib_bind_res_query" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBBIND 1 +_ACEOF + + LIBS="-lbind $LIBS" + +fi + + if test "x-$ac_cv_lib_bind_res_query" = "x-yes" ; then + have_res_query=yes + $as_echo "#define HAVE_RES_QUERY 1" >>confdefs.h + + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for res_query in -lresolv (alternate version)" >&5 +$as_echo_n "checking for res_query in -lresolv (alternate version)... " >&6; } + save_libs="$LIBS" + LIBS="-lresolv $LIBS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +res_query(0,0,0,0,0) + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_RES_QUERY 1" >>confdefs.h + + have_res_query=yes +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + LIBS="$save_libs" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + fi +fi + + +# AC_SEARCH_LIBS(res_query,resolv bind,, +# AC_SEARCH_LIBS(__res_query,resolv bind,,have_resolver=no)) +# AC_SEARCH_LIBS(dn_expand,resolv bind,, +# AC_SEARCH_LIBS(__dn_expand,resolv bind,,have_resolver=no)) +# AC_SEARCH_LIBS(dn_skipname,resolv bind,, +# AC_SEARCH_LIBS(__dn_skipname,resolv bind,,have_resolver=no)) +# AC_SEARCH_LIBS(res_querydomain,resolv bind,, +# AC_SEARCH_LIBS(__res_querydomain,resolv bind,,have_resolver=no)) + + +debug="no" +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then : + enableval=$enable_debug; debug="yes" +fi + +if test "x$debug" = "xyes"; then + CPPFLAGS="$CPPFLAGS -g3 -fno-inline -DDEBUG" +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable debug" >&5 +$as_echo_n "checking whether to enable debug... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $debug" >&5 +$as_echo "$debug" >&6; } + +getaddrinfo="no" +# Check whether --enable-getaddrinfo was given. +if test "${enable_getaddrinfo+set}" = set; then : + enableval=$enable_getaddrinfo; getaddrinfo="yes" +fi + +if test "x$getaddrinfo" = "xyes"; then + for ac_func in getaddrinfo +do : + ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" +if test "x$ac_cv_func_getaddrinfo" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_GETADDRINFO 1 +_ACEOF + +else + getaddrinfo="no" +fi +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use getaddrinfo" >&5 +$as_echo_n "checking whether to use getaddrinfo... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $getaddrinfo" >&5 +$as_echo "$getaddrinfo" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if ${ac_cv_header_stdc+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +for ac_header in unistd.h strings.h errno.h arpa/nameser.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for ac_func in setsockopt +do : + ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" +if test "x$ac_cv_func_setsockopt" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_SETSOCKOPT 1 +_ACEOF + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 +$as_echo_n "checking for setsockopt in -lsocket... " >&6; } +if ${ac_cv_lib_socket_setsockopt+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char setsockopt (); +int +main () +{ +return setsockopt (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_socket_setsockopt=yes +else + ac_cv_lib_socket_setsockopt=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 +$as_echo "$ac_cv_lib_socket_setsockopt" >&6; } +if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + +fi +done + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if ${ac_cv_c_const+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + +#ifndef __cplusplus + /* Ultrix mips cc rejects this sort of thing. */ + typedef int charset[2]; + const charset cs = { 0, 0 }; + /* SunOS 4.1.1 cc rejects this. */ + char const *const *pcpcc; + char **ppc; + /* NEC SVR4.0.2 mips cc rejects this. */ + struct point {int x, y;}; + static struct point const zero = {0,0}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + pcpcc = &g + (g ? g-g : 0); + /* HPUX 7.0 cc rejects these. */ + ++pcpcc; + ppc = (char**) pcpcc; + pcpcc = (char const *const *) ppc; + { /* SCO 3.2v4 cc rejects this sort of thing. */ + char tx; + char *t = &tx; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; + if (s) return 0; + } + { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25, 17}; + const int *foo = &x[0]; + ++foo; + } + { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; + } + { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; } bx; + struct s *b = &bx; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_const=yes +else + ac_cv_c_const=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +$as_echo "#define const /**/" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if ${ac_cv_c_inline+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +# Check whether --enable-mdns was given. +if test "${enable_mdns+set}" = set; then : + enableval=$enable_mdns; enable_mdns=yes +else + enable_mdns=no +fi + +if test "$enable_mdns" = yes; then + +$as_echo "#define HAVE_MDNS /**/" >>confdefs.h + + ac_fn_c_check_header_mongrel "$LINENO" "dns_sd.h" "ac_cv_header_dns_sd_h" "$ac_includes_default" +if test "x$ac_cv_header_dns_sd_h" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DNSServiceCreateConnection in -ldns_sd" >&5 +$as_echo_n "checking for DNSServiceCreateConnection in -ldns_sd... " >&6; } +if ${ac_cv_lib_dns_sd_DNSServiceCreateConnection+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldns_sd $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char DNSServiceCreateConnection (); +int +main () +{ +return DNSServiceCreateConnection (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_dns_sd_DNSServiceCreateConnection=yes +else + ac_cv_lib_dns_sd_DNSServiceCreateConnection=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dns_sd_DNSServiceCreateConnection" >&5 +$as_echo "$ac_cv_lib_dns_sd_DNSServiceCreateConnection" >&6; } +if test "x$ac_cv_lib_dns_sd_DNSServiceCreateConnection" = xyes; then : + LIBS="${LIBS} -ldns_sd" +else + enable_mdns=no +fi + +else + enable_mdns=no +fi + + +else + MAYBE_LIB_mdns= +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if mDNS support should be built" >&5 +$as_echo_n "checking if mDNS support should be built... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_mdns" >&5 +$as_echo "$enable_mdns" >&6; } + +want_tests=yes + +# Check whether --with-tests was given. +if test "${with_tests+set}" = set; then : + withval=$with_tests; want_tests=$withval +else + want_tests=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if unit tests should be built" >&5 +$as_echo_n "checking if unit tests should be built... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $want_tests" >&5 +$as_echo "$want_tests" >&6; } + +if test "$want_tests" = yes; +then + MAYBE_TESTS=tests +else + MAYBE_TESTS= +fi + + +want_examples=yes + +# Check whether --with-examples was given. +if test "${with_examples+set}" = set; then : + withval=$with_examples; want_examples=$withval +else + want_examples=yes +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if example programs should be built" >&5 +$as_echo_n "checking if example programs should be built... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $want_examples" >&5 +$as_echo "$want_examples" >&6; } + +if test "$want_examples" = yes; +then + MAYBE_EXAMPLES=examples +else + MAYBE_EXAMPLES= +fi + + + +ac_config_files="$ac_config_files Makefile gloox.pc gloox-config src/Makefile src/examples/Makefile src/tests/Makefile src/tests/adhoc/Makefile src/tests/adhoccommand/Makefile src/tests/adhoccommandnote/Makefile src/tests/amprule/Makefile src/tests/amp/Makefile src/tests/base64/Makefile src/tests/capabilities/Makefile src/tests/carbons/Makefile src/tests/chatstatefilter/Makefile src/tests/client/Makefile src/tests/clientbase/Makefile src/tests/connectionbosh/Makefile src/tests/dataform/Makefile src/tests/dataformfield/Makefile src/tests/dataformitem/Makefile src/tests/dataformreported/Makefile src/tests/delayeddelivery/Makefile src/tests/discoinfo/Makefile src/tests/discoitems/Makefile src/tests/disco/Makefile src/tests/error/Makefile src/tests/featureneg/Makefile src/tests/flexofflineoffline/Makefile src/tests/flexoffline/Makefile src/tests/forward/Makefile src/tests/gpgencrypted/Makefile src/tests/gpgsigned/Makefile src/tests/inbandbytestreamibb/Makefile src/tests/inbandbytestream/Makefile src/tests/iodata/Makefile src/tests/iq/Makefile src/tests/jid/Makefile src/tests/jingleiceudp/Makefile src/tests/jinglesession/Makefile src/tests/jinglesessionjingle/Makefile src/tests/jinglesessionmanager/Makefile src/tests/lastactivityquery/Makefile src/tests/lastactivity/Makefile src/tests/md5/Makefile src/tests/message/Makefile src/tests/messageeventfilter/Makefile src/tests/mucroommuc/Makefile src/tests/mucroommucadmin/Makefile src/tests/mucroommucowner/Makefile src/tests/mucroommucuser/Makefile src/tests/nickname/Makefile src/tests/nonsaslauthquery/Makefile src/tests/nonsaslauth/Makefile src/tests/oob/Makefile src/tests/parser/Makefile src/tests/prep/Makefile src/tests/presence/Makefile src/tests/privacymanagerquery/Makefile src/tests/privacymanager/Makefile src/tests/privatexml/Makefile src/tests/pubsubmanagerpubsub/Makefile src/tests/pubsubmanager/Makefile src/tests/pubsubevent/Makefile src/tests/receipt/Makefile src/tests/registrationquery/Makefile src/tests/registration/Makefile src/tests/rostermanagerquery/Makefile src/tests/rostermanager/Makefile src/tests/searchquery/Makefile src/tests/search/Makefile src/tests/sha/Makefile src/tests/shim/Makefile src/tests/simanager/Makefile src/tests/simanagersi/Makefile src/tests/stanzaextensionfactory/Makefile src/tests/subscription/Makefile src/tests/tag/Makefile src/tests/tlsgnutls/Makefile src/tests/uniquemucroomunique/Makefile src/tests/util/Makefile src/tests/vcard/Makefile src/tests/vcardupdate/Makefile src/tests/xpath/Makefile src/tests/zlib/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by gloox $as_me 1.0.13, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +gloox config.status 1.0.13 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' +macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' +enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' +enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' +pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' +enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' +SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' +ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' +PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' +host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' +host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' +host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' +build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' +build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' +build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' +SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' +Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' +GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' +EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' +FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' +LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' +NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' +LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' +max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' +ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' +exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' +lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' +lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' +lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' +lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' +lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' +reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' +reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' +OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' +deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' +file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' +file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' +want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' +DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' +sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' +AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' +AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' +archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' +STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' +RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' +old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' +old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' +lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' +CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' +CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' +compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' +GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' +nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' +lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' +objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' +MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' +need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' +MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' +DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' +NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' +LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' +OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' +OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' +libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' +shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' +extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' +compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' +archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' +module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' +with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' +no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' +hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' +hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' +inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' +link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' +always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' +exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' +include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' +prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' +postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' +file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' +variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' +need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' +need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' +version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' +runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' +shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' +libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' +library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' +soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' +install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' +postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' +postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' +finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' +finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' +hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' +sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' +sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' +hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' +enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' +enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' +old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' +striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' +predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' +postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' +predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' +postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' +LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' +reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' +reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' +GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' +lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' +lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' +enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' +export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' +old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' +archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' +module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' +with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' +allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' +inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' +link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' +always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' +export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' +exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' +prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' +file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' +hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' +predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' +postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' +predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' +postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' +compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' + +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in SHELL \ +ECHO \ +PATH_SEPARATOR \ +SED \ +GREP \ +EGREP \ +FGREP \ +LD \ +NM \ +LN_S \ +lt_SP2NL \ +lt_NL2SP \ +reload_flag \ +OBJDUMP \ +deplibs_check_method \ +file_magic_cmd \ +file_magic_glob \ +want_nocaseglob \ +DLLTOOL \ +sharedlib_from_linklib_cmd \ +AR \ +AR_FLAGS \ +archiver_list_spec \ +STRIP \ +RANLIB \ +CC \ +CFLAGS \ +compiler \ +lt_cv_sys_global_symbol_pipe \ +lt_cv_sys_global_symbol_to_cdecl \ +lt_cv_sys_global_symbol_to_c_name_address \ +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ +nm_file_list_spec \ +lt_prog_compiler_no_builtin_flag \ +lt_prog_compiler_pic \ +lt_prog_compiler_wl \ +lt_prog_compiler_static \ +lt_cv_prog_compiler_c_o \ +need_locks \ +MANIFEST_TOOL \ +DSYMUTIL \ +NMEDIT \ +LIPO \ +OTOOL \ +OTOOL64 \ +shrext_cmds \ +export_dynamic_flag_spec \ +whole_archive_flag_spec \ +compiler_needs_object \ +with_gnu_ld \ +allow_undefined_flag \ +no_undefined_flag \ +hardcode_libdir_flag_spec \ +hardcode_libdir_separator \ +exclude_expsyms \ +include_expsyms \ +file_list_spec \ +variables_saved_for_relink \ +libname_spec \ +library_names_spec \ +soname_spec \ +install_override_mode \ +finish_eval \ +old_striplib \ +striplib \ +compiler_lib_search_dirs \ +predep_objects \ +postdep_objects \ +predeps \ +postdeps \ +compiler_lib_search_path \ +LD_CXX \ +reload_flag_CXX \ +compiler_CXX \ +lt_prog_compiler_no_builtin_flag_CXX \ +lt_prog_compiler_pic_CXX \ +lt_prog_compiler_wl_CXX \ +lt_prog_compiler_static_CXX \ +lt_cv_prog_compiler_c_o_CXX \ +export_dynamic_flag_spec_CXX \ +whole_archive_flag_spec_CXX \ +compiler_needs_object_CXX \ +with_gnu_ld_CXX \ +allow_undefined_flag_CXX \ +no_undefined_flag_CXX \ +hardcode_libdir_flag_spec_CXX \ +hardcode_libdir_separator_CXX \ +exclude_expsyms_CXX \ +include_expsyms_CXX \ +file_list_spec_CXX \ +compiler_lib_search_dirs_CXX \ +predep_objects_CXX \ +postdep_objects_CXX \ +predeps_CXX \ +postdeps_CXX \ +compiler_lib_search_path_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in reload_cmds \ +old_postinstall_cmds \ +old_postuninstall_cmds \ +old_archive_cmds \ +extract_expsyms_cmds \ +old_archive_from_new_cmds \ +old_archive_from_expsyms_cmds \ +archive_cmds \ +archive_expsym_cmds \ +module_cmds \ +module_expsym_cmds \ +export_symbols_cmds \ +prelink_cmds \ +postlink_cmds \ +postinstall_cmds \ +postuninstall_cmds \ +finish_cmds \ +sys_lib_search_path_spec \ +sys_lib_dlsearch_path_spec \ +reload_cmds_CXX \ +old_archive_cmds_CXX \ +old_archive_from_new_cmds_CXX \ +old_archive_from_expsyms_cmds_CXX \ +archive_cmds_CXX \ +archive_expsym_cmds_CXX \ +module_cmds_CXX \ +module_expsym_cmds_CXX \ +export_symbols_cmds_CXX \ +prelink_cmds_CXX \ +postlink_cmds_CXX; do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[\\\\\\\`\\"\\\$]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +ac_aux_dir='$ac_aux_dir' +xsi_shell='$xsi_shell' +lt_shell_append='$lt_shell_append' + +# See if we are running on zsh, and set the options which allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST +fi + + + PACKAGE='$PACKAGE' + VERSION='$VERSION' + TIMESTAMP='$TIMESTAMP' + RM='$RM' + ofile='$ofile' + + + + + + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h.unix") CONFIG_HEADERS="$CONFIG_HEADERS config.h.unix" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "gloox.pc") CONFIG_FILES="$CONFIG_FILES gloox.pc" ;; + "gloox-config") CONFIG_FILES="$CONFIG_FILES gloox-config" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "src/examples/Makefile") CONFIG_FILES="$CONFIG_FILES src/examples/Makefile" ;; + "src/tests/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/Makefile" ;; + "src/tests/adhoc/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/adhoc/Makefile" ;; + "src/tests/adhoccommand/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/adhoccommand/Makefile" ;; + "src/tests/adhoccommandnote/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/adhoccommandnote/Makefile" ;; + "src/tests/amprule/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/amprule/Makefile" ;; + "src/tests/amp/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/amp/Makefile" ;; + "src/tests/base64/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/base64/Makefile" ;; + "src/tests/capabilities/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/capabilities/Makefile" ;; + "src/tests/carbons/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/carbons/Makefile" ;; + "src/tests/chatstatefilter/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/chatstatefilter/Makefile" ;; + "src/tests/client/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/client/Makefile" ;; + "src/tests/clientbase/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/clientbase/Makefile" ;; + "src/tests/connectionbosh/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/connectionbosh/Makefile" ;; + "src/tests/dataform/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/dataform/Makefile" ;; + "src/tests/dataformfield/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/dataformfield/Makefile" ;; + "src/tests/dataformitem/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/dataformitem/Makefile" ;; + "src/tests/dataformreported/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/dataformreported/Makefile" ;; + "src/tests/delayeddelivery/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/delayeddelivery/Makefile" ;; + "src/tests/discoinfo/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/discoinfo/Makefile" ;; + "src/tests/discoitems/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/discoitems/Makefile" ;; + "src/tests/disco/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/disco/Makefile" ;; + "src/tests/error/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/error/Makefile" ;; + "src/tests/featureneg/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/featureneg/Makefile" ;; + "src/tests/flexofflineoffline/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/flexofflineoffline/Makefile" ;; + "src/tests/flexoffline/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/flexoffline/Makefile" ;; + "src/tests/forward/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/forward/Makefile" ;; + "src/tests/gpgencrypted/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/gpgencrypted/Makefile" ;; + "src/tests/gpgsigned/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/gpgsigned/Makefile" ;; + "src/tests/inbandbytestreamibb/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/inbandbytestreamibb/Makefile" ;; + "src/tests/inbandbytestream/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/inbandbytestream/Makefile" ;; + "src/tests/iodata/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/iodata/Makefile" ;; + "src/tests/iq/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/iq/Makefile" ;; + "src/tests/jid/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/jid/Makefile" ;; + "src/tests/jingleiceudp/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/jingleiceudp/Makefile" ;; + "src/tests/jinglesession/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/jinglesession/Makefile" ;; + "src/tests/jinglesessionjingle/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/jinglesessionjingle/Makefile" ;; + "src/tests/jinglesessionmanager/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/jinglesessionmanager/Makefile" ;; + "src/tests/lastactivityquery/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/lastactivityquery/Makefile" ;; + "src/tests/lastactivity/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/lastactivity/Makefile" ;; + "src/tests/md5/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/md5/Makefile" ;; + "src/tests/message/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/message/Makefile" ;; + "src/tests/messageeventfilter/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/messageeventfilter/Makefile" ;; + "src/tests/mucroommuc/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/mucroommuc/Makefile" ;; + "src/tests/mucroommucadmin/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/mucroommucadmin/Makefile" ;; + "src/tests/mucroommucowner/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/mucroommucowner/Makefile" ;; + "src/tests/mucroommucuser/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/mucroommucuser/Makefile" ;; + "src/tests/nickname/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/nickname/Makefile" ;; + "src/tests/nonsaslauthquery/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/nonsaslauthquery/Makefile" ;; + "src/tests/nonsaslauth/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/nonsaslauth/Makefile" ;; + "src/tests/oob/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/oob/Makefile" ;; + "src/tests/parser/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/parser/Makefile" ;; + "src/tests/prep/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/prep/Makefile" ;; + "src/tests/presence/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/presence/Makefile" ;; + "src/tests/privacymanagerquery/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/privacymanagerquery/Makefile" ;; + "src/tests/privacymanager/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/privacymanager/Makefile" ;; + "src/tests/privatexml/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/privatexml/Makefile" ;; + "src/tests/pubsubmanagerpubsub/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/pubsubmanagerpubsub/Makefile" ;; + "src/tests/pubsubmanager/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/pubsubmanager/Makefile" ;; + "src/tests/pubsubevent/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/pubsubevent/Makefile" ;; + "src/tests/receipt/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/receipt/Makefile" ;; + "src/tests/registrationquery/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/registrationquery/Makefile" ;; + "src/tests/registration/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/registration/Makefile" ;; + "src/tests/rostermanagerquery/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/rostermanagerquery/Makefile" ;; + "src/tests/rostermanager/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/rostermanager/Makefile" ;; + "src/tests/searchquery/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/searchquery/Makefile" ;; + "src/tests/search/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/search/Makefile" ;; + "src/tests/sha/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/sha/Makefile" ;; + "src/tests/shim/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/shim/Makefile" ;; + "src/tests/simanager/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/simanager/Makefile" ;; + "src/tests/simanagersi/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/simanagersi/Makefile" ;; + "src/tests/stanzaextensionfactory/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/stanzaextensionfactory/Makefile" ;; + "src/tests/subscription/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/subscription/Makefile" ;; + "src/tests/tag/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/tag/Makefile" ;; + "src/tests/tlsgnutls/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/tlsgnutls/Makefile" ;; + "src/tests/uniquemucroomunique/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/uniquemucroomunique/Makefile" ;; + "src/tests/util/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/util/Makefile" ;; + "src/tests/vcard/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/vcard/Makefile" ;; + "src/tests/vcardupdate/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/vcardupdate/Makefile" ;; + "src/tests/xpath/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/xpath/Makefile" ;; + "src/tests/zlib/Makefile") CONFIG_FILES="$CONFIG_FILES src/tests/zlib/Makefile" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "libtool":C) + + # See if we are running on zsh, and set the options which allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + + cfgfile="${ofile}T" + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL + +# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, +# 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is part of GNU Libtool. +# +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, or +# obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + +# The names of the tagged configurations supported by this script. +available_tags="CXX " + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=$macro_version +macro_revision=$macro_revision + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# What type of objects to build. +pic_mode=$pic_mode + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# An echo program that protects backslashes. +ECHO=$lt_ECHO + +# The PATH separator for the build system. +PATH_SEPARATOR=$lt_PATH_SEPARATOR + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="\$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP=$lt_GREP + +# An ERE matcher. +EGREP=$lt_EGREP + +# A literal string matcher. +FGREP=$lt_FGREP + +# A BSD- or MS-compatible name lister. +NM=$lt_NM + +# Whether we need soft or hard links. +LN_S=$lt_LN_S + +# What is the maximum length of a command? +max_cmd_len=$max_cmd_len + +# Object file suffix (normally "o"). +objext=$ac_objext + +# Executable file suffix (normally ""). +exeext=$exeext + +# whether the shell understands "unset". +lt_unset=$lt_unset + +# turn spaces into newlines. +SP2NL=$lt_lt_SP2NL + +# turn newlines into spaces. +NL2SP=$lt_lt_NL2SP + +# convert \$build file names to \$host format. +to_host_file_cmd=$lt_cv_to_host_file_cmd + +# convert \$build files to toolchain format. +to_tool_file_cmd=$lt_cv_to_tool_file_cmd + +# An object symbol dumper. +OBJDUMP=$lt_OBJDUMP + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd=$lt_file_magic_cmd + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob=$lt_file_magic_glob + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob=$lt_want_nocaseglob + +# DLL creation program. +DLLTOOL=$lt_DLLTOOL + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd + +# The archiver. +AR=$lt_AR + +# Flags to create an archive. +AR_FLAGS=$lt_AR_FLAGS + +# How to feed a file listing to the archiver. +archiver_list_spec=$lt_archiver_list_spec + +# A symbol stripping program. +STRIP=$lt_STRIP + +# Commands used to install an old-style archive. +RANLIB=$lt_RANLIB +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=$lock_old_archive_extraction + +# A C compiler. +LTCC=$lt_CC + +# LTCC compiler flags. +LTCFLAGS=$lt_CFLAGS + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix + +# Specify filename containing input files for \$NM. +nm_file_list_spec=$lt_nm_file_list_spec + +# The root where to search for dependent libraries,and in which our libraries should be installed. +lt_sysroot=$lt_sysroot + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=$MAGIC_CMD + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Manifest tool. +MANIFEST_TOOL=$lt_MANIFEST_TOOL + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL=$lt_DSYMUTIL + +# Tool to change global to local symbols on Mac OS X. +NMEDIT=$lt_NMEDIT + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO=$lt_LIPO + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL=$lt_OTOOL + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=$lt_OTOOL64 + +# Old archive suffix (normally "a"). +libext=$libext + +# Shared library suffix (normally ".so"). +shrext_cmds=$lt_shrext_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink=$lt_variables_saved_for_relink + +# Do we need the "lib" prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Library versioning type. +version_type=$version_type + +# Shared library runtime path variable. +runpath_var=$runpath_var + +# Shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Permission mode override for installation of shared libraries. +install_override_mode=$lt_install_override_mode + +# Command to use after installation of a shared archive. +postinstall_cmds=$lt_postinstall_cmds + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval=$lt_finish_eval + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Compile-time system search path for libraries. +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries. +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + + +# The linker used to build libraries. +LD=$lt_LD + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds + +# A language specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU compiler? +with_gcc=$GCC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects +postdep_objects=$lt_postdep_objects +predeps=$lt_predeps +postdeps=$lt_postdeps + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# ### END LIBTOOL CONFIG + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + +ltmain="$ac_aux_dir/ltmain.sh" + + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + if test x"$xsi_shell" = xyes; then + sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ +func_dirname ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_basename ()$/,/^} # func_basename /c\ +func_basename ()\ +{\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ +func_dirname_and_basename ()\ +{\ +\ case ${1} in\ +\ */*) func_dirname_result="${1%/*}${2}" ;;\ +\ * ) func_dirname_result="${3}" ;;\ +\ esac\ +\ func_basename_result="${1##*/}"\ +} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ +func_stripname ()\ +{\ +\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ +\ # positional parameters, so assign one to ordinary parameter first.\ +\ func_stripname_result=${3}\ +\ func_stripname_result=${func_stripname_result#"${1}"}\ +\ func_stripname_result=${func_stripname_result%"${2}"}\ +} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ +func_split_long_opt ()\ +{\ +\ func_split_long_opt_name=${1%%=*}\ +\ func_split_long_opt_arg=${1#*=}\ +} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ +func_split_short_opt ()\ +{\ +\ func_split_short_opt_arg=${1#??}\ +\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ +} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ +func_lo2o ()\ +{\ +\ case ${1} in\ +\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ +\ *) func_lo2o_result=${1} ;;\ +\ esac\ +} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_xform ()$/,/^} # func_xform /c\ +func_xform ()\ +{\ + func_xform_result=${1%.*}.lo\ +} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_arith ()$/,/^} # func_arith /c\ +func_arith ()\ +{\ + func_arith_result=$(( $* ))\ +} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_len ()$/,/^} # func_len /c\ +func_len ()\ +{\ + func_len_result=${#1}\ +} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + +fi + +if test x"$lt_shell_append" = xyes; then + sed -e '/^func_append ()$/,/^} # func_append /c\ +func_append ()\ +{\ + eval "${1}+=\\${2}"\ +} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ +func_append_quoted ()\ +{\ +\ func_quote_for_eval "${2}"\ +\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ +} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") +test 0 -eq $? || _lt_function_replace_fail=: + + + # Save a `func_append' function call where possible by direct use of '+=' + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +else + # Save a `func_append' function call even when '+=' is not available + sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ + && mv -f "$cfgfile.tmp" "$cfgfile" \ + || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") + test 0 -eq $? || _lt_function_replace_fail=: +fi + +if test x"$_lt_function_replace_fail" = x":"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 +$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} +fi + + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + + + cat <<_LT_EOF >> "$ofile" + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# How to create reloadable object files. +reload_flag=$lt_reload_flag_CXX +reload_cmds=$lt_reload_cmds_CXX + +# Commands used to build an old-style archive. +old_archive_cmds=$lt_old_archive_cmds_CXX + +# A language specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU compiler? +with_gcc=$GCC_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object=$lt_compiler_needs_object_CXX + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Whether we are building with GNU ld or not. +with_gnu_ld=$lt_with_gnu_ld_CXX + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that enforces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting \${shlibpath_var} if the +# library is relocated. +hardcode_direct_absolute=$hardcode_direct_absolute_CXX + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=$inherit_rpath_CXX + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Set to "yes" if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds=$lt_prelink_cmds_CXX + +# Commands necessary for finishing linking programs. +postlink_cmds=$lt_postlink_cmds_CXX + +# Specify filename containing input files. +file_list_spec=$lt_file_list_spec_CXX + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects=$lt_predep_objects_CXX +postdep_objects=$lt_postdep_objects_CXX +predeps=$lt_predeps_CXX +postdeps=$lt_postdeps_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# ### END LIBTOOL TAG CONFIG: CXX +_LT_EOF + + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/smack/smack/src/main/cpp/gloox/configure.ac b/smack/smack/src/main/cpp/gloox/configure.ac new file mode 100644 index 00000000..1814cd0d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/configure.ac @@ -0,0 +1,469 @@ + +dnl Process this file with autoconf to produce a configure script. + +AC_PREREQ(2.50) +AC_INIT([gloox], [1.0.13], [js@camaya.net]) +AC_CONFIG_SRCDIR(src/gloox.cpp) +AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) + +dnl create a config.h file (Automake will add -DHAVE_CONFIG_H) +AM_CONFIG_HEADER(config.h.unix) + +AC_SUBST(VERSION) + +ISODATE=`date +%Y-%m-%d` +AC_SUBST(ISODATE) + +AC_CANONICAL_HOST + +dnl Checks for programs. +AC_PROG_INSTALL +AC_PROG_CC +AC_PROG_CXX +AC_PROG_RANLIB +AM_PROG_LIBTOOL +AC_PROG_LIBTOOL + +dnl +dnl extra paths +dnl + +AC_ARG_WITH(extra_include_path, AC_HELP_STRING([--with-extra-include-path], + [use additional include paths]), + extra_include_path=$withval) +split_includes="`echo $extra_include_path | sed -e 's/:/ /g'`" +for incpath in $split_includes ; do + CPPFLAGS="-I$incpath $CPPFLAGS" +done + +AC_ARG_WITH(extra_library_path, AC_HELP_STRING([--with-extra-library-path], + [use additional library paths]), + extra_library_path=$withval) +split_libs="`echo $extra_library_path | sed -e 's/:/ /g'`" +for libpath in $split_libs ; do + LDFLAGS="-L$libpath $LDFLAGS" +done + +dnl Check for GCC atomic builtins +AC_MSG_CHECKING([whether GCC atomic builtins are available]) +echo 'int main(int argc, char* argv[]) { int i; __sync_add_and_fetch(&i, 1); __sync_sub_and_fetch(&i, 1); return 0; } ' > check_atomicbuiltins.c +if test -z "`${CC} check_atomicbuiltins.c -o check_atomicbuiltins 2>&1`" ; then + HAVE_GCC_ATOMIC_BUILTINS=yes + AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS, 1, [Define to 1 if GCC atomic builtins are available]) + AC_MSG_RESULT([yes]) + if test $cross_compiling == "yes"; then + # Some platforms don't seem to be fully happy for libraries using GCC atomic builtins + # unless -lgcc and -lgcc_s are explicitly included. + # (Errors like + # ld: hidden symbol `__sync_add_and_fetch_4' in .../libgcc.a(linux-atomic.o) is referenced by DSO + # ld: final link failed: Nonrepresentable section on output) + LDFLAGS="$LDFLAGS -lgcc -lgcc_s" + fi +else + HAVE_GCC_ATOMIC_BUILTINS=no + AC_MSG_RESULT([no]) +fi +rm -f check_atomicbuiltins* +AC_SUBST(HAVE_GCC_ATOMIC_BUILTINS,$HAVE_GCC_ATOMIC_BUILTINS) + + +dnl Checks for libraries. + +dnl Libidn +AC_ARG_WITH(libidn, AC_HELP_STRING([--with-libidn=[DIR]], + [Support IDN (needs GNU Libidn)]), + libidn=$withval, libidn=yes) +if test "$libidn" != "no"; then + if test "$libidn" != "yes"; then + LDFLAGS="${LDFLAGS} -L$libidn/lib" + CPPFLAGS="${CPPFLAGS} -I$libidn/include" + fi + AC_CHECK_HEADER(idna.h, + AC_CHECK_LIB(idn, stringprep_check_version, + [libidn=yes LIBS="${LIBS} -lidn"], libidn=no), + libidn=no) +fi +if test "$libidn" != "no" ; then + AC_DEFINE(HAVE_LIBIDN, 1, [Define to 1 if you want IDN support.]) +else + AC_MSG_WARN([Libidn not found]) +fi +AC_MSG_CHECKING([if Libidn should be used]) +AC_MSG_RESULT($libidn) + + +dnl extra win32 libs +case "$host_os" in + *mingw*|*cygwin*) + LIBS="${LIBS} -lwsock32 -lgdi32 -ldnsapi";; + *) + CXXFLAGS="$CXXFLAGS -ansi";; +esac + + +ssl=no + +dnl schannel +AC_ARG_WITH(schannel, AC_HELP_STRING([--with-schannel], + [Support Stream Encryption (win32 only)]), + schannel=yes, schannel=no) +if test "$schannel" = "yes"; then + case "$host_os" in + *mingw*|*cygwin*) + ssl=yes + LIBS="${LIBS} -lcrypt32 -lsecur32";; + *) + schannel=no + echo "*" + echo "* You provided the '--with-schannel' switch. SChannel is only available in MinGW/cygwin. Ignoring." + echo "*";; + esac + AC_MSG_CHECKING([if SChannel should be used]) + AC_MSG_RESULT($schannel) +fi + +dnl GnuTLS +if test "$ssl" = "no"; then + AC_ARG_WITH(gnutls, AC_HELP_STRING([--with-gnutls=[yes/no]], + [Support Stream Encryption (needs GnuTLS)]), + gnutls=$withval, gnutls=yes) + if test "$gnutls" != "no"; then + PKG_CHECK_MODULES([GNUTLS], [gnutls >= 2.12], [gnutls=yes], [gnutls=no]) + if test "$gnutls" = "yes" ; then + LIBS="${LIBS} ${GNUTLS_LIBS}" + CPPFLAGS="${CPPFLAGS} ${GNUTLS_CFLAGS}" + AC_DEFINE(HAVE_GNUTLS, 1, [Define to 1 if you want TLS support (GnuTLS). Undefine HAVE_OPENSSL.]) + AC_DEFINE(HAVE_GNUTLS_SESSION_CHANNEL_BINDING, 1, [Define to 1 if you have GnuTLS 2.12.0 or above.] ) + ssl=yes + else + AC_MSG_WARN([GnuTLS not found]) + fi + fi + AC_MSG_CHECKING([if GnuTLS should be used]) + AC_MSG_RESULT($gnutls) +fi + +dnl OpenSSL +if test "$ssl" = "no"; then + AC_ARG_WITH(openssl, AC_HELP_STRING([--with-openssl=[DIR]], + [Support Stream Encryption (needs OpenSSL)]), + openssl=$withval, openssl=yes) + if test "$openssl" != "no"; then + if test "$openssl" != "yes"; then + LDFLAGS="${LDFLAGS} -L$openssl/lib" + CPPFLAGS="${CPPFLAGS} -I$openssl/include" + fi + LIBS_TMP=${LIBS} + LIBS="${LIBS} -lssl -lcrypto" + AC_CHECK_HEADER(openssl/ssl.h, + AC_CHECK_LIB(ssl, SSL_library_init, + [openssl=yes], openssl=no), + [openssl=no LIBS=${LIBS_TMP}]) + fi + if test "$openssl" != "no" ; then + AC_DEFINE(HAVE_OPENSSL, 1, [Define to 1 if you want TLS support (OpenSSL). Undefine HAVE_GNUTLS.]) + else + AC_MSG_WARN([OpenSSL not found]) + fi + AC_MSG_CHECKING([if OpenSSL should be used]) + AC_MSG_RESULT($openssl) +fi + +dnl Zlib +AC_ARG_WITH(zlib, AC_HELP_STRING([--with-zlib=[DIR]], + [Support Stream Compression (needs Zlib)]), + zlib=$withval, zlib=yes) +if test "$zlib" != "no"; then + if test "$zlib" != "yes"; then + LDFLAGS="${LDFLAGS} -L$zlib/lib" + CPPFLAGS="${CPPFLAGS} -I$zlib/include" + fi + AC_CHECK_HEADER(zlib.h, + AC_CHECK_LIB(z, zlibVersion, + [zlib=yes LIBS="${LIBS} -lz"], zlib=no), + zlib=no) +fi +if test "$zlib" != "no" ; then + AC_DEFINE(HAVE_ZLIB, 1, [Define to 1 if you want Stream Compression support.]) +else + AC_MSG_WARN([Zlib not found]) +fi +AC_MSG_CHECKING([if Zlib should be used]) +AC_MSG_RESULT($zlib) + +dnl pthread +ACX_PTHREAD() +LIBS="$PTHREAD_LIBS $LIBS" +CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS" +LDFLAGS="$LDFLAGS $PTHREAD_CFLAGS" + +dnl check for res_querydomain in libc, libbind and libresolv +AC_CHECK_FUNCS(res_querydomain) +if test "x-$ac_cv_func_res_querydomain" = "x-yes" ; then + have_res_querydomain=yes +else + AC_CHECK_LIB(resolv, res_querydomain) + if test "x-$ac_cv_lib_resolv_res_querydomain" = "x-yes" ; then + have_res_querydomain=yes + AC_DEFINE(HAVE_RES_QUERYDOMAIN) + else + AC_CHECK_LIB(bind, res_querydomain) + if test "x-$ac_cv_lib_bind_res_querydomain" = "x-yes" ; then + have_res_querydomain=yes + AC_DEFINE(HAVE_RES_QUERYDOMAIN) + else + AC_MSG_CHECKING([for res_querydomain in -lresolv (alternate version)]) + save_libs="$LIBS" + LIBS="-lresolv $LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[res_querydomain(0,0,0,0,0,0)]])], + [AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_QUERYDOMAIN) + have_res_querydomain=yes], + [AC_MSG_RESULT(no) + LIBS="$save_libs"]) + fi + fi +fi + +dnl check for dn_skipname in libc, libbind and libresolv +AC_CHECK_FUNCS(dn_skipname) +if test "x-$ac_cv_func_dn_skipname" = "x-yes" ; then + have_dn_skipname=yes +else + AC_CHECK_LIB(resolv, dn_skipname) + if test "x-$ac_cv_lib_resolv_dn_skipname" = "x-yes" ; then + have_dn_skipname=yes + AC_DEFINE(HAVE_DN_SKIPNAME) + else + AC_CHECK_LIB(bind, dn_skipname) + if test "x-$ac_cv_lib_bind_dn_skipname" = "x-yes" ; then + have_dn_skipname=yes + AC_DEFINE(HAVE_DN_SKIPNAME) + else + AC_MSG_CHECKING([for dn_skipname in -lresolv (alternate version)]) + save_libs="$LIBS" + LIBS="-lresolv $LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], [[dn_skipname(0,0)]])], + [AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_DN_SKIPNAME) + have_dn_skipname=yes], + [AC_MSG_RESULT(no) + LIBS="$save_libs"]) + fi + fi +fi + +dnl check for res_query in libc, libbind and libresolv +AC_CHECK_FUNCS(res_query) +if test "x-$ac_cv_func_res_query" = "x-yes" ; then + have_res_query=yes +else + AC_CHECK_LIB(resolv, res_query) + if test "x-$ac_cv_lib_resolv_res_query" = "x-yes" ; then + have_res_query=yes + AC_DEFINE(HAVE_RES_QUERY) + else + AC_CHECK_LIB(bind, res_query) + if test "x-$ac_cv_lib_bind_res_query" = "x-yes" ; then + have_res_query=yes + AC_DEFINE(HAVE_RES_QUERY) + else + AC_MSG_CHECKING([for res_query in -lresolv (alternate version)]) + save_libs="$LIBS" + LIBS="-lresolv $LIBS" + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[res_query(0,0,0,0,0)]])], + [AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_RES_QUERY) + have_res_query=yes], + [AC_MSG_RESULT(no) + LIBS="$save_libs"]) + fi + fi +fi + + +# AC_SEARCH_LIBS(res_query,resolv bind,, +# AC_SEARCH_LIBS(__res_query,resolv bind,,have_resolver=no)) +# AC_SEARCH_LIBS(dn_expand,resolv bind,, +# AC_SEARCH_LIBS(__dn_expand,resolv bind,,have_resolver=no)) +# AC_SEARCH_LIBS(dn_skipname,resolv bind,, +# AC_SEARCH_LIBS(__dn_skipname,resolv bind,,have_resolver=no)) +# AC_SEARCH_LIBS(res_querydomain,resolv bind,, +# AC_SEARCH_LIBS(__res_querydomain,resolv bind,,have_resolver=no)) + + +dnl Debug +debug="no" +AC_ARG_ENABLE( debug, + [AC_HELP_STRING([--enable-debug], + [turn on debugging [default=no]])], + [debug="yes"] ) +if test "x$debug" = "xyes"; then + CPPFLAGS="$CPPFLAGS -g3 -fno-inline -DDEBUG" +fi +AC_MSG_CHECKING([whether to enable debug]) +AC_MSG_RESULT($debug) + +dnl getaddrinfo +getaddrinfo="no" +AC_ARG_ENABLE( getaddrinfo, + [AC_HELP_STRING([--enable-getaddrinfo], + [use getaddrinfo for dns lookups [default=no]])], + [getaddrinfo="yes"] ) +if test "x$getaddrinfo" = "xyes"; then + AC_CHECK_FUNCS(getaddrinfo,,getaddrinfo="no") +fi +AC_MSG_CHECKING([whether to use getaddrinfo]) +AC_MSG_RESULT($getaddrinfo) + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(unistd.h strings.h errno.h arpa/nameser.h) +AC_CHECK_FUNCS(setsockopt,,[AC_CHECK_LIB(socket,setsockopt)]) + +dnl Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE + +dnl Want mdns support? +AC_ARG_ENABLE([mdns], + [AC_HELP_STRING([--enable-mdns], + [use mdns [default=no]])], + [enable_mdns=yes], + [enable_mdns=no]) +if test "$enable_mdns" = yes; then + AC_DEFINE([HAVE_MDNS], [], [enable mdns support]) + AC_CHECK_HEADER(dns_sd.h, + AC_CHECK_LIB(dns_sd, DNSServiceCreateConnection, + [LIBS="${LIBS} -ldns_sd"], enable_mdns=no), + enable_mdns=no) +else + MAYBE_LIB_mdns= +fi +AC_SUBST(MAYBE_LIB_mdns) +AC_MSG_CHECKING([if mDNS support should be built]) +AC_MSG_RESULT($enable_mdns) + +dnl build tests? +want_tests=yes +AC_ARG_WITH(tests, AC_HELP_STRING([--with-tests], + [Build unit tests (default=yes]), + want_tests=$withval, want_tests=yes) +AC_MSG_CHECKING([if unit tests should be built]) +AC_MSG_RESULT($want_tests) + +if test "$want_tests" = yes; +then + MAYBE_TESTS=tests +else + MAYBE_TESTS= +fi +AC_SUBST([MAYBE_TESTS]) + +dnl build examples? +want_examples=yes +AC_ARG_WITH(examples, AC_HELP_STRING([--with-examples], + [Build example programs (default=yes)]), + want_examples=$withval, want_examples=yes) +AC_MSG_CHECKING([if example programs should be built]) +AC_MSG_RESULT($want_examples) + +if test "$want_examples" = yes; +then + MAYBE_EXAMPLES=examples +else + MAYBE_EXAMPLES= +fi +AC_SUBST([MAYBE_EXAMPLES]) + + +dnl Generating makefiles. +AC_CONFIG_FILES([ +Makefile +gloox.pc +gloox-config +src/Makefile +src/examples/Makefile +src/tests/Makefile +src/tests/adhoc/Makefile +src/tests/adhoccommand/Makefile +src/tests/adhoccommandnote/Makefile +src/tests/amprule/Makefile +src/tests/amp/Makefile +src/tests/base64/Makefile +src/tests/capabilities/Makefile +src/tests/carbons/Makefile +src/tests/chatstatefilter/Makefile +src/tests/client/Makefile +src/tests/clientbase/Makefile +src/tests/connectionbosh/Makefile +src/tests/dataform/Makefile +src/tests/dataformfield/Makefile +src/tests/dataformitem/Makefile +src/tests/dataformreported/Makefile +src/tests/delayeddelivery/Makefile +src/tests/discoinfo/Makefile +src/tests/discoitems/Makefile +src/tests/disco/Makefile +src/tests/error/Makefile +src/tests/featureneg/Makefile +src/tests/flexofflineoffline/Makefile +src/tests/flexoffline/Makefile +src/tests/forward/Makefile +src/tests/gpgencrypted/Makefile +src/tests/gpgsigned/Makefile +src/tests/inbandbytestreamibb/Makefile +src/tests/inbandbytestream/Makefile +src/tests/iodata/Makefile +src/tests/iq/Makefile +src/tests/jid/Makefile +src/tests/jingleiceudp/Makefile +src/tests/jinglesession/Makefile +src/tests/jinglesessionjingle/Makefile +src/tests/jinglesessionmanager/Makefile +src/tests/lastactivityquery/Makefile +src/tests/lastactivity/Makefile +src/tests/md5/Makefile +src/tests/message/Makefile +src/tests/messageeventfilter/Makefile +src/tests/mucroommuc/Makefile +src/tests/mucroommucadmin/Makefile +src/tests/mucroommucowner/Makefile +src/tests/mucroommucuser/Makefile +src/tests/nickname/Makefile +src/tests/nonsaslauthquery/Makefile +src/tests/nonsaslauth/Makefile +src/tests/oob/Makefile +src/tests/parser/Makefile +src/tests/prep/Makefile +src/tests/presence/Makefile +src/tests/privacymanagerquery/Makefile +src/tests/privacymanager/Makefile +src/tests/privatexml/Makefile +src/tests/pubsubmanagerpubsub/Makefile +src/tests/pubsubmanager/Makefile +src/tests/pubsubevent/Makefile +src/tests/receipt/Makefile +src/tests/registrationquery/Makefile +src/tests/registration/Makefile +src/tests/rostermanagerquery/Makefile +src/tests/rostermanager/Makefile +src/tests/searchquery/Makefile +src/tests/search/Makefile +src/tests/sha/Makefile +src/tests/shim/Makefile +src/tests/simanager/Makefile +src/tests/simanagersi/Makefile +src/tests/stanzaextensionfactory/Makefile +src/tests/subscription/Makefile +src/tests/tag/Makefile +src/tests/tlsgnutls/Makefile +src/tests/uniquemucroomunique/Makefile +src/tests/util/Makefile +src/tests/vcard/Makefile +src/tests/vcardupdate/Makefile +src/tests/xpath/Makefile +src/tests/zlib/Makefile +]) +AC_OUTPUT diff --git a/smack/smack/src/main/cpp/gloox/depcomp b/smack/smack/src/main/cpp/gloox/depcomp new file mode 100644 index 00000000..25a39e6c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/depcomp @@ -0,0 +1,708 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2012-03-27.16; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. + +# 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, 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' "$nl" < "$tmpdepfile" | +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependent.h'. + # Do two passes, one to just change these to + # '$object: dependent.h' and one to simply 'dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. + # However on + # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\': + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + # tcc 0.9.26 (FIXME still under development at the moment of writing) + # will emit a similar output, but also prepend the continuation lines + # with horizontal tabulation characters. + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form 'foo.o: dependent.h', + # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. + # Do two passes, one to just change these to + # '$object: dependent.h' and one to simply 'dependent.h:'. + sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ + < "$tmpdepfile" > "$depfile" + sed ' + s/[ '"$tab"'][ '"$tab"']*/ /g + s/^ *// + s/ *\\*$// + s/^[^:]*: *// + /^$/d + /:$/d + s/$/ :/ + ' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test "$stat" = 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' "$nl" < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/smack/smack/src/main/cpp/gloox/gloox-config.in b/smack/smack/src/main/cpp/gloox/gloox-config.in new file mode 100644 index 00000000..f4dcbbcf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/gloox-config.in @@ -0,0 +1,89 @@ +#!/bin/sh + +# gloox-config + +prefix="@prefix@" +exec_prefix="@prefix@/bin" +version="@VERSION@" + +include_dir="@prefix@/include" +lib_dir="@prefix@/lib" + +usage() +{ + cat <&2 +fi + +while test $# -gt 0; do + case $1 in + --prefix) + echo_prefix=yes + ;; + + --cflags) + echo_cflags=yes + ;; + + --cxxflags) + echo_cxxflags=yes + ;; + + --libs) + echo_libs=yes + ;; + + --version) + echo_version=yes + ;; + + *) + usage 1 1>&2 + ;; + esac + shift +done + +if test "$echo_prefix" = "yes"; then + echo $prefix +fi + +cxxflags="-I$include_dir" +cflags=$cxxflags + +if test "$lib_dir" != "/usr/lib"; then + libs="-L$lib_dir" +else + libs="" +fi + +libs="$libs @LIBS@ -lgloox" + +if test "$echo_cflags" = "yes"; then + echo $cflags +fi + +if test "$echo_cxxflags" = "yes"; then + echo $cxxflags +fi + +if test "$echo_libs" = "yes"; then + echo $libs +fi + +if test "$echo_version" = "yes"; then + echo $version +fi diff --git a/smack/smack/src/main/cpp/gloox/gloox.cbp b/smack/smack/src/main/cpp/gloox/gloox.cbp new file mode 100644 index 00000000..9f734da7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/gloox.cbp @@ -0,0 +1,302 @@ + + + + + + diff --git a/smack/smack/src/main/cpp/gloox/gloox.dsp b/smack/smack/src/main/cpp/gloox/gloox.dsp new file mode 100644 index 00000000..6edb192a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/gloox.dsp @@ -0,0 +1,1073 @@ +# Microsoft Developer Studio Project File - Name="gloox 1.0" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=gloox 1.0 - Win32 Debug +!MESSAGE Dies ist kein gltiges Makefile. Zum Erstellen dieses Projekts mit NMAKE +!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und fhren Sie den Befehl +!MESSAGE +!MESSAGE NMAKE /f "gloox.mak". +!MESSAGE +!MESSAGE Sie knnen beim Ausfhren von NMAKE eine Konfiguration angeben +!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel: +!MESSAGE +!MESSAGE NMAKE /f "gloox.mak" CFG="gloox 1.0 - Win32 Debug" +!MESSAGE +!MESSAGE Fr die Konfiguration stehen zur Auswahl: +!MESSAGE +!MESSAGE "gloox 1.0 - Win32 Release" (basierend auf "Win32 (x86) Dynamic-Link Library") +!MESSAGE "gloox 1.0 - Win32 Debug" (basierend auf "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)" == "gloox 1.0 - 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 "GLOOX_EXPORTS" /YX /FD /c +# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GLOOX_EXPORTS" /YX /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /dll + +!ELSEIF "$(CFG)" == "gloox 1.0 - 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 "GLOOX_EXPORTS" /YX /FD /GZ /c +# ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GLOOX_EXPORTS" /YX /FD /GZ /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /dll + +!ENDIF + +# Begin Target + +# Name "gloox 1.0 - Win32 Release" +# Name "gloox 1.0 - Win32 Debug" +# Begin Group "Quellcodedateien" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\src\adhoc.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\amp.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\annotations.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\base64.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\bookmarkstorage.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\capabilities.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\carbons.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\chatstate.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\chatstatefilter.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\client.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\clientbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\component.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\compressionzlib.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\connectionbosh.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\connectionhttpproxy.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\connectionsocks5proxy.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontcpbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontcpclient.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontcpserver.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontls.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\dataform.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\dataformfield.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\dataformfieldcontainer.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\dataformitem.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\dataformreported.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\delayeddelivery.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\disco.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\dns.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\error.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\eventdispatcher.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\featureneg.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\flexoff.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\gloox.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\forward.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\gpgencrypted.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\gpgsigned.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\inbandbytestream.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\instantmucroom.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\iq.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\jid.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\lastactivity.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\logsink.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\md5.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\message.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\messageevent.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\messageeventfilter.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\messagefilter.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\messagesession.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\mucmessagesession.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\mucroom.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\mutex.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\nickname.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\nonsaslauth.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\oob.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\parser.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\prep.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\presence.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\privacyitem.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\privacymanager.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\privatexml.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubevent.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubitem.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubmanager.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\receipt.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\registration.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\rosteritem.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\rostermanager.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\search.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\sha.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\shim.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\simanager.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\siprofileft.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\socks5bytestream.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\socks5bytestreammanager.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\socks5bytestreamserver.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\softwareversion.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\stanza.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\stanzaextensionfactory.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\subscription.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tag.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsdefault.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsclient.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsclientanon.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsserveranon.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsopensslbase.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsopensslclient.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsopensslserver.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\tlsschannel.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\uniquemucroom.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\util.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\vcard.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\vcardmanager.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\vcardupdate.cpp +# End Source File +# Begin Source File + +SOURCE=.\src\version.rc +# End Source File +# Begin Source File + +SOURCE=.\src\xhtmlim.cpp +# End Source File +# End Group +# Begin Group "Header-Dateien" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\src\adhoc.h +# End Source File +# Begin Source File + +SOURCE=.\src\adhoccommandprovider.h +# End Source File +# Begin Source File + +SOURCE=.\src\adhochandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\amp.h +# End Source File +# Begin Source File + +SOURCE=.\src\annotations.h +# End Source File +# Begin Source File + +SOURCE=.\src\annotationshandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\base64.h +# End Source File +# Begin Source File + +SOURCE=.\src\bookmarkhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\bookmarkstorage.h +# End Source File +# Begin Source File + +SOURCE=.\src\bytestream.h +# End Source File +# Begin Source File + +SOURCE=.\src\bytestreamdatahandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\bytestreamhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\capabilities.h +# End Source File +# Begin Source File + +SOURCE=.\src\carbons.h +# End Source File +# Begin Source File + +SOURCE=.\src\chatstate.h +# End Source File +# Begin Source File + +SOURCE=.\src\chatstatefilter.h +# End Source File +# Begin Source File + +SOURCE=.\src\chatstatehandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\client.h +# End Source File +# Begin Source File + +SOURCE=.\src\clientbase.h +# End Source File +# Begin Source File + +SOURCE=.\src\component.h +# End Source File +# Begin Source File + +SOURCE=.\src\compressionbase.h +# End Source File +# Begin Source File + +SOURCE=.\src\compressiondatahandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\compressionzlib.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectionbase.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectionbosh.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectiondatahandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectionhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectionhttpproxy.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectionlistener.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectionsocks5proxy.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontcpbase.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontcpclient.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontcpserver.h +# End Source File +# Begin Source File + +SOURCE=.\src\connectiontls.h +# End Source File +# Begin Source File + +SOURCE=.\src\dataform.h +# End Source File +# Begin Source File + +SOURCE=.\src\dataformfield.h +# End Source File +# Begin Source File + +SOURCE=.\src\dataformfieldcontainer.h +# End Source File +# Begin Source File + +SOURCE=.\src\dataformitem.h +# End Source File +# Begin Source File + +SOURCE=.\src\dataformreported.h +# End Source File +# Begin Source File + +SOURCE=.\src\delayeddelivery.h +# End Source File +# Begin Source File + +SOURCE=.\src\disco.h +# End Source File +# Begin Source File + +SOURCE=.\src\discohandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\disconodehandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\dns.h +# End Source File +# Begin Source File + +SOURCE=.\src\error.h +# End Source File +# Begin Source File + +SOURCE=.\src\event.h +# End Source File +# Begin Source File + +SOURCE=.\src\eventdispatcher.h +# End Source File +# Begin Source File + +SOURCE=.\src\eventhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\featureneg.h +# End Source File +# Begin Source File + +SOURCE=.\src\flexoff.h +# End Source File +# Begin Source File + +SOURCE=.\src\flexoffhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\forward.h +# End Source File +# Begin Source File + +SOURCE=.\src\gloox.h +# End Source File +# Begin Source File + +SOURCE=.\src\gpgencrypted.h +# End Source File +# Begin Source File + +SOURCE=.\src\gpgsigned.h +# End Source File +# Begin Source File + +SOURCE=.\src\inbandbytestream.h +# End Source File +# Begin Source File + +SOURCE=.\src\instantmucroom.h +# End Source File +# Begin Source File + +SOURCE=.\src\iq.h +# End Source File +# Begin Source File + +SOURCE=.\src\iqhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\jid.h +# End Source File +# Begin Source File + +SOURCE=.\src\lastactivity.h +# End Source File +# Begin Source File + +SOURCE=.\src\lastactivityhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\loghandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\logsink.h +# End Source File +# Begin Source File + +SOURCE=.\src\macros.h +# End Source File +# Begin Source File + +SOURCE=.\src\md5.h +# End Source File +# Begin Source File + +SOURCE=.\src\message.h +# End Source File +# Begin Source File + +SOURCE=.\src\messageevent.h +# End Source File +# Begin Source File + +SOURCE=.\src\messageeventfilter.h +# End Source File +# Begin Source File + +SOURCE=.\src\messageeventhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\messagefilter.h +# End Source File +# Begin Source File + +SOURCE=.\src\messagehandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\messagesession.h +# End Source File +# Begin Source File + +SOURCE=.\src\messagesessionhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\mucinvitationhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\mucmessagesession.h +# End Source File +# Begin Source File + +SOURCE=.\src\mucroom.h +# End Source File +# Begin Source File + +SOURCE=.\src\mucroomconfighandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\mucroomhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\mutex.h +# End Source File +# Begin Source File + +SOURCE=.\src\mutexguard.h +# End Source File +# Begin Source File + +SOURCE=.\src\nickname.h +# End Source File +# Begin Source File + +SOURCE=.\src\nonsaslauth.h +# End Source File +# Begin Source File + +SOURCE=.\src\oob.h +# End Source File +# Begin Source File + +SOURCE=.\src\parser.h +# End Source File +# Begin Source File + +SOURCE=.\src\prep.h +# End Source File +# Begin Source File + +SOURCE=.\src\presence.h +# End Source File +# Begin Source File + +SOURCE=.\src\presencehandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\privacyitem.h +# End Source File +# Begin Source File + +SOURCE=.\src\privacylisthandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\privacymanager.h +# End Source File +# Begin Source File + +SOURCE=.\src\privatexml.h +# End Source File +# Begin Source File + +SOURCE=.\src\privatexmlhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\pubsub.h +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubevent.h +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubeventhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubitem.h +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubmanager.h +# End Source File +# Begin Source File + +SOURCE=.\src\pubsubresulthandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\receipt.h +# End Source File +# Begin Source File + +SOURCE=.\src\registration.h +# End Source File +# Begin Source File + +SOURCE=.\src\registrationhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\resource.h +# End Source File +# Begin Source File + +SOURCE=.\src\rosteritem.h +# End Source File +# Begin Source File + +SOURCE=.\src\rosteritemdata.h +# End Source File +# Begin Source File + +SOURCE=.\src\rosterlistener.h +# End Source File +# Begin Source File + +SOURCE=.\src\rostermanager.h +# End Source File +# Begin Source File + +SOURCE=.\src\search.h +# End Source File +# Begin Source File + +SOURCE=.\src\searchhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\sha.h +# End Source File +# Begin Source File + +SOURCE=.\src\shim.h +# End Source File +# Begin Source File + +SOURCE=.\src\sihandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\simanager.h +# End Source File +# Begin Source File + +SOURCE=.\src\siprofileft.h +# End Source File +# Begin Source File + +SOURCE=.\src\siprofilefthandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\siprofilehandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\socks5bytestream.h +# End Source File +# Begin Source File + +SOURCE=.\src\socks5bytestreammanager.h +# End Source File +# Begin Source File + +SOURCE=.\src\socks5bytestreamserver.h +# End Source File +# Begin Source File + +SOURCE=.\src\softwareversion.h +# End Source File +# Begin Source File + +SOURCE=.\src\stanza.h +# End Source File +# Begin Source File + +SOURCE=.\src\stanzaextension.h +# End Source File +# Begin Source File + +SOURCE=.\src\stanzaextensionfactory.h +# End Source File +# Begin Source File + +SOURCE=.\src\statisticshandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\subscription.h +# End Source File +# Begin Source File + +SOURCE=.\src\subscriptionhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\tag.h +# End Source File +# Begin Source File + +SOURCE=.\src\taghandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsbase.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsdefault.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsbase.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsclient.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsclientanon.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsgnutlsserveranon.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlshandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsopensslbase.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsopensslclient.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsopensslserver.h +# End Source File +# Begin Source File + +SOURCE=.\src\tlsschannel.h +# End Source File +# Begin Source File + +SOURCE=.\src\uniquemucroom.h +# End Source File +# Begin Source File + +SOURCE=.\src\util.h +# End Source File +# Begin Source File + +SOURCE=.\src\vcard.h +# End Source File +# Begin Source File + +SOURCE=.\src\vcardhandler.h +# End Source File +# Begin Source File + +SOURCE=.\src\vcardmanager.h +# End Source File +# Begin Source File + +SOURCE=.\src\vcardupdate.h +# End Source File +# Begin Source File + +SOURCE=.\src\xhtmlim.h +# End Source File +# End Group +# Begin Group "Ressourcendateien" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\config.h.win +# End Source File +# End Target +# End Project diff --git a/smack/smack/src/main/cpp/gloox/gloox.mmp b/smack/smack/src/main/cpp/gloox/gloox.mmp new file mode 100644 index 00000000..201de103 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/gloox.mmp @@ -0,0 +1,129 @@ +/* + Copyright (c) 2009-2013 by Jakob Schroeter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +// using relative paths for source and userinclude directories + + +target gloox.dll +targettype dll +uid 0x10004262 0x10004264 +vendorid 0x70000001 + +sourcepath .\src +source adhoc.cpp +source amp.cpp +source annotations.cpp +source attention.cpp +source atomicrefcount.cpp +source base64.cpp +source bookmarkstorage.cpp +source capabilities.cpp +source chatstate.cpp +source chatstatefilter.cpp +source clientbase.cpp +source client.cpp +source component.cpp +source compressiondefault.cpp +source compressionzlib.cpp +source connectionbosh.cpp +source connectionhttpproxy.cpp +source connectionsocks5proxy.cpp +source connectiontcpbase.cpp +source connectiontcpclient.cpp +source connectiontcpserver.cpp +source connectiontls.cpp +source connectiontlsserver.cpp +source dataform.cpp +source dataformfieldcontainer.cpp +source dataformfield.cpp +source dataformitem.cpp +source dataformreported.cpp +source delayeddelivery.cpp +source disco.cpp +source dns.cpp +source error.cpp +source eventdispatcher.cpp +source featureneg.cpp +source flexoff.cpp +source gloox.cpp +source gpgencrypted.cpp +source gpgsigned.cpp +source inbandbytestream.cpp +source instantmucroom.cpp +source iq.cpp +source jid.cpp +source lastactivity.cpp +source logsink.cpp +source md5.cpp +source message.cpp +source messageevent.cpp +source messageeventfilter.cpp +source messagefilter.cpp +source messagesession.cpp +source mucmessagesession.cpp +source mucroom.cpp +source mutex.cpp +source nickname.cpp +source nonsaslauth.cpp +source oob.cpp +source parser.cpp +source prep.cpp +source presence.cpp +source privacyitem.cpp +source privacymanager.cpp +source privatexml.cpp +source pubsubevent.cpp +source pubsubitem.cpp +source pubsubmanager.cpp +source receipt.cpp +source registration.cpp +source rosteritem.cpp +source rostermanager.cpp +source search.cpp +source sha.cpp +source shim.cpp +source simanager.cpp +source siprofileft.cpp +source socks5bytestream.cpp +source socks5bytestreammanager.cpp +source socks5bytestreamserver.cpp +source softwareversion.cpp +source stanza.cpp +source stanzaextensionfactory.cpp +source subscription.cpp +source tag.cpp +source tlsdefault.cpp +source tlsgnutlsbase.cpp +source tlsgnutlsclientanon.cpp +source tlsgnutlsclient.cpp +source tlsgnutlsserveranon.cpp +source tlsgnutlsserver.cpp +source tlsopensslbase.cpp +source tlsopensslclient.cpp +source tlsopensslserver.cpp +source tlsschannel.cpp +source uniquemucroom.cpp +source util.cpp +source vcard.cpp +source vcardmanager.cpp +source vcardupdate.cpp +source xhtmlim.cpp + +userinclude .\src +userinclude . + +systeminclude \epoc32\include +systeminclude \epoc32\include\stdapis +systeminclude \epoc32\include\stdapis\openssl +systeminclude \epoc32\include\stdapis\stlport + +library euser.lib estlib.lib libstdcpp.lib libssl.lib libcrypto.lib libz.lib esock.lib libc.lib diff --git a/smack/smack/src/main/cpp/gloox/gloox.pc.in b/smack/smack/src/main/cpp/gloox/gloox.pc.in new file mode 100644 index 00000000..7883b4a1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/gloox.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: gloox +Description: A high-level XMPP/Jabber library for C++ +Version: @VERSION@ +Libs: -L${libdir} -lgloox @LIBS@ +Cflags: -I${includedir} @CPPFLAGS@ diff --git a/smack/smack/src/main/cpp/gloox/gloox.vcproj b/smack/smack/src/main/cpp/gloox/gloox.vcproj new file mode 100644 index 00000000..3472fe13 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/gloox.vcproj @@ -0,0 +1,1242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/smack/smack/src/main/cpp/gloox/install-sh b/smack/smack/src/main/cpp/gloox/install-sh new file mode 100644 index 00000000..a9244eb0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/install-sh @@ -0,0 +1,527 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2011-01-19.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for `test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for `test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/smack/smack/src/main/cpp/gloox/ltmain.sh b/smack/smack/src/main/cpp/gloox/ltmain.sh new file mode 100644 index 00000000..33f642a0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/ltmain.sh @@ -0,0 +1,9661 @@ + +# libtool (GNU libtool) 2.4.2 +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool 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. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy +# can be downloaded from http://www.gnu.org/licenses/gpl.html, +# or obtained by writing to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +# Usage: $progname [OPTION]... [MODE-ARG]... +# +# Provide generalized library-building support services. +# +# --config show all configuration variables +# --debug enable verbose shell tracing +# -n, --dry-run display commands without modifying any files +# --features display basic configuration information and exit +# --mode=MODE use operation mode MODE +# --preserve-dup-deps don't remove duplicate dependency libraries +# --quiet, --silent don't print informational messages +# --no-quiet, --no-silent +# print informational messages (default) +# --no-warn don't display warning messages +# --tag=TAG use configuration variables from tag TAG +# -v, --verbose print more informational messages than default +# --no-verbose don't print the extra informational messages +# --version print version information +# -h, --help, --help-all print short, long, or detailed help message +# +# MODE must be one of the following: +# +# clean remove files from the build directory +# compile compile a source file into a libtool object +# execute automatically set library path, then run a program +# finish complete the installation of libtool libraries +# install install libraries or executables +# link create a library or an executable +# uninstall remove libraries from an installed directory +# +# MODE-ARGS vary depending on the MODE. When passed as first option, +# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. +# Try `$progname --help --mode=MODE' for a more detailed description of MODE. +# +# When reporting a bug, please describe a test case to reproduce it and +# include the following information: +# +# host-triplet: $host +# shell: $SHELL +# compiler: $LTCC +# compiler flags: $LTCFLAGS +# linker: $LD (gnu? $with_gnu_ld) +# $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.1 +# automake: $automake_version +# autoconf: $autoconf_version +# +# Report bugs to . +# GNU libtool home page: . +# General help using GNU software: . + +PROGRAM=libtool +PACKAGE=libtool +VERSION="2.4.2 Debian-2.4.2-1.1" +TIMESTAMP="" +package_revision=1.3337 + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# NLS nuisances: We save the old values to restore during execute mode. +lt_user_locale= +lt_safe_locale= +for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test \"\${$lt_var+set}\" = set; then + save_$lt_var=\$$lt_var + $lt_var=C + export $lt_var + lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" + lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" + fi" +done +LC_ALL=C +LANGUAGE=C +export LANGUAGE LC_ALL + +$lt_unset CDPATH + + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + + + +: ${CP="cp -f"} +test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} +: ${Xsed="$SED -e 1s/^X//"} + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +exit_status=$EXIT_SUCCESS + +# Make sure IFS has a sensible default +lt_nl=' +' +IFS=" $lt_nl" + +dirname="s,/[^/]*$,," +basename="s,^.*/,," + +# func_dirname file append nondir_replacement +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +func_dirname () +{ + func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi +} # func_dirname may be replaced by extended shell implementation + + +# func_basename file +func_basename () +{ + func_basename_result=`$ECHO "${1}" | $SED "$basename"` +} # func_basename may be replaced by extended shell implementation + + +# func_dirname_and_basename file append nondir_replacement +# perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# Implementation must be kept synchronized with func_dirname +# and func_basename. For efficiency, we do not delegate to +# those functions but instead duplicate the functionality here. +func_dirname_and_basename () +{ + # Extract subdirectory from the argument. + func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` + if test "X$func_dirname_result" = "X${1}"; then + func_dirname_result="${3}" + else + func_dirname_result="$func_dirname_result${2}" + fi + func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` +} # func_dirname_and_basename may be replaced by extended shell implementation + + +# func_stripname prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# func_strip_suffix prefix name +func_stripname () +{ + case ${2} in + .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; + *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; + esac +} # func_stripname may be replaced by extended shell implementation + + +# These SED scripts presuppose an absolute path with a trailing slash. +pathcar='s,^/\([^/]*\).*$,\1,' +pathcdr='s,^/[^/]*,,' +removedotparts=':dotsl + s@/\./@/@g + t dotsl + s,/\.$,/,' +collapseslashes='s@/\{1,\}@/@g' +finalslash='s,/*$,/,' + +# func_normal_abspath PATH +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +# value returned in "$func_normal_abspath_result" +func_normal_abspath () +{ + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` + while :; do + # Processed it all yet? + if test "$func_normal_abspath_tpath" = / ; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result" ; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + +# func_relative_path SRCDIR DSTDIR +# generates a relative path from SRCDIR to DSTDIR, with a trailing +# slash if non-empty, suitable for immediately appending a filename +# without needing to append a separator. +# value returned in "$func_relative_path_result" +func_relative_path () +{ + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=${func_dirname_result} + if test "x$func_relative_path_tlibdir" = x ; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test "x$func_stripname_result" != x ; then + func_relative_path_result=${func_relative_path_result}/${func_stripname_result} + fi + + # Normalisation. If bindir is libdir, return empty string, + # else relative path ending with a slash; either way, target + # file name can be directly appended. + if test ! -z "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result/" + func_relative_path_result=$func_stripname_result + fi +} + +# The name of this program: +func_dirname_and_basename "$progpath" +progname=$func_basename_result + +# Make sure we have an absolute path for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=$func_dirname_result + progdir=`cd "$progdir" && pwd` + progpath="$progdir/$progname" + ;; + *) + save_IFS="$IFS" + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS="$save_IFS" + test -x "$progdir/$progname" && break + done + IFS="$save_IFS" + test -n "$progdir" || progdir=`pwd` + progpath="$progdir/$progname" + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed="${SED}"' -e 1s/^X//' +sed_quote_subst='s/\([`"$\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' + +# Sed substitution that converts a w32 file name or path +# which contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-`\' parameter expansions in output of double_quote_subst that were +# `\'-ed in input to the same. If an odd number of `\' preceded a '$' +# in input to double_quote_subst, that '$' was protected from expansion. +# Since each input `\' is now two `\'s, look for any number of runs of +# four `\'s followed by two `\'s and then a '$'. `\' that '$'. +bs='\\' +bs2='\\\\' +bs4='\\\\\\\\' +dollar='\$' +sed_double_backslash="\ + s/$bs4/&\\ +/g + s/^$bs2$dollar/$bs&/ + s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g + s/\n//g" + +# Standard options: +opt_dry_run=false +opt_help=false +opt_quiet=false +opt_verbose=false +opt_warning=: + +# func_echo arg... +# Echo program name prefixed message, along with the current mode +# name if it has been set yet. +func_echo () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }$*" +} + +# func_verbose arg... +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $opt_verbose && func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +# func_error arg... +# Echo program name prefixed message to standard error. +func_error () +{ + $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 +} + +# func_warning arg... +# Echo program name prefixed warning message to standard error. +func_warning () +{ + $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 + + # bash bug again: + : +} + +# func_fatal_error arg... +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + +# func_fatal_help arg... +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + func_error ${1+"$@"} + func_fatal_error "$help" +} +help="Try \`$progname --help' for more information." ## default + + +# func_grep expression filename +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_mkdir_p directory-path +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + my_directory_path="$1" + my_dir_list= + + if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then + + # Protect directory names starting with `-' + case $my_directory_path in + -*) my_directory_path="./$my_directory_path" ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$my_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + my_dir_list="$my_directory_path:$my_dir_list" + + # If the last portion added has no slash in it, the list is done + case $my_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` + done + my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` + + save_mkdir_p_IFS="$IFS"; IFS=':' + for my_dir in $my_dir_list; do + IFS="$save_mkdir_p_IFS" + # mkdir can fail with a `File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$my_dir" 2>/dev/null || : + done + IFS="$save_mkdir_p_IFS" + + # Bail out if we (or some other process) failed to create a directory. + test -d "$my_directory_path" || \ + func_fatal_error "Failed to create \`$1'" + fi +} + + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$opt_dry_run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || \ + func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + fi + + $ECHO "$my_tmpdir" +} + + +# func_quote_for_eval arg +# Aesthetically quote ARG to be evaled later. +# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT +# is double-quoted, suitable for a subsequent eval, whereas +# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters +# which are still active within double quotes backslashified. +func_quote_for_eval () +{ + case $1 in + *[\\\`\"\$]*) + func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; + *) + func_quote_for_eval_unquoted_result="$1" ;; + esac + + case $func_quote_for_eval_unquoted_result in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and and variable + # expansion for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" + ;; + *) + func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" + esac +} + + +# func_quote_for_expand arg +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + case $1 in + *[\\\`\"]*) + my_arg=`$ECHO "$1" | $SED \ + -e "$double_quote_subst" -e "$sed_double_backslash"` ;; + *) + my_arg="$1" ;; + esac + + case $my_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + my_arg="\"$my_arg\"" + ;; + esac + + func_quote_for_expand_result="$my_arg" +} + + +# func_show_eval cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$my_cmd" + my_status=$? + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + + +# func_show_eval_locale cmd [fail_exp] +# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + my_cmd="$1" + my_fail_exp="${2-:}" + + ${opt_silent-false} || { + func_quote_for_expand "$my_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + if ${opt_dry_run-false}; then :; else + eval "$lt_user_locale + $my_cmd" + my_status=$? + eval "$lt_safe_locale" + if test "$my_status" -eq 0; then :; else + eval "(exit $my_status); $my_fail_exp" + fi + fi +} + +# func_tr_sh +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_version +# Echo version message to standard output and exit. +func_version () +{ + $opt_debug + + $SED -n '/(C)/!b go + :more + /\./!{ + N + s/\n# / / + b more + } + :go + /^# '$PROGRAM' (GNU /,/# warranty; / { + s/^# // + s/^# *$// + s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ + p + }' < "$progpath" + exit $? +} + +# func_usage +# Echo short help message to standard output and exit. +func_usage () +{ + $opt_debug + + $SED -n '/^# Usage:/,/^# *.*--help/ { + s/^# // + s/^# *$// + s/\$progname/'$progname'/ + p + }' < "$progpath" + echo + $ECHO "run \`$progname --help | more' for full usage" + exit $? +} + +# func_help [NOEXIT] +# Echo long help message to standard output and exit, +# unless 'noexit' is passed as argument. +func_help () +{ + $opt_debug + + $SED -n '/^# Usage:/,/# Report bugs to/ { + :print + s/^# // + s/^# *$// + s*\$progname*'$progname'* + s*\$host*'"$host"'* + s*\$SHELL*'"$SHELL"'* + s*\$LTCC*'"$LTCC"'* + s*\$LTCFLAGS*'"$LTCFLAGS"'* + s*\$LD*'"$LD"'* + s/\$with_gnu_ld/'"$with_gnu_ld"'/ + s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ + s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ + p + d + } + /^# .* home page:/b print + /^# General help using/b print + ' < "$progpath" + ret=$? + if test -z "$1"; then + exit $ret + fi +} + +# func_missing_arg argname +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $opt_debug + + func_error "missing argument for $1." + exit_cmd=exit +} + + +# func_split_short_opt shortopt +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +func_split_short_opt () +{ + my_sed_short_opt='1s/^\(..\).*$/\1/;q' + my_sed_short_rest='1s/^..\(.*\)$/\1/;q' + + func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` + func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` +} # func_split_short_opt may be replaced by extended shell implementation + + +# func_split_long_opt longopt +# Set func_split_long_opt_name and func_split_long_opt_arg shell +# variables after splitting LONGOPT at the `=' sign. +func_split_long_opt () +{ + my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' + my_sed_long_arg='1s/^--[^=]*=//' + + func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` + func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` +} # func_split_long_opt may be replaced by extended shell implementation + +exit_cmd=: + + + + + +magic="%%%MAGIC variable%%%" +magic_exe="%%%MAGIC EXE variable%%%" + +# Global variables. +nonopt= +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + +# func_append var value +# Append VALUE to the end of shell variable VAR. +func_append () +{ + eval "${1}=\$${1}\${2}" +} # func_append may be replaced by extended shell implementation + +# func_append_quoted var value +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +func_append_quoted () +{ + func_quote_for_eval "${2}" + eval "${1}=\$${1}\\ \$func_quote_for_eval_result" +} # func_append_quoted may be replaced by extended shell implementation + + +# func_arith arithmetic-term... +func_arith () +{ + func_arith_result=`expr "${@}"` +} # func_arith may be replaced by extended shell implementation + + +# func_len string +# STRING may not start with a hyphen. +func_len () +{ + func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` +} # func_len may be replaced by extended shell implementation + + +# func_lo2o object +func_lo2o () +{ + func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` +} # func_lo2o may be replaced by extended shell implementation + + +# func_xform libobj-or-source +func_xform () +{ + func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` +} # func_xform may be replaced by extended shell implementation + + +# func_fatal_configuration arg... +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func_error ${1+"$@"} + func_error "See the $PACKAGE documentation for more information." + func_fatal_error "Fatal configuration error." +} + + +# func_config +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + +# func_features +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + +# func_enable_tag tagname +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname="$1" + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf="/$re_begincf/,/$re_endcf/p" + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + +# func_check_version_match +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# Shorthand for --mode=foo, only valid as the first argument +case $1 in +clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; +compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; +execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; +finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; +install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; +link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; +uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; +esac + + + +# Option defaults: +opt_debug=: +opt_dry_run=false +opt_config=false +opt_preserve_dup_deps=false +opt_features=false +opt_finish=false +opt_help=false +opt_help_all=false +opt_silent=: +opt_warning=: +opt_verbose=: +opt_silent=false +opt_verbose=false + + +# Parse options once, thoroughly. This comes as soon as possible in the +# script to make things like `--version' happen as quickly as we can. +{ + # this just eases exit handling + while test $# -gt 0; do + opt="$1" + shift + case $opt in + --debug|-x) opt_debug='set -x' + func_echo "enabling shell trace mode" + $opt_debug + ;; + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + --config) + opt_config=: +func_config + ;; + --dlopen|-dlopen) + optarg="$1" + opt_dlopen="${opt_dlopen+$opt_dlopen +}$optarg" + shift + ;; + --preserve-dup-deps) + opt_preserve_dup_deps=: + ;; + --features) + opt_features=: +func_features + ;; + --finish) + opt_finish=: +set dummy --mode finish ${1+"$@"}; shift + ;; + --help) + opt_help=: + ;; + --help-all) + opt_help_all=: +opt_help=': help-all' + ;; + --mode) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_mode="$optarg" +case $optarg in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $opt" + exit_cmd=exit + break + ;; +esac + shift + ;; + --no-silent|--no-quiet) + opt_silent=false +func_append preserve_args " $opt" + ;; + --no-warning|--no-warn) + opt_warning=false +func_append preserve_args " $opt" + ;; + --no-verbose) + opt_verbose=false +func_append preserve_args " $opt" + ;; + --silent|--quiet) + opt_silent=: +func_append preserve_args " $opt" + opt_verbose=false + ;; + --verbose|-v) + opt_verbose=: +func_append preserve_args " $opt" +opt_silent=false + ;; + --tag) + test $# = 0 && func_missing_arg $opt && break + optarg="$1" + opt_tag="$optarg" +func_append preserve_args " $opt $optarg" +func_enable_tag "$optarg" + shift + ;; + + -\?|-h) func_usage ;; + --help) func_help ;; + --version) func_version ;; + + # Separate optargs to long options: + --*=*) + func_split_long_opt "$opt" + set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-n*|-v*) + func_split_short_opt "$opt" + set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognized option \`$opt'" ;; + *) set dummy "$opt" ${1+"$@"}; shift; break ;; + esac + done + + # Validate options: + + # save first non-option argument + if test "$#" -gt 0; then + nonopt="$opt" + shift + fi + + # preserve --debug + test "$opt_debug" = : || func_append preserve_args " --debug" + + case $host in + *cygwin* | *mingw* | *pw32* | *cegcc*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then + func_fatal_configuration "not configured to build any kind of library" + fi + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test "$opt_mode" != execute; then + func_error "unrecognized option \`-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$progname --help --mode=$opt_mode' for more information." + } + + + # Bail if the options were screwed + $exit_cmd $EXIT_FAILURE +} + + + + +## ----------- ## +## Main. ## +## ----------- ## + +# func_lalib_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null \ + | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool `.la' library or `.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if `file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case "$lalib_p_line" in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test "$lalib_p" = yes +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + func_lalib_p "$1" +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $opt_debug + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$save_ifs + eval cmd=\"$cmd\" + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# `FILE.' does not work on cygwin managed mounts. +func_source () +{ + $opt_debug + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case "$lt_sysroot:$1" in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result="=$func_stripname_result" + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $opt_debug + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with \`--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=${1} + if test "$build_libtool_libs" = yes; then + write_lobj=\'${2}\' + else + write_lobj=none + fi + + if test "$build_old_libs" = yes; then + write_oldobj=\'${3}\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$lt_sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $opt_debug + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result="" + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result" ; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $opt_debug + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $opt_debug + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $opt_debug + if test -z "$2" && test -n "$1" ; then + func_error "Could not determine host file name corresponding to" + func_error " \`$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result="$1" + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $opt_debug + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " \`$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result="$3" + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $opt_debug + case $4 in + $1 ) func_to_host_path_result="$3$func_to_host_path_result" + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via `$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $opt_debug + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $opt_debug + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result="$1" +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result="$func_convert_core_msys_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $opt_debug + func_to_host_file_result="$1" + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result="$func_cygpath_result" + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via `$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $opt_debug + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd="func_convert_path_${func_stripname_result}" + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $opt_debug + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result="$1" +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_msys_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $opt_debug + func_to_host_path_result="$1" + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result="$func_cygpath_result" + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_mode_compile arg... +func_mode_compile () +{ + $opt_debug + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg="$arg" + arg_mode=normal + ;; + + target ) + libobj="$arg" + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify \`-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + func_append_quoted lastarg "$arg" + done + IFS="$save_ifs" + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg="$srcfile" + srcfile="$arg" + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with \`-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj="$func_basename_result" + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from \`$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name \`$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname="$func_basename_result" + xdir="$func_dirname_result" + lobj=${xdir}$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test "$compiler_c_o" = no; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test "$suppress_opt" = yes; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test "$compiler_c_o" = yes; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test "$need_locks" = warn && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test "$opt_mode" = compile && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a \`.o' file suitable for static linking + -static only build a \`.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode \`$opt_mode'" + ;; + esac + + echo + $ECHO "Try \`$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test "$opt_help" = :; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | sed -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + sed '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $opt_debug + # The first argument is the command name. + cmd="$nonopt" + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "\`$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "\`$file' was not linked with \`-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir="$func_dirname_result" + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir="$func_dirname_result" + ;; + + *) + func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file="$progdir/$program" + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if test "X$opt_dry_run" = Xfalse; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = execute && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $opt_debug + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "\`$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument \`$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and \`=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_silent && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the \`-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the \`$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the \`$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the \`$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test "$opt_mode" = finish && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $opt_debug + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac; then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test "x$prev" = x-m && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the \`$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir="$func_dirname_result" + destname="$func_basename_result" + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "\`$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "\`$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "\`$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir="$func_dirname_result" + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking \`$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname="$1" + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme="$stripme" + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme="" + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name="$func_basename_result" + instname="$dir/$name"i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to \`$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + func_basename "$file" + destfile="$func_basename_result" + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script \`$wrapper'" + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "\`$lib' has not been installed in \`$libdir'" + finalize=no + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + $opt_dry_run || { + if test "$finalize" = yes; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file="$func_basename_result" + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_silent || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink \`$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file="$outputname" + else + func_warning "cannot relink \`$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name="$func_basename_result" + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run \`$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test "$opt_mode" = install && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $opt_debug + my_outputname="$1" + my_originator="$2" + my_pic_p="${3-no}" + my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms="${my_outputname}S.c" + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${my_outputname}.nm" + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) +/* DATA imports from DLLs on WIN32 con't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined(__osf__) +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + func_verbose "generating symbol list for \`$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $opt_dry_run || { + $RM $export_symbols + eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from \`$dlprefile'" + func_basename "$dlprefile" + name="$func_basename_result" + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename="" + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname" ; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename="$func_basename_result" + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename" ; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[]; +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{\ + { \"$my_originator\", (void *) 0 }," + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + if test "X$my_pic_p" != Xno; then + pic_flag_for_symtable=" $pic_flag" + fi + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' + + # Transform the symbol file into the correct name. + symfileobj="$output_objdir/${my_outputname}S.$objext" + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for \`$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $opt_debug + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $opt_debug + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $opt_debug + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive which possess that section. Heuristic: eliminate + # all those which have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $opt_debug + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $opt_debug + if func_cygming_gnu_implib_p "$1" ; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1" ; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result="" + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $opt_debug + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + if test "$lock_old_archive_extraction" = yes; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test "$lock_old_archive_extraction" = yes; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $opt_debug + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib="$func_basename_result" + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`basename "$darwin_archive"` + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result="$my_oldobjs" +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory in which it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ which is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options which match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +/* declarations of non-ANSI functions */ +#if defined(__MINGW32__) +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined(__CYGWIN__) +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined (other platforms) ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined(_MSC_VER) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +# ifndef _INTPTR_T_DEFINED +# define _INTPTR_T_DEFINED +# define intptr_t int +# endif +#elif defined(__MINGW32__) +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined(__CYGWIN__) +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined (other platforms) ... */ +#endif + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +#if defined(LT_DEBUGWRAPPER) +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp (str, pat) == 0) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + int len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + int orig_value_len = strlen (orig_value); + int add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + int len = strlen (new_value); + while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[len-1] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $opt_debug + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $opt_debug + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module="${wl}-single_module" + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test "$build_libtool_libs" != yes && \ + func_fatal_configuration "can not build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg="$1" + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir="$arg" + prev= + continue + ;; + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + test -f "$arg" \ + || func_fatal_error "symbol file \`$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file \`$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg="$arg" + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "\`-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between \`-L' and \`$1'" + else + func_fatal_error "need path for \`-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of \`$dir'" + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "\`-no-install' is ignored for $host" + func_warning "assuming \`-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS="$save_ifs" + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-flto*|-fwhopr*|-fuse-linker-plugin) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test "$pic_object" = none && + test "$non_pic_object" = none; then + func_fatal_error "cannot find name of object for \`$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir="$func_dirname_result" + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "\`$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg="$func_quote_for_eval_result" + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the \`$prevarg' option requires an argument" + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname="$func_basename_result" + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + func_dirname "$output" "/" "" + output_objdir="$func_dirname_result$objdir" + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps ; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test "$linkmode" = lib; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test "$linkmode,$pass" = "lib,link"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs="$tmp_deplibs" + fi + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) + libs="$deplibs %DEPLIBS%" + test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" + ;; + esac + fi + if test "$linkmode,$pass" = "lib,dlpreopen"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs="$dlprefiles" + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + func_warning "\`-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test "$linkmode" = lib; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib="$searchdir/lib${name}${search_ext}" + if test -f "$lib"; then + if test "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + *.ltframework) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test "$linkmode" = lib ; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "\`-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + else + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + ;; + esac + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + + if test "$found" = yes || test -f "$lib"; then : + else + func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + fi + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "\`$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir="$func_dirname_result" + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + func_fatal_error "\`$lib' is not a convenience library" + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test "$prefer_static_libs" = yes || + test "$prefer_static_libs,$installed" = "built,no"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib="$l" + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for \`$lib'" + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of \`$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir="$ladir" + fi + ;; + esac + func_basename "$lib" + laname="$func_basename_result" + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library \`$lib' was moved." + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$lt_sysroot$libdir" + absdir="$lt_sysroot$libdir" + fi + test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir="$ladir" + absdir="$abs_ladir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir" && test "$linkmode" = prog; then + func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + fi + case "$host" in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test "$linkmode" = prog && test "$pass" != link; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath:" in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test "$use_static_libs" = built && test "$installed" = yes; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test "$installed" = no; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule="" + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule="$dlpremoduletest" + break + fi + done + if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then + echo + if test "$linkmode" = prog; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname="$1" + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname="$dlname" + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc*) + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + func_basename "$soroot" + soname="$func_basename_result" + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from \`$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for \`$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test "$linkmode" = prog || test "$opt_mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + case $host in + *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; + *-*-sysv4*uw2*) add_dir="-L$dir" ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir="-L$dir" ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we can not + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null ; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + elif test -n "$old_library"; then + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$absdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test "$hardcode_direct" != yes && + test "$hardcode_minus_L" != yes && + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$opt_mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes && + test "$hardcode_direct_absolute" = no; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib" ; then + add="$inst_prefix_dir$libdir/$linklib" + else + add="$libdir/$linklib" + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test "$linkmode" = prog; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system can not link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps ; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path="$deplib" ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of \`$dir'" + absdir="$dir" + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl" ; then + depdepl="$absdir/$objdir/$depdepl" + darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" + func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" + path= + fi + fi + ;; + *) + path="-L$absdir/$objdir" + ;; + esac + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "\`$deplib' seems to be moved" + + path="-L$absdir" + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test "$pass" = link; then + if test "$linkmode" = "prog"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs ; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i="" + ;; + esac + if test -n "$i" ; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + fi + if test "$linkmode" = prog || test "$linkmode" = lib; then + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "\`-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "\`-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test "$module" = no && \ + func_fatal_help "libtool library \`$output' must begin with \`lib'" + + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test "$dlself" != no && \ + func_warning "\`-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test "$#" -gt 1 && \ + func_warning "ignoring multiple \`-rpath's for a libtool library" + + install_libdir="$1" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # Some compilers have problems with a `.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "\`-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + shift + IFS="$save_ifs" + + test -n "$7" && \ + func_fatal_help "too many parameters to \`-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major="$1" + number_minor="$2" + number_revision="$3" + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # which has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|qnx|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + *) + func_fatal_configuration "$modename: unknown library version type \`$version_type'" + ;; + esac + ;; + no) + current="$1" + revision="$2" + age="$3" + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT \`$current' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION \`$revision' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE \`$age' must be a nonnegative integer" + func_fatal_error "\`$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE \`$age' is greater than the current interface number \`$current'" + func_fatal_error "\`$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current" + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring="$verstring_prefix$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test "$loop" -ne 0; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix="$major.$age.$revision" + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + func_append verstring ":${current}.0" + ;; + + qnx) + major=".$current" + versuffix=".$current" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + func_arith $current - $age + major=$func_arith_result + versuffix="-$major" + ;; + + *) + func_fatal_configuration "unknown library version type \`$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring="0.0" + ;; + esac + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + func_warning "undefined symbols not allowed in $host shared libraries" + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + + fi + + func_generate_dlsyms "$libname" "$libname" "yes" + func_append libobjs " $symfileobj" + test "X$libobjs" = "X " && libobjs= + + if test "$opt_mode" != relink; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles="$dlfiles" + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles="$dlprefiles" + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test "$build_libtool_need_lc" = "yes"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release="" + versuffix="" + major="" + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib="" + ;; + esac + fi + if test -n "$a_deplib" ; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib="$potent_lib" # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs="$new_libs" + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + # Remove ${wl} instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath="$finalize_shlibpath" + test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname="$1" + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib="$output_objdir/$realname" + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols="$output_objdir/$libname.uexp" + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols="$export_symbols" + export_symbols= + always_export_symbols=yes + fi + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd1 in $cmds; do + IFS="$save_ifs" + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test "$try_normal_branch" = yes \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=${output_objdir}/${output_la}.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS="$save_ifs" + if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test "$compiler_needs_object" = yes && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test "X$skipped_export" != "X:" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then + output=${output_objdir}/${output_la}.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then + output=${output_objdir}/${output_la}.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test "$compiler_needs_object" = yes; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-${k}.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test "X$objlist" = X || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-${k}.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\${concat_cmds}$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + if ${skipped_export-false}; then + func_verbose "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + fi + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do + IFS="$save_ifs" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + if ${skipped_export-false}; then + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols="$export_symbols" + test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + fi + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && test -n "$module_cmds" ; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $opt_silent || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$opt_mode" = relink; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + func_warning "\`-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "\`-l' and \`-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "\`-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "\`-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "\`-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object \`$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "\`-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "\`-release' is ignored for programs" + + test "$preload" = yes \ + && test "$dlopen_support" = unknown \ + && test "$dlopen_self" = unknown \ + && test "$dlopen_self_static" = unknown && \ + func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test "$tagname" = CXX ; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " ${wl}-bind_at_load" + func_append finalize_command " ${wl}-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath="$rpath" + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" "no" + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=yes + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=no + ;; + *cygwin* | *mingw* ) + if test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + *) + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + wrappers_required=no + fi + ;; + esac + if test "$wrappers_required" = no; then + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.${objext}"; then + func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + fi + + exit $exit_status + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; then + # We don't need to create a wrapper script. + link_command="$compile_var$compile_command$compile_rpath" + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "\`$output' will be relinked during installation" + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host" ; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save $symfileobj" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + if test "$preload" = yes && test -f "$symfileobj"; then + func_append oldobjs " $symfileobj" + fi + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop="$output_objdir/${outputname}x" + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase="$func_basename_result" + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj" ; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name="$func_basename_result" + func_resolve_sysroot "$deplib" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "\`$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name="$func_basename_result" + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "\`$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles="$newdlprefiles" + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test "x$bindir" != x ; + then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test "$need_relink" = yes; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +{ test "$opt_mode" = link || test "$opt_mode" = relink; } && + func_mode_link ${1+"$@"} + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $opt_debug + RM="$nonopt" + files= + rmforce= + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=yes ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir="$func_dirname_result" + if test "X$dir" = X.; then + odir="$objdir" + else + odir="$dir/$objdir" + fi + func_basename "$file" + name="$func_basename_result" + test "$opt_mode" = uninstall && odir="$dir" + + # Remember odir for removal later, being careful to avoid duplicates + if test "$opt_mode" = clean; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case "$opt_mode" in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && + test "$pic_object" != none; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && + test "$non_pic_object" != none; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$opt_mode" = clean ; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + func_append rmfiles " $odir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && + func_mode_uninstall ${1+"$@"} + +test -z "$opt_mode" && { + help="$generic_help" + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode \`$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# in which we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# vi:sw=2 + diff --git a/smack/smack/src/main/cpp/gloox/missing b/smack/smack/src/main/cpp/gloox/missing new file mode 100644 index 00000000..86a8fc31 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/missing @@ -0,0 +1,331 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2012-01-06.13; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG=\${$#} + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/smack/smack/src/main/cpp/gloox/src/Makefile.am b/smack/smack/src/main/cpp/gloox/src/Makefile.am new file mode 100644 index 00000000..2a648fdb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/Makefile.am @@ -0,0 +1,130 @@ +## +## Process this file with automake to produce Makefile.in +## + +SUBDIRS = . $(MAYBE_TESTS) $(MAYBE_EXAMPLES) +DIST_SUBDIRS = . tests examples + +AM_CPPFLAGS = -Wall -pedantic -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith \ + -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual \ + -Wwrite-strings -Wformat-security -Wmissing-format-attribute -Wno-long-long + +lib_LTLIBRARIES = libgloox.la + +libgloox_la_SOURCES = jid.cpp parser.cpp connectiontcpclient.cpp clientbase.cpp tag.cpp stanza.cpp logsink.cpp \ + dns.cpp prep.cpp base64.cpp client.cpp component.cpp \ + disco.cpp adhoc.cpp privatexml.cpp registration.cpp \ + nonsaslauth.cpp rosteritem.cpp rostermanager.cpp privacyitem.cpp \ + bookmarkstorage.cpp annotations.cpp privacymanager.cpp lastactivity.cpp \ + flexoff.cpp dataform.cpp dataformfield.cpp dataformfieldcontainer.cpp \ + messagesession.cpp messageeventfilter.cpp chatstatefilter.cpp gloox.cpp \ + inbandbytestream.cpp messagefilter.cpp vcard.cpp \ + vcardmanager.cpp md5.cpp sha.cpp search.cpp dataformreported.cpp dataformitem.cpp \ + mucroom.cpp mucmessagesession.cpp oob.cpp vcardupdate.cpp stanzaextensionfactory.cpp \ + mucinvitationhandler.cpp delayeddelivery.cpp gpgencrypted.cpp gpgsigned.cpp \ + uniquemucroom.cpp instantmucroom.cpp compressionzlib.cpp tlsgnutlsclient.cpp \ + connectionhttpproxy.cpp tlsgnutlsserveranon.cpp tlsgnutlsbase.cpp \ + tlsgnutlsclientanon.cpp tlsschannel.cpp tlsdefault.cpp simanager.cpp siprofileft.cpp \ + mutex.cpp connectionsocks5proxy.cpp socks5bytestreammanager.cpp socks5bytestream.cpp \ + connectiontcpbase.cpp connectiontcpserver.cpp socks5bytestreamserver.cpp amp.cpp \ + pubsubitem.cpp pubsubmanager.cpp \ + error.cpp util.cpp iq.cpp message.cpp presence.cpp \ + subscription.cpp capabilities.cpp chatstate.cpp connectionbosh.cpp connectiontls.cpp \ + messageevent.cpp receipt.cpp nickname.cpp eventdispatcher.cpp \ + pubsubevent.cpp xhtmlim.cpp featureneg.cpp \ + shim.cpp softwareversion.cpp attention.cpp \ + tlsopensslclient.cpp tlsopensslbase.cpp \ + tlsopensslserver.cpp compressiondefault.cpp \ + connectiontlsserver.cpp atomicrefcount.cpp linklocalmanager.cpp linklocalclient.cpp \ + forward.cpp jinglesession.cpp jinglecontent.cpp jinglesessionmanager.cpp \ + carbons.cpp jinglepluginfactory.cpp jingleiceudp.cpp jinglefiletransfer.cpp \ + iodata.cpp + +libgloox_la_LDFLAGS = -version-info 13:0:0 -no-undefined -no-allow-shlib-undefined +libgloox_la_LIBADD = +libgloox_la_CFLAGS = $(CPPFLAGS) + +libglooxincludedir = $(includedir)/gloox +libglooxinclude_HEADERS = adhoccommandprovider.h privacymanager.h tag.h \ + adhoc.h attention.h iqhandler.h privatexml.h \ + annotations.h client.h privatexmlhandler.h \ + annotationshandler.h component.h registration.h \ + bookmarkhandler.h registrationhandler.h jid.h \ + bookmarkstorage.h messagehandler.h rosteritem.h \ + clientbase.h rosterlistener.h taghandler.h \ + connectionlistener.h rostermanager.h gloox.h \ + glooxversion.h \ + disco.h presencehandler.h subscriptionhandler.h \ + discohandler.h privacyitem.h stanza.h \ + disconodehandler.h privacylisthandler.h loghandler.h \ + lastactivity.h lastactivityhandler.h flexoff.h \ + flexoffhandler.h dataform.h dataformfield.h \ + dataformitem.h dataformfieldcontainer.h dataformreported.h \ + macros.h logsink.h messagesession.h \ + messageeventhandler.h messagesessionhandler.h chatstatehandler.h \ + chatstatefilter.h messageeventfilter.h inbandbytestream.h \ + messagefilter.h vcard.h \ + vcardmanager.h vcardhandler.h adhochandler.h \ + search.h searchhandler.h statisticshandler.h \ + resource.h mucroom.h mucroomhandler.h \ + mucroomconfighandler.h parser.h \ + mucinvitationhandler.h stanzaextension.h oob.h \ + vcardupdate.h delayeddelivery.h base64.h \ + gpgencrypted.h gpgsigned.h \ + md5.h sha.h uniquemucroom.h \ + instantmucroom.h tlsbase.h tlshandler.h \ + connectionbase.h connectiondatahandler.h compressiondatahandler.h \ + compressionbase.h connectiontcpclient.h connectionhttpproxy.h \ + tlsdefault.h simanager.h siprofilehandler.h \ + sihandler.h siprofileft.h siprofilefthandler.h \ + socks5bytestreammanager.h connectionsocks5proxy.h event.h \ + socks5bytestream.h socks5bytestreamserver.h \ + softwareversion.h \ + eventhandler.h \ + mutex.h mutexguard.h connectiontcpbase.h \ + connectiontcpserver.h amp.h pubsubmanager.h \ + iq.h pubsub.h \ + pubsubresulthandler.h error.h chatstate.h \ + connectionhandler.h \ + message.h presence.h subscription.h \ + bytestream.h bytestreamdatahandler.h bytestreamhandler.h \ + capabilities.h connectionbosh.h featureneg.h \ + connectiontls.h messageevent.h receipt.h \ + nickname.h pubsubevent.h xhtmlim.h \ + eventdispatcher.h \ + pubsubitem.h shim.h util.h \ + connectiontlsserver.h compressiondefault.h \ + atomicrefcount.h linklocalmanager.h linklocalhandler.h \ + linklocalclient.h linklocal.h forward.h \ + jinglesession.h jinglecontent.h jingleplugin.h \ + jinglesessionhandler.h \ + jinglesessionmanager.h carbons.h jinglepluginfactory.h \ + jingleiceudp.h jinglefiletransfer.h \ + iodata.h adhocplugin.h + +noinst_HEADERS = config.h prep.h dns.h nonsaslauth.h mucmessagesession.h stanzaextensionfactory.h \ + tlsgnutlsclient.h \ + tlsgnutlsbase.h tlsgnutlsclientanon.h tlsgnutlsserveranon.h tlsopensslbase.h tlsschannel.h \ + compressionzlib.h rosteritemdata.h tlsopensslclient.h \ + tlsopensslserver.h + +EXTRA_DIST = version.rc + +test: + make -C tests test + +check: test + +leaktest: + make -C tests leaktest + +leakcheck: leaktest + +includetest: + @for i in *.h; do \ + echo -e "#include \"$$i\"\nint main() {}" >tmp.cpp; \ + $(CXX) -I.. tmp.cpp 2>&1 | sed "s/^$$i://g" >$$i.test.log; \ + test -s $$i.test.log && echo "INC $$i: failed" || rm $$i.test.log; \ + done + @rm tmp.cpp + @ls *.h.test.log &>/dev/null || echo "INC all: ok" diff --git a/smack/smack/src/main/cpp/gloox/src/Makefile.in b/smack/smack/src/main/cpp/gloox/src/Makefile.in new file mode 100644 index 00000000..fb231e58 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/Makefile.in @@ -0,0 +1,1006 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src +DIST_COMMON = $(libglooxinclude_HEADERS) $(noinst_HEADERS) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +am__installdirs = "$(DESTDIR)$(libdir)" \ + "$(DESTDIR)$(libglooxincludedir)" +LTLIBRARIES = $(lib_LTLIBRARIES) +libgloox_la_DEPENDENCIES = +am_libgloox_la_OBJECTS = jid.lo parser.lo connectiontcpclient.lo \ + clientbase.lo tag.lo stanza.lo logsink.lo dns.lo prep.lo \ + base64.lo client.lo component.lo disco.lo adhoc.lo \ + privatexml.lo registration.lo nonsaslauth.lo rosteritem.lo \ + rostermanager.lo privacyitem.lo bookmarkstorage.lo \ + annotations.lo privacymanager.lo lastactivity.lo flexoff.lo \ + dataform.lo dataformfield.lo dataformfieldcontainer.lo \ + messagesession.lo messageeventfilter.lo chatstatefilter.lo \ + gloox.lo inbandbytestream.lo messagefilter.lo vcard.lo \ + vcardmanager.lo md5.lo sha.lo search.lo dataformreported.lo \ + dataformitem.lo mucroom.lo mucmessagesession.lo oob.lo \ + vcardupdate.lo stanzaextensionfactory.lo \ + mucinvitationhandler.lo delayeddelivery.lo gpgencrypted.lo \ + gpgsigned.lo uniquemucroom.lo instantmucroom.lo \ + compressionzlib.lo tlsgnutlsclient.lo connectionhttpproxy.lo \ + tlsgnutlsserveranon.lo tlsgnutlsbase.lo tlsgnutlsclientanon.lo \ + tlsschannel.lo tlsdefault.lo simanager.lo siprofileft.lo \ + mutex.lo connectionsocks5proxy.lo socks5bytestreammanager.lo \ + socks5bytestream.lo connectiontcpbase.lo \ + connectiontcpserver.lo socks5bytestreamserver.lo amp.lo \ + pubsubitem.lo pubsubmanager.lo error.lo util.lo iq.lo \ + message.lo presence.lo subscription.lo capabilities.lo \ + chatstate.lo connectionbosh.lo connectiontls.lo \ + messageevent.lo receipt.lo nickname.lo eventdispatcher.lo \ + pubsubevent.lo xhtmlim.lo featureneg.lo shim.lo \ + softwareversion.lo attention.lo tlsopensslclient.lo \ + tlsopensslbase.lo tlsopensslserver.lo compressiondefault.lo \ + connectiontlsserver.lo atomicrefcount.lo linklocalmanager.lo \ + linklocalclient.lo forward.lo jinglesession.lo \ + jinglecontent.lo jinglesessionmanager.lo carbons.lo \ + jinglepluginfactory.lo jingleiceudp.lo jinglefiletransfer.lo \ + iodata.lo +libgloox_la_OBJECTS = $(am_libgloox_la_OBJECTS) +libgloox_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ + $(CXXFLAGS) $(libgloox_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(libgloox_la_SOURCES) +DIST_SOURCES = $(libgloox_la_SOURCES) +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(libglooxinclude_HEADERS) $(noinst_HEADERS) +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = . $(MAYBE_TESTS) $(MAYBE_EXAMPLES) +DIST_SUBDIRS = . tests examples +AM_CPPFLAGS = -Wall -pedantic -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith \ + -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual \ + -Wwrite-strings -Wformat-security -Wmissing-format-attribute -Wno-long-long + +lib_LTLIBRARIES = libgloox.la +libgloox_la_SOURCES = jid.cpp parser.cpp connectiontcpclient.cpp clientbase.cpp tag.cpp stanza.cpp logsink.cpp \ + dns.cpp prep.cpp base64.cpp client.cpp component.cpp \ + disco.cpp adhoc.cpp privatexml.cpp registration.cpp \ + nonsaslauth.cpp rosteritem.cpp rostermanager.cpp privacyitem.cpp \ + bookmarkstorage.cpp annotations.cpp privacymanager.cpp lastactivity.cpp \ + flexoff.cpp dataform.cpp dataformfield.cpp dataformfieldcontainer.cpp \ + messagesession.cpp messageeventfilter.cpp chatstatefilter.cpp gloox.cpp \ + inbandbytestream.cpp messagefilter.cpp vcard.cpp \ + vcardmanager.cpp md5.cpp sha.cpp search.cpp dataformreported.cpp dataformitem.cpp \ + mucroom.cpp mucmessagesession.cpp oob.cpp vcardupdate.cpp stanzaextensionfactory.cpp \ + mucinvitationhandler.cpp delayeddelivery.cpp gpgencrypted.cpp gpgsigned.cpp \ + uniquemucroom.cpp instantmucroom.cpp compressionzlib.cpp tlsgnutlsclient.cpp \ + connectionhttpproxy.cpp tlsgnutlsserveranon.cpp tlsgnutlsbase.cpp \ + tlsgnutlsclientanon.cpp tlsschannel.cpp tlsdefault.cpp simanager.cpp siprofileft.cpp \ + mutex.cpp connectionsocks5proxy.cpp socks5bytestreammanager.cpp socks5bytestream.cpp \ + connectiontcpbase.cpp connectiontcpserver.cpp socks5bytestreamserver.cpp amp.cpp \ + pubsubitem.cpp pubsubmanager.cpp \ + error.cpp util.cpp iq.cpp message.cpp presence.cpp \ + subscription.cpp capabilities.cpp chatstate.cpp connectionbosh.cpp connectiontls.cpp \ + messageevent.cpp receipt.cpp nickname.cpp eventdispatcher.cpp \ + pubsubevent.cpp xhtmlim.cpp featureneg.cpp \ + shim.cpp softwareversion.cpp attention.cpp \ + tlsopensslclient.cpp tlsopensslbase.cpp \ + tlsopensslserver.cpp compressiondefault.cpp \ + connectiontlsserver.cpp atomicrefcount.cpp linklocalmanager.cpp linklocalclient.cpp \ + forward.cpp jinglesession.cpp jinglecontent.cpp jinglesessionmanager.cpp \ + carbons.cpp jinglepluginfactory.cpp jingleiceudp.cpp jinglefiletransfer.cpp \ + iodata.cpp + +libgloox_la_LDFLAGS = -version-info 13:0:0 -no-undefined -no-allow-shlib-undefined +libgloox_la_LIBADD = +libgloox_la_CFLAGS = $(CPPFLAGS) +libglooxincludedir = $(includedir)/gloox +libglooxinclude_HEADERS = adhoccommandprovider.h privacymanager.h tag.h \ + adhoc.h attention.h iqhandler.h privatexml.h \ + annotations.h client.h privatexmlhandler.h \ + annotationshandler.h component.h registration.h \ + bookmarkhandler.h registrationhandler.h jid.h \ + bookmarkstorage.h messagehandler.h rosteritem.h \ + clientbase.h rosterlistener.h taghandler.h \ + connectionlistener.h rostermanager.h gloox.h \ + glooxversion.h \ + disco.h presencehandler.h subscriptionhandler.h \ + discohandler.h privacyitem.h stanza.h \ + disconodehandler.h privacylisthandler.h loghandler.h \ + lastactivity.h lastactivityhandler.h flexoff.h \ + flexoffhandler.h dataform.h dataformfield.h \ + dataformitem.h dataformfieldcontainer.h dataformreported.h \ + macros.h logsink.h messagesession.h \ + messageeventhandler.h messagesessionhandler.h chatstatehandler.h \ + chatstatefilter.h messageeventfilter.h inbandbytestream.h \ + messagefilter.h vcard.h \ + vcardmanager.h vcardhandler.h adhochandler.h \ + search.h searchhandler.h statisticshandler.h \ + resource.h mucroom.h mucroomhandler.h \ + mucroomconfighandler.h parser.h \ + mucinvitationhandler.h stanzaextension.h oob.h \ + vcardupdate.h delayeddelivery.h base64.h \ + gpgencrypted.h gpgsigned.h \ + md5.h sha.h uniquemucroom.h \ + instantmucroom.h tlsbase.h tlshandler.h \ + connectionbase.h connectiondatahandler.h compressiondatahandler.h \ + compressionbase.h connectiontcpclient.h connectionhttpproxy.h \ + tlsdefault.h simanager.h siprofilehandler.h \ + sihandler.h siprofileft.h siprofilefthandler.h \ + socks5bytestreammanager.h connectionsocks5proxy.h event.h \ + socks5bytestream.h socks5bytestreamserver.h \ + softwareversion.h \ + eventhandler.h \ + mutex.h mutexguard.h connectiontcpbase.h \ + connectiontcpserver.h amp.h pubsubmanager.h \ + iq.h pubsub.h \ + pubsubresulthandler.h error.h chatstate.h \ + connectionhandler.h \ + message.h presence.h subscription.h \ + bytestream.h bytestreamdatahandler.h bytestreamhandler.h \ + capabilities.h connectionbosh.h featureneg.h \ + connectiontls.h messageevent.h receipt.h \ + nickname.h pubsubevent.h xhtmlim.h \ + eventdispatcher.h \ + pubsubitem.h shim.h util.h \ + connectiontlsserver.h compressiondefault.h \ + atomicrefcount.h linklocalmanager.h linklocalhandler.h \ + linklocalclient.h linklocal.h forward.h \ + jinglesession.h jinglecontent.h jingleplugin.h \ + jinglesessionhandler.h \ + jinglesessionmanager.h carbons.h jinglepluginfactory.h \ + jingleiceudp.h jinglefiletransfer.h \ + iodata.h adhocplugin.h + +noinst_HEADERS = config.h prep.h dns.h nonsaslauth.h mucmessagesession.h stanzaextensionfactory.h \ + tlsgnutlsclient.h \ + tlsgnutlsbase.h tlsgnutlsclientanon.h tlsgnutlsserveranon.h tlsopensslbase.h tlsschannel.h \ + compressionzlib.h rosteritemdata.h tlsopensslclient.h \ + tlsopensslserver.h + +EXTRA_DIST = version.rc +all: all-recursive + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-libLTLIBRARIES: $(lib_LTLIBRARIES) + @$(NORMAL_INSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + list2=; for p in $$list; do \ + if test -f $$p; then \ + list2="$$list2 $$p"; \ + else :; fi; \ + done; \ + test -z "$$list2" || { \ + echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ + } + +uninstall-libLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ + for p in $$list; do \ + $(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ + done + +clean-libLTLIBRARIES: + -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) + @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libgloox.la: $(libgloox_la_OBJECTS) $(libgloox_la_DEPENDENCIES) $(EXTRA_libgloox_la_DEPENDENCIES) + $(libgloox_la_LINK) -rpath $(libdir) $(libgloox_la_OBJECTS) $(libgloox_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adhoc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/annotations.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atomicrefcount.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/attention.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bookmarkstorage.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/capabilities.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/carbons.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatstate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatstatefilter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clientbase.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/component.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compressiondefault.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compressionzlib.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectionbosh.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectionhttpproxy.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectionsocks5proxy.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectiontcpbase.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectiontcpclient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectiontcpserver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectiontls.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectiontlsserver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataform.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformfield.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformfieldcontainer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformitem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformreported.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delayeddelivery.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disco.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dns.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eventdispatcher.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/featureneg.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flexoff.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forward.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gloox.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgencrypted.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsigned.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inbandbytestream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/instantmucroom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iodata.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iq.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglecontent.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglefiletransfer.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jingleiceudp.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglepluginfactory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglesession.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglesessionmanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lastactivity.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linklocalclient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linklocalmanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/logsink.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/messageevent.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/messageeventfilter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/messagefilter.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/messagesession.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mucinvitationhandler.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mucmessagesession.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mucroom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mutex.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nickname.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsaslauth.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oob.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prep.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/presence.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privacyitem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privacymanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privatexml.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubsubevent.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubsubitem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubsubmanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/receipt.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/registration.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rosteritem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rostermanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shim.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/siprofileft.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socks5bytestream.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socks5bytestreammanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/socks5bytestreamserver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/softwareversion.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stanza.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stanzaextensionfactory.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subscription.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsdefault.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsgnutlsbase.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsgnutlsclient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsgnutlsclientanon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsgnutlsserveranon.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsopensslbase.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsopensslclient.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsopensslserver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tlsschannel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniquemucroom.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcard.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcardmanager.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcardupdate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xhtmlim.Plo@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs +install-libglooxincludeHEADERS: $(libglooxinclude_HEADERS) + @$(NORMAL_INSTALL) + @list='$(libglooxinclude_HEADERS)'; test -n "$(libglooxincludedir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(libglooxincludedir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(libglooxincludedir)" || exit 1; \ + fi; \ + for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; \ + done | $(am__base_list) | \ + while read files; do \ + echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libglooxincludedir)'"; \ + $(INSTALL_HEADER) $$files "$(DESTDIR)$(libglooxincludedir)" || exit $$?; \ + done + +uninstall-libglooxincludeHEADERS: + @$(NORMAL_UNINSTALL) + @list='$(libglooxinclude_HEADERS)'; test -n "$(libglooxincludedir)" || list=; \ + files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ + dir='$(DESTDIR)$(libglooxincludedir)'; $(am__uninstall_files_from_dir) + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile $(LTLIBRARIES) $(HEADERS) +installdirs: installdirs-recursive +installdirs-am: + for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libglooxincludedir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ + mostlyclean-am + +distclean: distclean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: install-libglooxincludeHEADERS + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: install-libLTLIBRARIES + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-libLTLIBRARIES \ + uninstall-libglooxincludeHEADERS + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic \ + clean-libLTLIBRARIES clean-libtool ctags ctags-recursive \ + distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-libLTLIBRARIES \ + install-libglooxincludeHEADERS install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs installdirs-am \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-libLTLIBRARIES uninstall-libglooxincludeHEADERS + + +test: + make -C tests test + +check: test + +leaktest: + make -C tests leaktest + +leakcheck: leaktest + +includetest: + @for i in *.h; do \ + echo -e "#include \"$$i\"\nint main() {}" >tmp.cpp; \ + $(CXX) -I.. tmp.cpp 2>&1 | sed "s/^$$i://g" >$$i.test.log; \ + test -s $$i.test.log && echo "INC $$i: failed" || rm $$i.test.log; \ + done + @rm tmp.cpp + @ls *.h.test.log &>/dev/null || echo "INC all: ok" + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/adhoc.cpp b/smack/smack/src/main/cpp/gloox/src/adhoc.cpp new file mode 100644 index 00000000..708d3b26 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/adhoc.cpp @@ -0,0 +1,512 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "adhoc.h" +#include "adhochandler.h" +#include "adhoccommandprovider.h" +#include "disco.h" +#include "dataform.h" +#include "error.h" +#include "iodata.h" +#include "discohandler.h" +#include "clientbase.h" +#include "adhocplugin.h" +#include "util.h" +#include "mutexguard.h" + +namespace gloox +{ + + static const char* cmdActionStringValues[] = + { + "execute", "cancel", "prev", "next", "complete" + }; + + static inline const std::string actionString( Adhoc::Command::Action action ) + { + return util::lookup2( action, cmdActionStringValues ); + } + + static const char* cmdStatusStringValues[] = + { + "executing", "completed", "canceled" + }; + + static inline const std::string statusString( Adhoc::Command::Status status ) + { + return util::lookup( status, cmdStatusStringValues ); + } + + static const char* cmdNoteStringValues[] = + { + "info", "warn", "error" + }; + + static inline const std::string noteString( Adhoc::Command::Note::Severity sev ) + { + return util::lookup( sev, cmdNoteStringValues ); + } + + // ---- Adhoc::Command::Note ---- + Adhoc::Command::Note::Note( const Tag* tag ) + : m_severity( InvalidSeverity ) + { + if( !tag || tag->name() != "note" ) + return; + + m_severity = (Severity)util::deflookup( tag->findAttribute( "type" ), cmdNoteStringValues, Info ); + m_note = tag->cdata(); + } + + Tag* Adhoc::Command::Note::tag() const + { + if( m_note.empty() || m_severity == InvalidSeverity ) + return 0; + + Tag* n = new Tag( "note", m_note ); + n->addAttribute( TYPE, noteString( m_severity ) ); + return n; + } + // ---- ~Adhoc::Command::Note ---- + + // ---- Adhoc::Command ---- + Adhoc::Command::Command( const std::string& node, Adhoc::Command::Action action, + AdhocPlugin* plugin ) + : StanzaExtension( ExtAdhocCommand ), m_node( node ), m_plugin( plugin ), m_action( action ), + m_status( InvalidStatus ), m_actions( 0 ) + { + } + + Adhoc::Command::Command( const std::string& node, const std::string& sessionid, Status status, + AdhocPlugin* plugin ) + : StanzaExtension( ExtAdhocCommand ), m_node( node ), m_sessionid( sessionid ), + m_plugin( plugin ), m_action( InvalidAction ), m_status( status ), m_actions( 0 ) + { + } + + Adhoc::Command::Command( const std::string& node, const std::string& sessionid, + Adhoc::Command::Action action, + AdhocPlugin* plugin ) + : StanzaExtension( ExtAdhocCommand ), m_node( node ), m_sessionid( sessionid ), + m_plugin( plugin ), m_action( action ), m_actions( 0 ) + { + } + + Adhoc::Command::Command( const std::string& node, const std::string& sessionid, Status status, + Action executeAction, int allowedActions, + AdhocPlugin* plugin ) + : StanzaExtension( ExtAdhocCommand ), m_node( node ), m_sessionid( sessionid ), + m_plugin( plugin ), m_action( executeAction ), m_status( status ), m_actions( allowedActions ) + { + } + + Adhoc::Command::Command( const Tag* tag ) + : StanzaExtension( ExtAdhocCommand ), m_plugin( 0 ), m_actions( 0 ) + { + if( !tag || tag->name() != "command" || tag->xmlns() != XMLNS_ADHOC_COMMANDS ) + return; + + m_node = tag->findAttribute( "node" ); + m_sessionid = tag->findAttribute( "sessionid" ); + m_status = (Status)util::lookup( tag->findAttribute( "status" ), cmdStatusStringValues ); + + Tag* a = tag->findChild( "actions" ); + if( a ) + { + // Multi-stage response + m_action = (Action)util::deflookup2( a->findAttribute( "action" ), cmdActionStringValues, Complete ); + if( a->hasChild( "prev" ) ) + m_actions |= Previous; + if( a->hasChild( "next" ) ) + m_actions |= Next; + if( a->hasChild( "complete" ) ) + m_actions |= Complete; + } + else + { + m_action = (Action)util::deflookup2( tag->findAttribute( "action" ), cmdActionStringValues, Execute ); + } + + const ConstTagList& l = tag->findTagList( "/command/note" ); + ConstTagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + m_notes.push_back( new Note( (*it) ) ); + + Tag* x = tag->findChild( "x", "xmlns", XMLNS_X_DATA ); + if( x ) + m_plugin = new DataForm( x ); + else + { + Tag* x = tag->findChild( "iodata", "xmlns", XMLNS_IODATA ); + if( x ) + m_plugin = new IOData( x ); + } + } + + Adhoc::Command::~Command() + { + util::clearList( m_notes ); + delete m_plugin; + } + + const std::string& Adhoc::Command::filterString() const + { + static const std::string filter = "/iq/command[@xmlns='" + XMLNS_ADHOC_COMMANDS + "']"; + return filter; + } + + Tag* Adhoc::Command::tag() const + { + if( m_node.empty() ) + return 0; + + Tag* c = new Tag( "command" ); + c->setXmlns( XMLNS_ADHOC_COMMANDS ); + c->addAttribute( "node", m_node ); + if( m_actions != 0 ) + { + // Multi-stage command response + + if( m_status != InvalidStatus ) + c->addAttribute( "status", statusString( m_status ) ); + else + c->addAttribute( "status", statusString( Executing ) ); + + Tag* actions = new Tag( c, "actions" ); + + if( m_action != InvalidAction ) + c->addAttribute( "execute", actionString( m_action ) ); + else + c->addAttribute( "execute", actionString( Complete ) ); + + if( ( m_actions & Previous ) == Previous ) + new Tag( actions, "prev" ); + if( ( m_actions & Next ) == Next ) + new Tag( actions, "next" ); + if( ( m_actions & Complete ) == Complete ) + new Tag( actions, "complete" ); + } + else + { + // Single-stage command request/response or Multi-stage command request + + if( m_action != InvalidAction ) + c->addAttribute( "action", actionString( m_action ) ); + if( m_status != InvalidStatus ) + c->addAttribute( "status", statusString( m_status ) ); + } + + if ( !m_sessionid.empty() ) + c->addAttribute( "sessionid", m_sessionid ); + + if( m_plugin && *m_plugin ) + c->addChild( m_plugin->tag() ); + + NoteList::const_iterator it = m_notes.begin(); + for( ; it != m_notes.end(); ++it ) + c->addChild( (*it)->tag() ); + + return c; + } + // ---- ~Adhoc::Command ---- + + // ---- Adhoc ---- + Adhoc::Adhoc( ClientBase* parent ) + : m_parent( parent ) + { + if( !m_parent || !m_parent->disco() ) + return; + + m_parent->disco()->addFeature( XMLNS_ADHOC_COMMANDS ); + m_parent->disco()->registerNodeHandler( this, XMLNS_ADHOC_COMMANDS ); + m_parent->disco()->registerNodeHandler( this, EmptyString ); + m_parent->registerIqHandler( this, ExtAdhocCommand ); + m_parent->registerStanzaExtension( new Adhoc::Command() ); + } + + Adhoc::~Adhoc() + { + m_adhocTrackMapMutex.lock(); + m_adhocTrackMap.clear(); + m_adhocTrackMapMutex.unlock(); + + if( !m_parent || !m_parent->disco() ) + return; + + m_parent->disco()->removeFeature( XMLNS_ADHOC_COMMANDS ); + m_parent->disco()->removeNodeHandler( this, XMLNS_ADHOC_COMMANDS ); + m_parent->disco()->removeNodeHandler( this, EmptyString ); + m_parent->removeIqHandler( this, ExtAdhocCommand ); + m_parent->removeIDHandler( this ); + m_parent->removeStanzaExtension( ExtAdhocCommand ); + } + + StringList Adhoc::handleDiscoNodeFeatures( const JID& /*from*/, const std::string& /*node*/ ) + { + StringList features; + features.push_back( XMLNS_ADHOC_COMMANDS ); + return features; +// return StringList( 1, XMLNS_ADHOC_COMMANDS ); + } + + Disco::ItemList Adhoc::handleDiscoNodeItems( const JID& from, const JID& /*to*/, const std::string& node ) + { + Disco::ItemList l; + if( node.empty() ) + { + l.push_back( new Disco::Item( m_parent->jid(), XMLNS_ADHOC_COMMANDS, "Ad-Hoc Commands" ) ); + } + else if( node == XMLNS_ADHOC_COMMANDS ) + { + StringMap::const_iterator it = m_items.begin(); + for( ; it != m_items.end(); ++it ) + { + AdhocCommandProviderMap::const_iterator itp = m_adhocCommandProviders.find( (*it).first ); + if( itp != m_adhocCommandProviders.end() + && (*itp).second + && (*itp).second->handleAdhocAccessRequest( from, (*it).first ) ) + { + l.push_back( new Disco::Item( m_parent->jid(), (*it).first, (*it).second ) ); + } + } + } + return l; + } + + Disco::IdentityList Adhoc::handleDiscoNodeIdentities( const JID& /*from*/, const std::string& node ) + { + Disco::IdentityList l; + StringMap::const_iterator it = m_items.find( node ); + l.push_back( new Disco::Identity( "automation", + node == XMLNS_ADHOC_COMMANDS ? "command-list" : "command-node", + it == m_items.end() ? "Ad-Hoc Commands" : (*it).second ) ); + return l; + } + + bool Adhoc::handleIq( const IQ& iq ) + { + if( iq.subtype() != IQ::Set ) + return false; + + const Adhoc::Command* ac = iq.findExtension( ExtAdhocCommand ); + if( !ac || ac->node().empty()) + return false; + + AdhocCommandProviderMap::const_iterator it = m_adhocCommandProviders.find( ac->node() ); + if( it != m_adhocCommandProviders.end() ) + { + const std::string& sess = ac->sessionID().empty() ? m_parent->getID() : ac->sessionID(); + m_activeSessions[sess] = iq.id(); + (*it).second->handleAdhocCommand( iq.from(), *ac, sess ); + return true; + } + + return false; + } + + void Adhoc::handleIqID( const IQ& iq, int context ) + { + if( context != ExecuteAdhocCommand ) + return; + + m_adhocTrackMapMutex.lock(); + AdhocTrackMap::iterator it = m_adhocTrackMap.find( iq.id() ); + bool haveIdHandler = ( it != m_adhocTrackMap.end() ); + m_adhocTrackMapMutex.unlock(); + if( !haveIdHandler || (*it).second.context != context + || (*it).second.remote != iq.from() ) + return; + + switch( iq.subtype() ) + { + case IQ::Error: + (*it).second.ah->handleAdhocError( iq.from(), iq.error(), (*it).second.handlerContext ); + break; + case IQ::Result: + { + const Adhoc::Command* ac = iq.findExtension( ExtAdhocCommand ); + if( ac ) + (*it).second.ah->handleAdhocExecutionResult( iq.from(), *ac, (*it).second.handlerContext ); + break; + } + default: + break; + } + m_adhocTrackMapMutex.lock(); + m_adhocTrackMap.erase( it ); + m_adhocTrackMapMutex.unlock(); + } + + void Adhoc::registerAdhocCommandProvider( AdhocCommandProvider* acp, const std::string& command, + const std::string& name ) + { + if( !m_parent || !m_parent->disco() ) + return; + + m_parent->disco()->registerNodeHandler( this, command ); + m_adhocCommandProviders[command] = acp; + m_items[command] = name; + } + + void Adhoc::handleDiscoInfo( const JID& from, const Disco::Info& info, int context ) + { + if( context != CheckAdhocSupport ) + return; + + util::MutexGuard m( m_adhocTrackMapMutex ); + + AdhocTrackMap::iterator it = m_adhocTrackMap.begin(); + for( ; it != m_adhocTrackMap.end() && (*it).second.context != context + && (*it).second.remote != from; ++it ) + ; + if( it == m_adhocTrackMap.end() ) + return; + + (*it).second.ah->handleAdhocSupport( from, info.hasFeature( XMLNS_ADHOC_COMMANDS ), (*it).second.handlerContext ); + m_adhocTrackMap.erase( it ); + } + + void Adhoc::handleDiscoItems( const JID& from, const Disco::Items& items, int context ) + { + if( context != FetchAdhocCommands ) + return; + + util::MutexGuard m( m_adhocTrackMapMutex ); + + AdhocTrackMap::iterator it = m_adhocTrackMap.begin(); + for( ; it != m_adhocTrackMap.end(); ++it ) + { + if( (*it).second.context == context && (*it).second.remote == from ) + { + StringMap commands; + const Disco::ItemList& l = items.items(); + Disco::ItemList::const_iterator it2 = l.begin(); + for( ; it2 != l.end(); ++it2 ) + { + commands[(*it2)->node()] = (*it2)->name(); + } + (*it).second.ah->handleAdhocCommands( from, commands, (*it).second.handlerContext ); + + m_adhocTrackMap.erase( it ); + break; + } + } + } + + void Adhoc::handleDiscoError( const JID& from, const Error* error, int context ) + { + util::MutexGuard m( m_adhocTrackMapMutex ); + for( AdhocTrackMap::iterator it = m_adhocTrackMap.begin(); it != m_adhocTrackMap.end(); ) + { + if( (*it).second.context == context && (*it).second.remote == from ) + { + (*it).second.ah->handleAdhocError( from, error, (*it).second.handlerContext ); + + // Normally we'd just assign it to the return value of the .erase() call, + // which is either the next element, or .end(). However, + // it's only since C++11 that this works; C++03 version returns void. + // So instead, we do a post-increment. this increments the iterator to point + // to the next element, then passes a copy of the old iterator (that is to the item to be deleted) + m_adhocTrackMap.erase( it++ ); + } + else + { + ++it; + } + } + } + + void Adhoc::checkSupport( const JID& remote, AdhocHandler* ah, int context ) + { + if( !remote || !ah || !m_parent || !m_parent->disco() ) + return; + + TrackStruct track; + track.remote = remote; + track.context = CheckAdhocSupport; + track.ah = ah; + track.handlerContext = context; + const std::string& id = m_parent->getID(); + m_adhocTrackMapMutex.lock(); + m_adhocTrackMap[id] = track; + m_adhocTrackMapMutex.unlock(); + m_parent->disco()->getDiscoInfo( remote, EmptyString, this, CheckAdhocSupport, id ); + } + + void Adhoc::getCommands( const JID& remote, AdhocHandler* ah, int context ) + { + if( !remote || !ah || !m_parent || !m_parent->disco() ) + return; + + TrackStruct track; + track.remote = remote; + track.context = FetchAdhocCommands; + track.ah = ah; + track.handlerContext = context; + const std::string& id = m_parent->getID(); + m_adhocTrackMapMutex.lock(); + m_adhocTrackMap[id] = track; + m_adhocTrackMapMutex.unlock(); + m_parent->disco()->getDiscoItems( remote, XMLNS_ADHOC_COMMANDS, this, FetchAdhocCommands, id ); + } + + void Adhoc::execute( const JID& remote, const Adhoc::Command* command, AdhocHandler* ah, int context ) + { + if( !remote || !command || !m_parent || !ah ) + return; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, remote, id ); + iq.addExtension( command ); + + TrackStruct track; + track.remote = remote; + track.context = ExecuteAdhocCommand; + track.session = command->sessionID(); + track.ah = ah; + track.handlerContext = context; + m_adhocTrackMapMutex.lock(); + m_adhocTrackMap[id] = track; + m_adhocTrackMapMutex.unlock(); + + m_parent->send( iq, this, ExecuteAdhocCommand ); + } + + void Adhoc::respond( const JID& remote, const Adhoc::Command* command, const Error* error ) + { + if( !remote || !command || !m_parent ) + return; + + StringMap::iterator it = m_activeSessions.find( command->sessionID() ); + if( it == m_activeSessions.end() ) + return; + + IQ re( error ? IQ::Error : IQ::Result, remote, (*it).second ); + re.addExtension( command ); + if( error ) + re.addExtension( error ); + m_parent->send( re ); + m_activeSessions.erase( it ); + } + + void Adhoc::removeAdhocCommandProvider( const std::string& command ) + { + if( !m_parent || !m_parent->disco() ) + return; + + m_parent->disco()->removeNodeHandler( this, command ); + m_adhocCommandProviders.erase( command ); + m_items.erase( command ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/adhoc.h b/smack/smack/src/main/cpp/gloox/src/adhoc.h new file mode 100644 index 00000000..d2fe7aff --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/adhoc.h @@ -0,0 +1,500 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef ADHOC_H__ +#define ADHOC_H__ + +#include "adhocplugin.h" +#include "disco.h" +#include "disconodehandler.h" +#include "discohandler.h" +#include "iqhandler.h" +#include "stanzaextension.h" +#include "mutex.h" + +#include +#include +#include + +namespace gloox +{ + + class ClientBase; + class Stanza; + class AdhocHandler; + class AdhocCommandProvider; + + /** + * @brief This class implements a provider for @xep{0050} (Ad-hoc Commands). + * + * The current, not complete, implementation is probably best suited for fire-and-forget + * type of commands. Any additional feature, like multiple stages, etc., would have to be + * added separately. + * + * To offer commands to remote entities, use this class as follows:
    + * Create a class that will handle command execution requests and derive it from + * AdhocCommandProvider. Instantiate an Adhoc object and register your + * AdhocCommandProvider-derived object with the Adhoc object using + * registerAdhocCommandProvider(). The additional parameters to that method are the internal + * name of the command as used in the code, and the public name of the command as it + * will be shown to an end user: + * @code + * MyClass::someFunc() + * { + * Adhoc* m_adhoc = new Adhoc( m_client ); + * + * // this might be a bot monitoring a weather station, for example + * m_adhoc->registerAdhocCommandProvider( this, "getTemp", "Retrieve current temperature" ); + * m_adhoc->registerAdhocCommandProvider( this, "getPressure", "Retrieve current air pressure" ); + * [...] + * } + * @endcode + * In this example, MyClass is AdhocCommandProvider-derived so it is obviously the command handler, too. + * + * And that's about it you can do with the Adhoc class. Of course you can have a AdhocCommandProvider + * handle more than one command, just register it with the Adhoc object for every desired command, + * like shown above. + * + * What the Adhoc object does when you install a new command is tell the supplied Disco object + * to advertise these commands to clients using the 'Service Discovery' protocol to learn about + * this implementation's features. These clients can then call and execute the command. Of course you + * are free to implement access restrictions to not let anyone mess with your bot, for example. + * However, the commands offered using Service Discovery are publically visible in any case. + * + * To execute commands offered by a remote entity:
    + * ...TBC... + * + * XEP version: 1.2 + * @author Jakob Schröter + */ + class GLOOX_API Adhoc : public DiscoNodeHandler, public DiscoHandler, public IqHandler + { + public: + /** + * @brief An abstraction of an Adhoc Command element (from Adhoc Commands, @xep{0050}) + * as a StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Command : public StanzaExtension + { + friend class Adhoc; + + public: + + /** + * Specifies the action to undertake with the given command. + */ + enum Action + { + Execute = 1, /**< The command should be executed or continue to be executed. + * This is the default value. */ + Cancel = 2, /**< The command should be canceled. */ + Previous = 4, /**< The command should be digress to the previous stage of + * execution. */ + Next = 8, /**< The command should progress to the next stage of + * execution. */ + Complete = 16, /**< The command should be completed (if possible). */ + InvalidAction = 32 /**< The action is unknown or invalid. */ + }; + + /** + * Describes the current status of a command. + */ + enum Status + { + Executing, /**< The command is being executed. */ + Completed, /**< The command has completed. The command session has ended. */ + Canceled, /**< The command has been canceled. The command session has ended. */ + InvalidStatus /**< The status is unknown or invalid. */ + }; + + /** + * An abstraction of a command note. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Note + { + + friend class Command; + + public: + /** + * Specifies the severity of a note. + */ + enum Severity + { + Info, /**< The note is informational only. This is not really an + * exceptional condition. */ + Warning, /**< The note indicates a warning. Possibly due to illogical + * (yet valid) data. */ + Error, /**< The note indicates an error. The text should indicate the + * reason for the error. */ + InvalidSeverity /**< The note type is unknown or invalid. */ + }; + + /** + * A convenience constructor. + * @param sev The note's severity. + * @param note The note's content. + */ + Note( Severity sev, const std::string& note ) + : m_severity( sev ), m_note( note ) {} + + /** + * Destructor. + */ + ~Note() {} + + /** + * Returns the note's severity. + * @return The note's severity. + */ + Severity severity() const { return m_severity; } + + /** + * Returns the note's content. + * @return The note's content. + */ + const std::string& content() const { return m_note; } + + /** + * Returns a Tag representation of the Note. + * @return A Tag representation. + */ + Tag* tag() const; + + private: +#ifdef ADHOC_COMMANDS_TEST + public: +#endif + /** + * Constructs a new Note from the given Tag. + * @param tag The Tag to parse. + */ + Note( const Tag* tag ); + + Severity m_severity; /**< The note's severity. */ + std::string m_note; /**< The note's content. */ + }; + + /** + * A list of command notes. + */ + typedef std::list NoteList; + + /** + * Creates a Command object that can be used to perform the provided Action. + * This constructor is used best to continue execution of a multi stage command + * (for which the session ID must be known). + * @param node The node (command) to perform the action on. + * @param sessionid The session ID of an already running adhoc command session. + * @param action The action to perform. + * @param plugin An optional AdhocPlugin (e.g. DataForm) to include in the request. Will be deleted in Command's + * destructor. + */ + Command( const std::string& node, const std::string& sessionid, Action action, + AdhocPlugin* plugin = 0 ); + + /** + * Creates a Command object that can be used to perform the provided Action. + * This constructor is used best to reply to an execute request. + * @param node The node (command) to perform the action on. + * @param sessionid The (possibly newly created) session ID of the adhoc command session. + * @param status The execution status. + * @param plugin An optional AdhocPlugin (e.g. DataForm) to include in the reply. Will be deleted in Command's + * destructor. + */ + Command( const std::string& node, const std::string& sessionid, Status status, + AdhocPlugin* plugin = 0 ); + + /** + * Creates a Command object that can be used to perform the provided Action. + * This constructor is used best to reply to a multi stage command that is not yet completed + * (for which the session ID must be known). + * @param node The node (command) to perform the action on. + * @param sessionid The (possibly newly created) session ID of the adhoc command session. + * @param status The execution status. + * @param executeAction The action to execute. + * @param allowedActions Allowed reply actions. + * @param plugin An optional AdhocPlugin (e.g. DataForm) to include in the reply. Will be deleted in Command's + * destructor. + */ + Command( const std::string& node, const std::string& sessionid, Status status, + Action executeAction, int allowedActions = Complete, + AdhocPlugin* plugin = 0 ); + + /** + * Creates a Command object that can be used to perform the provided Action. + * This constructor is used best to execute the initial step of a command + * (single or multi stage). + * @param node The node (command) to perform the action on. + * @param action The action to perform. + * @param plugin An optional AdhocPlugin (e.g. DataForm) to include in the request. Will be deleted in Command's + * destructor. + */ + Command( const std::string& node, Action action, + AdhocPlugin* plugin = 0 ); + + /** + * Creates a Command object from the given Tag. + * @param tag A <command> tag in the adhoc commands' namespace. + */ + Command( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~Command(); + + /** + * Returns the node identifier (the command). + * @return The node identifier. + */ + const std::string& node() const { return m_node; } + + /** + * Returns the command's session ID, if any. + * @return The command's session ID. + */ + const std::string& sessionID() const { return m_sessionid; } + + /** + * Returns the execution status for a command. Only valid for execution + * results. + * @return The execution status for a command. + */ + Status status() const { return m_status; } + + /** + * Returns the command's action. + * @return The command's action. + */ + Action action() const { return m_action; } + + /** + * Returns the ORed actions that are allowed to be executed on the + * current stage. + * @return An int containing the ORed actions. + */ + int actions() const { return m_actions; } + + /** + * Returns the list of notes associated with the command. + * @return The list of notes. + */ + const NoteList& notes() const { return m_notes; } + + /** + * Use this function to add a note to the command. + * @param note A pointer to a Note object. The Command will own + * the Note. + */ + void addNote( const Note* note ) { m_notes.push_back( note ); } + + /** + * Returns the command's embedded AdhocPlugin (e.g. DataForm). + * @return The command's embedded AdhocPlugin (e.g. DataForm). May be 0. + * @note This will be removed in 1.1. Use plugin() instead. + */ + GLOOX_DEPRECATED const AdhocPlugin* form() const { return m_plugin; } + + /** + * Returns the command's embedded AdhocPlugin (e.g. DataForm). + * @return The command's embedded AdhocPlugin (e.g. DataForm). May be 0. + */ + const AdhocPlugin* plugin() const { return m_plugin; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Command( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + Command* c = new Command(); + + NoteList::const_iterator it = m_notes.begin(); + for( ; it != m_notes.end(); ++it ) + c->m_notes.push_back( new Note( *(*it) ) ); + + c->m_node = m_node; + c->m_sessionid = m_sessionid; + c->m_plugin = m_plugin ? static_cast( m_plugin->clone() ) : 0; + c->m_action = m_action; + c->m_status = m_status; + c->m_actions = m_actions; + + return c; + } + + private: +#ifdef ADHOC_COMMANDS_TEST + public: +#endif + NoteList m_notes; + + std::string m_node; + std::string m_sessionid; + AdhocPlugin* m_plugin; + Action m_action; + Status m_status; + int m_actions; + }; + + /** + * Constructor. + * Creates a new Adhoc client that registers as IqHandler with a ClientBase. + * @param parent The ClientBase used for XMPP communication. + */ + Adhoc( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~Adhoc(); + + /** + * This function queries the given remote entity for Adhoc Commands support. + * @param remote The remote entity's JID. + * @param ah The object handling the result of this request. + * @param context A user defined context. + */ + void checkSupport( const JID& remote, AdhocHandler* ah, int context = 0 ); + + /** + * Retrieves a list of commands from the remote entity. You should check whether the remote + * entity actually supports Adhoc Commands by means of checkSupport(). + * @param remote The remote entity's JID. + * @param ah The object handling the result of this request. + * @param context A user defined context. + */ + void getCommands( const JID& remote, AdhocHandler* ah, int context = 0 ); + + /** + * Executes or continues the given command on the given remote entity. + * To construct the @c command object, it is recommended to use either + * Command( const std::string&, Action ) to begin execution of a command, or + * Command( const std::string&, const std::string&, Action ) to continue execution + * of a command. + * @param remote The remote entity's JID. + * @param command The command to execute. + * @param ah The object handling the result of this request. + * @param context A user defined context. + */ + void execute( const JID& remote, const Adhoc::Command* command, AdhocHandler* ah, int context = 0 ); + + /** + * Use this function to respond to an execution request submitted by means + * of AdhocCommandProvider::handleAdhocCommand(). + * It is recommended to use + * Command( const std::string&, const std::string&, Status, AdhocPlugin* ) + * to construct the @c command object. + * Optionally, an Error object can be included. In that case the IQ sent is of type @c error. + * @param remote The requester's JID. + * @param command The response. The Adhoc object will own and delete the + * command object pointed to. + * @param error An optional Error obejct to include. + */ + void respond( const JID& remote, const Adhoc::Command* command, const Error* error = 0 ); + + /** + * Using this function, you can register a AdhocCommandProvider -derived object as + * handler for a specific Ad-hoc Command as defined in @xep{0050}. + * @param acp The object to register as handler for the specified command. + * @param command The node name of the command. Will be announced in disco#items. + * @param name The natural-language name of the command. Will be announced in disco#items. + */ + void registerAdhocCommandProvider( AdhocCommandProvider* acp, const std::string& command, + const std::string& name ); + + /** + * Use this function to unregister an adhoc command previously registered using + * registerAdhocCommandProvider(). + * @param command The command to unregister. + */ + void removeAdhocCommandProvider( const std::string& command ); + + // reimplemented from DiscoNodeHandler + virtual StringList handleDiscoNodeFeatures( const JID& from, const std::string& node ); + + // reimplemented from DiscoNodeHandler + virtual Disco::IdentityList handleDiscoNodeIdentities( const JID& from, + const std::string& node ); + + // reimplemented from DiscoNodeHandler + virtual Disco::ItemList handleDiscoNodeItems( const JID& from, const JID& to, const std::string& node ); + + // reimplemented from IqHandler + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler + virtual void handleIqID( const IQ& iq, int context ); + + // reimplemented from DiscoHandler + virtual void handleDiscoInfo( const JID& from, const Disco::Info& info, int context ); + + // reimplemented from DiscoHandler + virtual void handleDiscoItems( const JID& from, const Disco::Items& items, int context ); + + // reimplemented from DiscoHandler + virtual void handleDiscoError( const JID& from, const Error* error, int context ); + + private: +#ifdef ADHOC_TEST + public: +#endif + typedef std::map AdhocCommandProviderMap; + AdhocCommandProviderMap m_adhocCommandProviders; + + enum AdhocContext + { + CheckAdhocSupport, + FetchAdhocCommands, + ExecuteAdhocCommand + }; + + struct TrackStruct + { + JID remote; + AdhocContext context; + std::string session; + AdhocHandler* ah; + int handlerContext; + }; + typedef std::map AdhocTrackMap; + AdhocTrackMap m_adhocTrackMap; + util::Mutex m_adhocTrackMapMutex; + + ClientBase* m_parent; + + StringMap m_items; + StringMap m_activeSessions; + + }; + +} + +#endif // ADHOC_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/adhoccommandprovider.h b/smack/smack/src/main/cpp/gloox/src/adhoccommandprovider.h new file mode 100644 index 00000000..508f6ebe --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/adhoccommandprovider.h @@ -0,0 +1,79 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef ADHOCCOMMANDPROVIDER_H__ +#define ADHOCCOMMANDPROVIDER_H__ + +#include "tag.h" +#include "jid.h" +#include "adhoc.h" + +#include +#include +#include + +namespace gloox +{ + + /** + * @brief A virtual interface for an Ad-hoc Command Provider according to @xep{0050}. + * + * Derived classes can be registered as Command Providers with the Adhoc object. + * + * @author Jakob Schröter + */ + class GLOOX_API AdhocCommandProvider + { + public: + /** + * Virtual destructor. + */ + virtual ~AdhocCommandProvider() {} + + /** + * This function is called when an Ad-hoc Command needs to be handled. + * The callee is responsible for the whole command execution, i.e. session + * handling etc. + * @param from The sender of the command request. + * @param command The name of the command to be executed. + * @param sessionID The session ID. Either newly generated or taken from the command. + * When responding, its value must be passed to Adhoc::Command's constructor. + */ + virtual void handleAdhocCommand( const JID& from, const Adhoc::Command& command, + const std::string& sessionID ) = 0; + + /** + * This function gets called for each registered command when a remote + * entity requests the list of available commands. + * @param from The requesting entity. + * @param command The command's name. + * @return @b True if the remote entity is allowed to see the command, @b false if not. + * @note The return value of this function does not influence + * the execution of a command. That is, you have to + * implement additional access control at the execution + * stage. + * @note This function should not block. + */ + virtual bool handleAdhocAccessRequest( const JID& from, const std::string& command ) + { + (void)from; + (void)command; + return true; + } + + }; + +} + +#endif // ADHOCCOMMANDPROVIDER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/adhochandler.h b/smack/smack/src/main/cpp/gloox/src/adhochandler.h new file mode 100644 index 00000000..7510c1d8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/adhochandler.h @@ -0,0 +1,79 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef ADHOCHANDLER_H__ +#define ADHOCHANDLER_H__ + +#include "adhoc.h" + +namespace gloox +{ + + /** + * @brief A virtual interface for an Ad-hoc Command users according to @xep{0050}. + * + * Derived classes can be registered with the Adhoc object to receive notifications + * about Adhoc Commands remote entities support. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API AdhocHandler + { + public: + /** + * Virtual destructor. + */ + virtual ~AdhocHandler() {} + + /** + * This function is called in response to a call to Adhoc::checkSupport(). + * @param remote The queried remote entity's JID. + * @param support Whether the remote entity supports Adhoc Commands. + * @param context A user defined context. + */ + virtual void handleAdhocSupport( const JID& remote, bool support, int context ) = 0; + + /** + * This function is called in response to a call to Adhoc::getCommands() + * and delivers a list of supported commands. + * @param remote The queried remote entity's JID. + * @param commands A map of supported commands and their human-readable name. + * @param context A user defined context. + * The map may be empty. + */ + virtual void handleAdhocCommands( const JID& remote, const StringMap& commands, int context ) = 0; + + /** + * This function is called in response to a call to Adhoc::getCommands() or + * Adhoc::checkSupport() or Adhoc::execute() in case the respective request returned + * an error. + * @param remote The queried remote entity's JID. + * @param error The error condition. May be 0. + * @param context A user defined context. + */ + virtual void handleAdhocError( const JID& remote, const Error* error, int context ) = 0; + + /** + * This function is called in response to a remote command execution. + * @param remote The remote entity's JID. + * @param command The command being executed. + * @param context A user defined context. + */ + virtual void handleAdhocExecutionResult( const JID& remote, const Adhoc::Command& command, int context ) = 0; + }; + +} + +#endif // ADHOCHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/adhocplugin.h b/smack/smack/src/main/cpp/gloox/src/adhocplugin.h new file mode 100644 index 00000000..893af765 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/adhocplugin.h @@ -0,0 +1,61 @@ +/* + Copyright (c) 2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef ADHOCPLUGIN_H__ +#define ADHOCPLUGIN_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +namespace gloox +{ + + class Tag; + + /** + * @brief A base class for Adhoc Command plugins (DataForm, IO Data, ...). + * + * This is just a common base class for abstractions of protocols that can be embedded into Adhoc Commands. + * You should not need to use this class directly unless you're extending Adhoc Commands further. + * + * This class exists purely as an additional abstraction layer, to limit the type of objects that can be + * added to an Adhoc Command. + * + * @author Jakob Schröter + * @since 1.0.13 + */ + class GLOOX_API AdhocPlugin : public StanzaExtension + { + public: + + /** + * + */ + AdhocPlugin( int type ) : StanzaExtension( type ) {} + + /** + * Virtual destructor. + */ + virtual ~AdhocPlugin() {} + + /** + * Converts to @b true if the plugin is valid, @b false otherwise. + */ + virtual operator bool() const = 0; + + }; + +} + +#endif // ADHOCPLUGIN_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/amp.cpp b/smack/smack/src/main/cpp/gloox/src/amp.cpp new file mode 100644 index 00000000..1014012d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/amp.cpp @@ -0,0 +1,189 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "amp.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + static const char* conditionValues[] = + { + "deliver", "expire-at", "match-resource" + }; + + static const char* actionValues[] = + { + "alert", "error", "drop", "notify" + }; + + static const char* deliverValues[] = + { + "direct", "forward", "gateway", "none", "stored" + }; + + static const char* matchResourceValues[] = + { + "any", "exact", "other" + }; + + static const char* statusValues[] = + { + "alert", "notify" + }; + + // ---- AMP::Rule ---- + AMP::Rule::Rule( DeliverType deliver, ActionType action ) + : m_condition( ConditionDeliver ), m_deliver( deliver ), m_action( action ) + { + } + + AMP::Rule::Rule( const std::string& date, ActionType action ) + : m_condition( ConditionExpireAt ), m_expireat( new std::string( date ) ), m_action( action ) + { + } + + AMP::Rule::Rule( MatchResourceType match, ActionType action ) + : m_condition( ConditionMatchResource ), m_matchresource( match ), m_action( action ) + { + } + + AMP::Rule::Rule( const std::string& condition, const std::string& action, + const std::string& value ) + { + m_condition = (ConditionType)util::lookup( condition, conditionValues ); + m_action = (ActionType)util::lookup( action, actionValues ); + switch( m_condition ) + { + case ConditionDeliver: + m_deliver = (DeliverType)util::lookup( value, deliverValues ); + break; + case ConditionExpireAt: + m_expireat = new std::string( value ); + break; + case ConditionMatchResource: + m_matchresource = (MatchResourceType)util::lookup( value, matchResourceValues ); + break; + default: + case ConditionInvalid: // shouldn't happen + break; + } + } + + AMP::Rule::~Rule() + { + if( m_condition == ConditionExpireAt && m_expireat ) + delete m_expireat; + } + + Tag* AMP::Rule::tag() const + { + if( m_condition == ConditionInvalid || m_action == ActionInvalid + || ( m_condition == ConditionDeliver && m_deliver == DeliverInvalid ) + || ( m_condition == ConditionMatchResource && m_matchresource == MatchResourceInvalid ) + || ( m_condition == ConditionExpireAt && !m_expireat ) ) + return 0; + + Tag* rule = new Tag( "rule" ); + rule->addAttribute( "condition", util::lookup( m_condition, conditionValues ) ); + rule->addAttribute( "action", util::lookup( m_action, actionValues ) ); + + switch( m_condition ) + { + case ConditionDeliver: + rule->addAttribute( "value", util::lookup( m_deliver, deliverValues ) ); + break; + case ConditionExpireAt: + rule->addAttribute( "value", *m_expireat ); + break; + case ConditionMatchResource: + rule->addAttribute( "value", util::lookup( m_matchresource, matchResourceValues ) ); + break; + default: + break; + } + return rule; + } + // ---- AMP::Rule ---- + + // ---- AMP ---- + AMP::AMP( bool perhop ) + : StanzaExtension( ExtAMP ), m_perhop( perhop ), m_status( StatusInvalid ) + { + m_valid = true; + } + + AMP::AMP( const Tag* tag ) + : StanzaExtension( ExtAMP ), m_perhop( false ) + { + if( !tag || tag->name() != "amp" || tag->xmlns() != XMLNS_AMP ) + return; + + const ConstTagList& rules = tag->findTagList( "/amp/rule" ); + ConstTagList::const_iterator it = rules.begin(); + for( ; it != rules.end(); ++it ) + { + m_rules.push_back( new Rule( (*it)->findAttribute( "condition" ), + (*it)->findAttribute( "action" ), + (*it)->findAttribute( "value" ) ) ); + } + + m_from = tag->findAttribute( "from" ); + m_to = tag->findAttribute( "to" ); + m_status = (Status)util::lookup( tag->findAttribute( "status" ), statusValues ); + if( tag->hasAttribute( "per-hop", "true" ) || tag->hasAttribute( "per-hop", "1" ) ) + m_perhop = true; + m_valid = true; + } + + AMP::~AMP() + { + util::clearList( m_rules ); + } + + void AMP::addRule( const Rule* rule ) + { + if( rule ) + m_rules.push_back( rule ); + } + + const std::string& AMP::filterString() const + { + static const std::string filter = "/message/amp[@xmlns='" + XMLNS_AMP + "']"; + return filter; + } + + Tag* AMP::tag() const + { + if( !m_valid || !m_rules.size() ) + return 0; + + Tag* amp = new Tag( "amp" ); + amp->setXmlns( XMLNS_AMP ); + if( m_from ) + amp->addAttribute( "from", m_from.full() ); + if( m_to ) + amp->addAttribute( "to", m_to.full() ); + if( m_status != StatusInvalid ) + amp->addAttribute( "status", util::lookup( m_status, statusValues ) ); + if( m_perhop ) + amp->addAttribute( "per-hop", "true" ); + RuleList::const_iterator it = m_rules.begin(); + for( ; it != m_rules.end(); ++it ) + amp->addChild( (*it)->tag() ); + + return amp; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/amp.h b/smack/smack/src/main/cpp/gloox/src/amp.h new file mode 100644 index 00000000..f9cd5706 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/amp.h @@ -0,0 +1,243 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef AMP_H__ +#define AMP_H__ + +#include "stanzaextension.h" +#include "jid.h" + +#include +#include + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an implementation of @xep{0079} (Advanced Message Processing) + * as a StanzaExtension. + * + * XEP Version: 1.2 + * @author Jakob Schröter + * @author Vincent Thomasset + * @since 1.0 + */ + class GLOOX_API AMP : public StanzaExtension + { + + public: + /** + * Possible types for a rule's condition. + */ + enum ConditionType + { + ConditionDeliver, /**< Ensures (non-)delivery of the message */ + ConditionExpireAt, /**< Ensures delivery only before a certain time (UTC) */ + ConditionMatchResource, /**< Ensures delivery only to a specific resource type */ + ConditionInvalid /**< Invalid condition */ + }; + + /** + * Possible actions to take when the corresponding condition is met. + */ + enum ActionType + { + + ActionAlert, /**< Sends back a message stanza with an 'alert' status */ + ActionError, /**< Sends back a message stanza with an error type */ + ActionDrop, /**< Silently ignore the message */ + ActionNotify, /**< Sends back a message stanza with a 'notify' status */ + ActionInvalid /**< Invalid action */ + }; + + /** + * Possible delivery rules. + */ + enum DeliverType + { + DeliverDirect, /**< The message would be immediately delivered to the intended + * recipient or routed to the next hop. */ + DeliverForward, /**< The message would be forwarded to another XMPP address or + * account. */ + DeliverGateway, /**< The message would be sent through a gateway to an address + * or account on a non-XMPP system. */ + DeliverNone, /**< The message would not be delivered at all (e.g., because + * the intended recipient is offline and message storage is + * not enabled). */ + DeliverStored, /**< The message would be stored offline for later delivery + * to the intended recipient. */ + DeliverInvalid /**< Invalid deliver value */ + }; + + /** + * Possible resource matching rules. + */ + enum MatchResourceType + { + MatchResourceAny, /**< Destination resource matches any value, effectively + * ignoring the intended resource. */ + MatchResourceExact, /**< Destination resource exactly matches the intended + * resource. */ + MatchResourceOther, /**< Destination resource matches any value except for + * the intended resource. */ + MatchResourceInvalid /**< Invalid match-resource value */ + }; + + /** + * Available Stati. + */ + enum Status + { + StatusAlert, /**< The message is a reply to a @c Alert rule. */ + StatusNotify, /**< The message is a reply to a @c Notify rule. */ + StatusInvalid /**< Invalid status. */ + }; + + /** + * Describes an AMP rule. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Rule + { + public: + /** + * Creates a new AMP rule object with a condition of 'deliver'. + * @param deliver The delivery type. + * @param action The rule's action. + */ + Rule( DeliverType deliver, ActionType action ); + + /** + * Creates a new AMP rule object with a condition of 'expire-at'. + * @param date The expiry date/time in the format defined in @xep{0082}. + * @param action The rule's action. + */ + Rule( const std::string& date, ActionType action ); + + /** + * Creates a new AMP rule object with a condition of 'match-resource'. + * @param match The match type. + * @param action The rule's action. + */ + Rule( MatchResourceType match, ActionType action ); + + /** + * Creates a new AMP rule object from the given strings. + * @param condition The rule's condition. + * @param action The rule's action. + * @param value The rule's value. + */ + Rule( const std::string& condition, const std::string& action, + const std::string& value ); + + /** + * Destructor. + */ + ~Rule(); + + /** + * Creates a Tag representation from the current rule. + * @return A Tag representation of the rule. + */ + Tag* tag() const; + + private: + ConditionType m_condition; + union + { + DeliverType m_deliver; + MatchResourceType m_matchresource; + std::string* m_expireat; + }; + ActionType m_action; + + }; + + /** + * A list of AMP rules. + */ + typedef std::list RuleList; + + /** + * Constructs a new object. + * @param perhop Indicates whether the ruleset should be applied to all hops, + * or at the edge servers only. Default: @c false (edge servers only) + */ + AMP( bool perhop = false ); + + /** + * Constructs a new object from the given Tag. + * @param tag The AMP Tag to parse. + */ + AMP( const Tag* tag ); + + /** + * Adds the given rule to the list of rules. + * @param rule The rule to add. + */ + void addRule( const Rule* rule ); + + /** + * Returns the current list of rules for inspection. + * @return The current list of rules. + */ + const RuleList& rules() const { return m_rules; } + + /** + * @brief Virtual Destructor. + */ + virtual ~AMP(); + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new AMP( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + AMP* a = new AMP(); + a->m_perhop = m_perhop; + RuleList::const_iterator it = m_rules.begin(); + for( ; it != m_rules.end(); ++it ) + a->m_rules.push_back( new Rule( *(*it) ) ); + a->m_status = m_status; + a->m_from = m_from; + a->m_to = m_to; + return a; + } + + private: + bool m_perhop; + RuleList m_rules; + Status m_status; + JID m_from; + JID m_to; + }; + +} + +#endif // AMP_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/annotations.cpp b/smack/smack/src/main/cpp/gloox/src/annotations.cpp new file mode 100644 index 00000000..d3ac0062 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/annotations.cpp @@ -0,0 +1,90 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "annotations.h" +#include "clientbase.h" + + +namespace gloox +{ + + Annotations::Annotations( ClientBase* parent ) + : PrivateXML( parent ), + m_annotationsHandler( 0 ) + { + } + + Annotations::~Annotations() + { + } + + void Annotations::storeAnnotations( const AnnotationsList& aList ) + { + Tag* s = new Tag( "storage", XMLNS, XMLNS_ANNOTATIONS ); + + AnnotationsList::const_iterator it = aList.begin(); + for( ; it != aList.end(); ++it ) + { + Tag* n = new Tag( s, "note", (*it).note ); + n->addAttribute( "jid", (*it).jid ); + n->addAttribute( "cdate", (*it).cdate ); + n->addAttribute( "mdate", (*it).mdate ); + } + + storeXML( s, this ); + } + + void Annotations::requestAnnotations() + { + requestXML( "storage", XMLNS_ANNOTATIONS, this ); + } + + void Annotations::handlePrivateXML( const Tag* xml ) + { + if( !xml ) + return; + + AnnotationsList aList; + const TagList& l = xml->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "note" ) + { + const std::string& jid = (*it)->findAttribute( "jid" ); + const std::string& note = (*it)->cdata(); + + if( !jid.empty() && !note.empty() ) + { + const std::string& cdate = (*it)->findAttribute( "cdate" ); + const std::string& mdate = (*it)->findAttribute( "mdate" ); + AnnotationsListItem item; + item.jid = jid; + item.cdate = cdate; + item.mdate = mdate; + item.note = note; + aList.push_back( item ); + } + } + } + + if( m_annotationsHandler ) + m_annotationsHandler->handleAnnotations( aList ); + } + + void Annotations::handlePrivateXMLResult( const std::string& /*uid*/, PrivateXMLResult /*result*/ ) + { + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/annotations.h b/smack/smack/src/main/cpp/gloox/src/annotations.h new file mode 100644 index 00000000..1751fb9d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/annotations.h @@ -0,0 +1,147 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef ANNOTATIONS_H__ +#define ANNOTATIONS_H__ + +#include "macros.h" + +#include "annotationshandler.h" +#include "privatexml.h" +#include "privatexmlhandler.h" + +#include +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an implementation of @xep{0145} (Annotations). + * + * You can use this class to store arbitrary notes about a roster item on the server + * (and to retrieve them later on). + * To retrieve all stored annotations for the current user's roster you have to create + * a class which inherits from AnnotationsHandler. This handler receives retrieved notes. + * + * @code + * class MyClass : public AnnotationsHandler + * { + * public: + * // ... + * void myFuncRetrieve(); + * void myFuncStore(); + * void handleAnnotations( const AnnotationsList &aList ); + * + * private: + * Annotations* m_notes; + * AnnotationsList m_list; + * }; + * + * void MyClass::myFuncRetrieve() + * { + * [...] + * m_notes = new Annotations( m_client ); + * m_notes->requestAnnotations(); + * } + * + * void MyClass::handleAnnotations( const AnnotationsList &aList ) + * { + * m_list = aList; + * } + * @endcode + * + * To store an additional note you have to fetch the currently stored notes first, + * add your new note to the list of notes, and transfer them all together back to the + * server. This protocol does not support storage of 'deltas', that is, when saving + * notes all previously saved notes are overwritten. + * + * @code + * void MyClass::myFuncStore() + * { + * annotationsListItem item; + * item.jid = "me@example.com"; + * item.cdate = "2006-02-04T15:23:21Z"; + * item.note = "some guy at example.com"; + * m_list.push_back( item ); + * + * item.jid = "abc@def.com"; + * item.cdate = "2006-01-24T15:23:21Z"; + * item.mdate = "2006-02-04T05:11:46Z"; + * item.note = "some other guy"; + * m_list.push_back( item ); + * + * m_notes->storeAnnotations( m_list ); + * } + * @endcode + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API Annotations : public PrivateXML, public PrivateXMLHandler + { + public: + /** + * Constructs a new Annotations object. + * @param parent The ClientBase to use for communication. + */ + Annotations( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~Annotations(); + + /** + * Use this function to store notes (annotations to contacts in a roster) on the server. + * Make sure you store the whole set of annotations, not a 'delta'. + * @param aList A list of notes to store. + */ + void storeAnnotations( const AnnotationsList& aList ); + + /** + * Use this function to initiate retrieval of annotations. Use registerAnnotationsHandler() + * to register an object which will receive the lists of notes. + */ + void requestAnnotations(); + + /** + * Use this function to register a AnnotationsHandler. + * @param ah The AnnotationsHandler which shall receive retrieved notes. + */ + void registerAnnotationsHandler( AnnotationsHandler* ah ) + { m_annotationsHandler = ah; } + + /** + * Use this function to un-register the AnnotationsHandler. + */ + void removeAnnotationsHandler() + { m_annotationsHandler = 0; } + + // reimplemented from PrivateXMLHandler + virtual void handlePrivateXML( const Tag* xml ); + + // reimplemented from PrivateXMLHandler + virtual void handlePrivateXMLResult( const std::string& uid, PrivateXMLResult pxResult ); + + private: + AnnotationsHandler* m_annotationsHandler; + + }; + +} + +#endif // ANNOTATIONS_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/annotationshandler.h b/smack/smack/src/main/cpp/gloox/src/annotationshandler.h new file mode 100644 index 00000000..93d03688 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/annotationshandler.h @@ -0,0 +1,66 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef ANNOTATIONSHANDLER_H__ +#define ANNOTATIONSHANDLER_H__ + +#include "macros.h" + +#include +#include + +namespace gloox +{ + + /** + * This describes a single note item. + */ + struct AnnotationsListItem + { + std::string jid; /**< The JID of the roster item this note is about */ + std::string cdate; /**< Creation date of this note. */ + std::string mdate; /**< Date of last modification of this note. */ + std::string note; /**< The note. */ + }; + + /** + * A list of note items. + */ + typedef std::list AnnotationsList; + + /** + * @brief A virtual interface which can be reimplemented to receive notes with help of + * the Annotations object. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API AnnotationsHandler + { + public: + /** + * Virtual destructor. + */ + virtual ~AnnotationsHandler() {} + + /** + * This function is called when notes arrive from the server. + * @param aList A list of notes. + */ + virtual void handleAnnotations( const AnnotationsList &aList ) = 0; + }; + +} + +#endif // ANNOTATIONSHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/atomicrefcount.cpp b/smack/smack/src/main/cpp/gloox/src/atomicrefcount.cpp new file mode 100644 index 00000000..9d1ca0fd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/atomicrefcount.cpp @@ -0,0 +1,93 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "atomicrefcount.h" + +#include "config.h" + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# include +#elif defined( __APPLE__ ) +# include +#elif defined( HAVE_GCC_ATOMIC_BUILTINS ) + // Use intrinsic functions - no #include required. +#else +# include "mutexguard.h" +#endif + +#ifdef _WIN32_WCE +# include +#endif + +namespace gloox +{ + + namespace util + { + AtomicRefCount::AtomicRefCount() + : m_count( 0 ) + { + } + + int AtomicRefCount::increment() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + return (int) ::InterlockedIncrement( (volatile LONG*)&m_count ); +#elif defined( __APPLE__ ) + return (int) OSAtomicIncrement32Barrier( (volatile int32_t*)&m_count ); +#elif defined( HAVE_GCC_ATOMIC_BUILTINS ) + // Use the gcc intrinsic for atomic increment if supported. + return (int) __sync_add_and_fetch( &m_count, 1 ); +#else + // Fallback to using a lock + MutexGuard m( m_lock ); + return ++m_count; +#endif + } + + int AtomicRefCount::decrement() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + return (int) ::InterlockedDecrement( (volatile LONG*)&m_count ); +#elif defined( __APPLE__ ) + return (int) OSAtomicDecrement32Barrier( (volatile int32_t*)&m_count ); +#elif defined( HAVE_GCC_ATOMIC_BUILTINS ) + // Use the gcc intrinsic for atomic decrement if supported. + return (int) __sync_sub_and_fetch( &m_count, 1 ); +#else + // Fallback to using a lock + MutexGuard m( m_lock ); + return --m_count; +#endif + } + + void AtomicRefCount::reset() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + ::InterlockedExchange( (volatile LONG*)&m_count, (volatile LONG)0 ); +#elif defined( __APPLE__ ) + OSAtomicAnd32Barrier( (uint32_t)0, (volatile uint32_t*)&m_count ); +#elif defined( HAVE_GCC_ATOMIC_BUILTINS ) + // Use the gcc intrinsic for atomic decrement if supported. + __sync_fetch_and_and( &m_count, 0 ); +#else + // Fallback to using a lock + MutexGuard m( m_lock ); + m_count = 0; +#endif + } + + } + +} + diff --git a/smack/smack/src/main/cpp/gloox/src/atomicrefcount.h b/smack/smack/src/main/cpp/gloox/src/atomicrefcount.h new file mode 100644 index 00000000..cebac9a2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/atomicrefcount.h @@ -0,0 +1,75 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef ATOMICREFCOUNT_H__ +#define ATOMICREFCOUNT_H__ + +#include "macros.h" +#include "mutex.h" + +namespace gloox +{ + + namespace util + { + /** + * @brief A simple implementation of a thread safe 32-bit + * reference count. Native functions are used where possible. + * When not available, a mutex is used for locking and unlocking. + * + * @author Daniel Bowen + * @author Jakob Schröter + * @since 1.0.1 + */ + class GLOOX_API AtomicRefCount + { + public: + /** + * Contructs a new atomic reference count. + */ + AtomicRefCount(); + + /** + * Increments the reference count, and returns the new value. + * @return The new value. + */ + int increment(); + + /** + * Decrements the reference count, and returns the new value. + * @return The new value. + */ + int decrement(); + + /** + * Resets the reference count to zero. + * @since 1.0.4 + */ + void reset(); + + private: + AtomicRefCount& operator=( const AtomicRefCount& ); + + volatile int m_count; + + // The mutex is only used if a native function is unavailable. + Mutex m_lock; + + }; + + } + +} + +#endif // ATOMICREFCOUNT_H__ + diff --git a/smack/smack/src/main/cpp/gloox/src/attention.cpp b/smack/smack/src/main/cpp/gloox/src/attention.cpp new file mode 100644 index 00000000..5df9b14e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/attention.cpp @@ -0,0 +1,43 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "attention.h" +#include "tag.h" + +namespace gloox +{ + + Attention::Attention() + : StanzaExtension( ExtAttention ) + { + } + + Attention::~Attention() + { + } + + const std::string& Attention::filterString() const + { + static const std::string filter = "/message/attention[@xmlns='" + XMLNS_ATTENTION + "']"; + return filter; + } + + Tag* Attention::tag() const + { + Tag* t = new Tag( "attention" ); + t->setXmlns( XMLNS_ATTENTION ); + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/attention.h b/smack/smack/src/main/cpp/gloox/src/attention.h new file mode 100644 index 00000000..b7c93ff6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/attention.h @@ -0,0 +1,70 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef ATTENTION_H__ +#define ATTENTION_H__ + + +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an implementation of @xep{0224} as a StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Attention : public StanzaExtension + { + + public: + /** + * Constructs a new object from the given Tag. + */ + Attention(); + + /** + * Virtual Destructor. + */ + virtual ~Attention(); + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* /*tag*/ ) const + { + return new Attention(); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Attention(); + } + + }; + +} + +#endif// ATTENTION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/base64.cpp b/smack/smack/src/main/cpp/gloox/src/base64.cpp new file mode 100644 index 00000000..d4422810 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/base64.cpp @@ -0,0 +1,126 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "base64.h" + +namespace gloox +{ + + namespace Base64 + { + + static const std::string alphabet64( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ); + static const char pad = '='; + static const char np = (char)std::string::npos; + static char table64vals[] = + { + 62, np, np, np, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, np, np, np, np, np, + np, np, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 25, np, np, np, np, np, np, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 + }; + + inline char table64( unsigned char c ) + { + return ( c < 43 || c > 122 ) ? np : table64vals[c-43]; + } + + const std::string encode64( const std::string& input ) + { + std::string encoded; + char c; + const std::string::size_type length = input.length(); + + encoded.reserve( length * 2 ); + + for( std::string::size_type i = 0; i < length; ++i ) + { + c = static_cast( ( input[i] >> 2 ) & 0x3f ); + encoded += alphabet64[c]; + + c = static_cast( ( input[i] << 4 ) & 0x3f ); + if( ++i < length ) + c = static_cast( c | static_cast( ( input[i] >> 4 ) & 0x0f ) ); + encoded += alphabet64[c]; + + if( i < length ) + { + c = static_cast( ( input[i] << 2 ) & 0x3c ); + if( ++i < length ) + c = static_cast( c | static_cast( ( input[i] >> 6 ) & 0x03 ) ); + encoded += alphabet64[c]; + } + else + { + ++i; + encoded += pad; + } + + if( i < length ) + { + c = static_cast( input[i] & 0x3f ); + encoded += alphabet64[c]; + } + else + { + encoded += pad; + } + } + + return encoded; + } + + const std::string decode64( const std::string& input ) + { + char c, d; + const std::string::size_type length = input.length(); + std::string decoded; + + decoded.reserve( length ); + + for( std::string::size_type i = 0; i < length; ++i ) + { + c = table64(input[i]); + ++i; + d = table64(input[i]); + c = static_cast( ( c << 2 ) | ( ( d >> 4 ) & 0x3 ) ); + decoded += c; + if( ++i < length ) + { + c = input[i]; + if( pad == c ) + break; + + c = table64(input[i]); + d = static_cast( ( ( d << 4 ) & 0xf0 ) | ( ( c >> 2 ) & 0xf ) ); + decoded += d; + } + + if( ++i < length ) + { + d = input[i]; + if( pad == d ) + break; + + d = table64(input[i]); + c = static_cast( ( ( c << 6 ) & 0xc0 ) | d ); + decoded += c; + } + } + + return decoded; + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/base64.h b/smack/smack/src/main/cpp/gloox/src/base64.h new file mode 100644 index 00000000..ede3bb41 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/base64.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef BASE64_H__ +#define BASE64_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + /** + * @brief An implementation of the Base64 data encoding (RFC 3548) + * + * @author Jakob Schröter + * @since 0.8 + */ + namespace Base64 + { + + /** + * Base64-encodes the input according to RFC 3548. + * @param input The data to encode. + * @return The encoded string. + */ + GLOOX_API const std::string encode64( const std::string& input ); + + /** + * Base64-decodes the input according to RFC 3548. + * @param input The encoded data. + * @return The decoded data. + */ + GLOOX_API const std::string decode64( const std::string& input ); + + } + +} + +#endif // BASE64_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/bookmarkhandler.h b/smack/smack/src/main/cpp/gloox/src/bookmarkhandler.h new file mode 100644 index 00000000..b63867b7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/bookmarkhandler.h @@ -0,0 +1,82 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef BOOKMARKHANDLER_H__ +#define BOOKMARKHANDLER_H__ + +#include "macros.h" + +#include +#include + +namespace gloox +{ + + /** + * This describes a single bookmarked URL item. + */ + struct BookmarkListItem + { + std::string name; /**< A human readable name of the bookmark. */ + std::string url; /**< The URL of the bookmark. */ + }; + + /** + * This describes a single bookmarked conference item. + */ + struct ConferenceListItem + { + std::string name; /**< A human readable name of the conference room. */ + std::string jid; /**< The address of the room. */ + std::string nick; /**< The nick name to use in this room. */ + std::string password; /**< The password to use for a protected room. */ + bool autojoin; /**< The conference shall be joined automatically on login. */ + }; + + /** + * A list of URL items. + */ + typedef std::list BookmarkList; + + /** + * A list of conference items. + */ + typedef std::list ConferenceList; + + /** + * @brief A virtual interface which can be reimplemented to receive bookmarks with help of a + * BookmarkStorage object. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API BookmarkHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~BookmarkHandler() {} + + /** + * This function is called when bookmarks arrive from the server. + * @param bList A list of URL bookmarks. + * @param cList A list of conference bookmarks. + */ + virtual void handleBookmarks( const BookmarkList &bList, const ConferenceList &cList ) = 0; + }; + +} + +#endif // BOOKMARKHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/bookmarkstorage.cpp b/smack/smack/src/main/cpp/gloox/src/bookmarkstorage.cpp new file mode 100644 index 00000000..acd12590 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/bookmarkstorage.cpp @@ -0,0 +1,118 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "bookmarkstorage.h" +#include "clientbase.h" + + +namespace gloox +{ + + BookmarkStorage::BookmarkStorage( ClientBase* parent ) + : PrivateXML( parent ), + m_bookmarkHandler( 0 ) + { + } + + BookmarkStorage::~BookmarkStorage() + { + } + + void BookmarkStorage::storeBookmarks( const BookmarkList& bList, const ConferenceList& cList ) + { + Tag* s = new Tag( "storage" ); + s->addAttribute( XMLNS, XMLNS_BOOKMARKS ); + + BookmarkList::const_iterator itb = bList.begin(); + for( ; itb != bList.end(); ++itb ) + { + Tag* i = new Tag( s, "url", "name", (*itb).name ); + i->addAttribute( "url", (*itb).url ); + } + + ConferenceList::const_iterator itc = cList.begin(); + for( ; itc != cList.end(); ++itc ) + { + Tag* i = new Tag( s, "conference", "name", (*itc).name ); + i->addAttribute( "jid", (*itc).jid ); + i->addAttribute( "autojoin", (*itc).autojoin ? "true" : "false" ); + + new Tag( i, "nick", (*itc).nick ); + new Tag( i, "password", (*itc).password ); + } + + storeXML( s, this ); + } + + void BookmarkStorage::requestBookmarks() + { + requestXML( "storage", XMLNS_BOOKMARKS, this ); + } + + void BookmarkStorage::handlePrivateXML( const Tag* xml ) + { + if( !xml ) + return; + + BookmarkList bList; + ConferenceList cList; + const TagList& l = xml->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "url" ) + { + const std::string& url = (*it)->findAttribute( "url" ); + const std::string& name = (*it)->findAttribute( "name" ); + + if( !url.empty() && !name.empty() ) + { + BookmarkListItem item; + item.url = url; + item.name = name; + bList.push_back( item ); + } + } + else if( (*it)->name() == "conference" ) + { + const std::string& jid = (*it)->findAttribute( "jid" ); + const std::string& name = (*it)->findAttribute( "name" ); + + if( !jid.empty() && !name.empty() ) + { + const std::string& join = (*it)->findAttribute( "autojoin" ); + ConferenceListItem item; + item.jid = jid; + item.name = name; + const Tag* nick = (*it)->findChild( "nick" ); + if( nick ) + item.nick = nick->cdata(); + const Tag* pwd = (*it)->findChild( "password" ); + if( pwd ) + item.password = pwd->cdata(); + item.autojoin = ( join == "true" || join == "1" ); + cList.push_back( item ); + } + } + } + + if( m_bookmarkHandler ) + m_bookmarkHandler->handleBookmarks( bList, cList ); + } + + void BookmarkStorage::handlePrivateXMLResult( const std::string& /*uid*/, PrivateXMLResult /*result*/ ) + { + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/bookmarkstorage.h b/smack/smack/src/main/cpp/gloox/src/bookmarkstorage.h new file mode 100644 index 00000000..fac00e15 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/bookmarkstorage.h @@ -0,0 +1,150 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef BOOKMARKSTORAGE_H__ +#define BOOKMARKSTORAGE_H__ + +#include "macros.h" + +#include "bookmarkhandler.h" +#include "privatexml.h" +#include "privatexmlhandler.h" + +#include +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an implementation of @xep{0048} (Bookmark Storage). + * + * You can use this class to store bookmarks to multi-user chat rooms or ordinary URLs + * on the server (and to retrieve them later on). + * To retrieve all stored bookmarks for the current user you have to create a class which + * inherits from BookmarkHandler. This handler receives retrieved bookmarks. + * + * @code + * class MyClass : public BookmarkHandler + * { + * public: + * // ... + * void myFuncRetrieve(); + * void myFuncStore(); + * void handleBookmarks( const BookmarkList &bList, const ConferenceList &cList ); + * + * private: + * BookmarkStorage* m_bs; + * BookmarkList m_bList; + * ConferenceList m_cList; + * }; + * + * void MyClass::myFuncRetrieve() + * { + * m_bs = new BookmarkStorage( m_client ); + * m_bs->requestBookmarks(); + * } + * + * void MyClass::handleBookmarks( const BookmarkList &bList, const ConferenceList &cList ) + * { + * m_bList = bList; + * m_cList = cList; + * } + * @endcode + * + * + * To store additional bookmarks you have to fetch the currently stored ones first, + * add your new bookmark to the list, and transfer them all together back to the + * server. This protocol does not support storage of 'deltas', that is, when saving + * bookmarks all previously saved bookmarks are overwritten. + * + * @code + * void MyClass::myFuncStore() + * { + * BookmarkListItem bi; + * bi.url = "http://www.jabber.org"; + * bi.name = "my favourite IM protocol"; + * m_bList.push_back( bi ); + * + * conferenceListItem ci + * ci.name = "jabber/xmpp development room"; + * ci.jid = "jdev@conference.jabber.org"; + * ci.nick = "myNick"; + * ci.password = EmptyString; + * ci.autojoin = true; + * m_cList.push_back( ci ); + * + * m_bs->storeBookmarks( m_bList, m_cList ); + * } + * @endcode + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API BookmarkStorage : public PrivateXML, public PrivateXMLHandler + { + public: + /** + * Constructs a new BookmarkStorage object. + * @param parent The ClientBase to use for communication. + */ + BookmarkStorage( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~BookmarkStorage(); + + /** + * Use this function to store a number of URL and conference bookmarks on the server. + * Make sure you store the whole set of bookmarks, not a 'delta'. + * @param bList A list of URLs to store. + * @param cList A list of conferences to store. + */ + void storeBookmarks( const BookmarkList& bList, const ConferenceList& cList ); + + /** + * Use this function to initiate retrieval of bookmarks. Use registerBookmarkHandler() + * to register an object which will receive the lists of bookmarks. + */ + void requestBookmarks(); + + /** + * Use this function to register a BookmarkHandler. + * @param bmh The BookmarkHandler which shall receive retrieved bookmarks. + */ + void registerBookmarkHandler( BookmarkHandler* bmh ) + { m_bookmarkHandler = bmh; } + + /** + * Use this function to un-register the BookmarkHandler. + */ + void removeBookmarkHandler() + { m_bookmarkHandler = 0; } + + // reimplemented from PrivateXMLHandler + virtual void handlePrivateXML( const Tag* xml ); + + // reimplemented from PrivateXMLHandler + virtual void handlePrivateXMLResult( const std::string& uid, PrivateXMLResult pxResult ); + + private: + BookmarkHandler* m_bookmarkHandler; + }; + +} + +#endif // BOOKMARKSTORAGE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/bytestream.h b/smack/smack/src/main/cpp/gloox/src/bytestream.h new file mode 100644 index 00000000..ed6bdc63 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/bytestream.h @@ -0,0 +1,180 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef BYTESTREAM_H__ +#define BYTESTREAM_H__ + +#include "jid.h" +#include "logsink.h" + +#include + +namespace gloox +{ + + class BytestreamDataHandler; + + /** + * @brief An abstraction of a single bytestream. + * + * Used as a base class for InBand Bytestreams as well as SOCKS5 Bytestreams. + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Bytestream + { + public: + /** + * Available stream types. + */ + enum StreamType + { + S5B, /**< SOCKS5 Bytestream */ + IBB /**< In-Band Bytestream */ + }; + + /** + * Creates a new Bytestream. + * @param type The stream type. + * @param logInstance A Logsink to use for logging. Obtain it from ClientBase::logInstance(). + * @param initiator The initiator of the stream (usually the sender). + * @param target The target of the stream (usually the receiver). + * @param sid The stream's ID. + */ + Bytestream( StreamType type, LogSink& logInstance, const JID& initiator, const JID& target, + const std::string& sid ) + : m_handler( 0 ), m_logInstance( logInstance ), m_initiator( initiator ), m_target( target ), + m_type( type ), m_sid( sid ), m_open( false ) + {} + + /** + * Virtual destructor. + */ + virtual ~Bytestream() {} + + /** + * Returns whether the bytestream is open, that is, accepted by both parties and ready + * to send/receive data. + * @return Whether or not the bytestream is open. + */ + bool isOpen() const { return m_open; } + + /** + * This function starts the connection process. + * @return @b True if a connection to a remote entity could be established, @b false + * otherwise. + * @note If @b false is returned you should pass this Bytestream object + * to SIProfileFT::dispose() for deletion. + * @note Make sure you have a BytestreamDataHandler registered (using + * registerBytestreamDataHandler()) before calling this function. + */ + virtual bool connect() = 0; + + /** + * Closes the bytestream. + */ + virtual void close() = 0; + + /** + * Use this function to send a chunk of data over an open bytestream. + * If the stream is not open or has been closed again + * (by the remote entity or locally), nothing is sent and @b false is returned. + * This function does any base64 encoding for you, if necessary. + * @param data The block of data to send. + * @return @b True if the data has been sent (no guarantee of receipt), @b false + * in case of an error. + */ + virtual bool send( const std::string& data ) = 0; + + /** + * Call this function repeatedly to receive data. You should even do this + * if you use the bytestream to merely @b send data. May be a NOOP, depending on the actual + * stream type. + * @param timeout The timeout to use for select in microseconds. Default of -1 means blocking. + * @return The state of the connection. + */ + virtual ConnectionError recv( int timeout = -1 ) = 0; + + /** + * Lets you retrieve the stream's ID. + * @return The stream's ID. + */ + const std::string& sid() const { return m_sid; } + + /** + * Returns the stream's type. + * @return The stream's type. + */ + StreamType type() const { return m_type; } + + /** + * Returns the target entity's JID. If this bytestream is remote-initiated, this is + * the local JID. If it is local-initiated, this is the remote entity's JID. + * @return The target's JID. + */ + const JID& target() const { return m_target; } + + /** + * Returns the initiating entity's JID. If this bytestream is remote-initiated, this is + * the remote entity's JID. If it is local-initiated, this is the local JID. + * @return The initiator's JID. + */ + const JID& initiator() const { return m_initiator; } + + /** + * Use this function to register an object that will receive any notifications from + * the Bytestream instance. Only one BytestreamDataHandler can be registered + * at any one time. + * @param bdh The BytestreamDataHandler-derived object to receive notifications. + */ + void registerBytestreamDataHandler( BytestreamDataHandler* bdh ) + { m_handler = bdh; } + + /** + * Removes the registered BytestreamDataHandler. + */ + void removeBytestreamDataHandler() + { m_handler = 0; } + + protected: + /** A handler for incoming data and open/close events. */ + BytestreamDataHandler* m_handler; + + /** A LogSink instance to use for logging. */ + const LogSink& m_logInstance; + + /** The initiator's JID. */ + const JID m_initiator; + + /** The target's JID. */ + const JID m_target; + + /** The stream type. */ + StreamType m_type; + + /** The stream ID. */ + std::string m_sid; + + /** Indicates whether or not the stream is open. */ + bool m_open; + + private: + Bytestream& operator=( const Bytestream& ); + + }; + +} + +#endif // BYTESTREAM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/bytestreamdatahandler.h b/smack/smack/src/main/cpp/gloox/src/bytestreamdatahandler.h new file mode 100644 index 00000000..cb7771e1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/bytestreamdatahandler.h @@ -0,0 +1,81 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef BYTESTREAMDATAHANDLER_H__ +#define BYTESTREAMDATAHANDLER_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + class Bytestream; + class IQ; + + /** + * @brief A virtual interface that allows implementors to receive data + * sent over a SOCKS5 Bytestream as defined in @xep{0066}, or an In-Band Bytestream + * as defined in @xep{0047}. You'll also need it for sending of data. + * + * An BytestreamDataHandler is registered with a Bytestream. + * + * See SIProfileFT for more information regarding file transfer. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API BytestreamDataHandler + { + public: + /** + * Virtual destructor. + */ + virtual ~BytestreamDataHandler() {} + + /** + * Reimplement this function to receive data which is sent over the bytestream. + * The data received here is (probably) only a single chunk of the complete data (depending + * on the amount of data you want to send). + * @param bs The bytestream. + * @param data The actual stream payload. + */ + virtual void handleBytestreamData( Bytestream* bs, const std::string& data ) = 0; + + /** + * Notifies about an error occuring while using a bytestream. + * When this handler is called the stream has already been closed. + * @param bs The bytestream. + * @param iq The error stanza. + */ + virtual void handleBytestreamError( Bytestream* bs, const IQ& iq ) = 0; + + /** + * Notifies the handler that the given bytestream has been acknowledged + * and is ready to send/receive data. + * @param bs The opened bytestream. + */ + virtual void handleBytestreamOpen( Bytestream* bs ) = 0; + + /** + * Notifies the handler that the given bytestream has been closed. + * @param bs The closed bytestream. + */ + virtual void handleBytestreamClose( Bytestream* bs ) = 0; + + }; + +} + +#endif // BYTESTREAMDATAHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/bytestreamhandler.h b/smack/smack/src/main/cpp/gloox/src/bytestreamhandler.h new file mode 100644 index 00000000..b504b609 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/bytestreamhandler.h @@ -0,0 +1,90 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef BYTESTREAMHANDLER_H__ +#define BYTESTREAMHANDLER_H__ + +#include "macros.h" +#include "jid.h" +#include "bytestream.h" +#include "iq.h" + +namespace gloox +{ + + /** + * @brief A virtual interface that allows to receive new incoming Bytestream requests + * from remote entities. + * + * You should not need to use this interface directly. + * + * See SIProfileFT on how to implement file transfer in general. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API BytestreamHandler + { + public: + /** + * Virtual destructor. + */ + virtual ~BytestreamHandler() {} + + /** + * Notifies the implementor of a new incoming bytestream request. + * You have to call either + * BytestreamManager::acceptBytestream() or + * BytestreamManager::rejectBytestream(), to accept or reject the bytestream + * request, respectively. + * @param sid The bytestream's id, to be passed to BytestreamManager::acceptBytestream() + * and BytestreamManager::rejectBytestream(), respectively. + * @param from The remote initiator of the bytestream request. + */ + virtual void handleIncomingBytestreamRequest( const std::string& sid, const JID& from ) = 0; + + /** + * Notifies the implementor of a new incoming bytestream. The bytestream is not yet ready to + * send data. + * To initialize the bytestream and to prepare it for data transfer, register a + * BytestreamDataHandler with it and call its connect() method. + * To not block your application while the data transfer lasts, you most + * likely want to put the bytestream into its own thread or process (before calling connect() on it). + * It is safe to do so without additional synchronization. + * When you are finished using the bytestream, use SIProfileFT::dispose() to get rid of it. + * @param bs The bytestream. + */ + virtual void handleIncomingBytestream( Bytestream* bs ) = 0; + + /** + * Notifies the implementor of successful establishing of an outgoing bytestream request. + * The stream has been accepted by the remote entity and is ready to send data. + * The BytestreamHandler does @b not become the owner of the Bytestream object. + * Use SIProfileFT::dispose() to get rid of the bytestream object after it has been closed. + * @param bs The new bytestream. + */ + virtual void handleOutgoingBytestream( Bytestream* bs ) = 0; + + /** + * Notifies the handler of errors occuring when a bytestream was requested. + * For example, if the remote entity does not implement SOCKS5 bytestreams. + * @param iq The error stanza. + * @param sid The request's SID. + */ + virtual void handleBytestreamError( const IQ& iq, const std::string& sid ) = 0; + + }; + +} + +#endif // BYTESTREAMHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/capabilities.cpp b/smack/smack/src/main/cpp/gloox/src/capabilities.cpp new file mode 100644 index 00000000..a76e58a1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/capabilities.cpp @@ -0,0 +1,183 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "capabilities.h" + +#include "base64.h" +#include "disco.h" +#include "dataform.h" +#include "sha.h" +#include "tag.h" + +namespace gloox +{ + + Capabilities::Capabilities( Disco* disco ) + : StanzaExtension( ExtCaps ), m_disco( disco ), m_node( GLOOX_CAPS_NODE ), + m_hash( "sha-1" ), m_valid( false ) + { + if( m_disco ) + m_valid = true; + } + + Capabilities::Capabilities( const Tag* tag ) + : StanzaExtension( ExtCaps ), m_disco( 0 ), m_valid( false ) + { + if( !tag || tag->name() != "c" || !tag->hasAttribute( XMLNS, XMLNS_CAPS ) + || !tag->hasAttribute( "node" ) || !tag->hasAttribute( "ver" ) ) + return; + + m_node = tag->findAttribute( "node" ); + m_ver = tag->findAttribute( "ver" ); + m_hash = tag->findAttribute( "hash" ); + m_valid = true; + } + + Capabilities::~Capabilities() + { + if( m_disco ) + m_disco->removeNodeHandlers( const_cast( this ) ); + } + + const std::string Capabilities::ver() const + { + if( !m_disco ) + return m_ver; + + SHA sha; + sha.feed( generate( m_disco->identities(), m_disco->features( true ), m_disco->form() ) ); + const std::string& hash = Base64::encode64( sha.binary() ); + m_disco->removeNodeHandlers( const_cast( this ) ); + m_disco->registerNodeHandler( const_cast( this ), m_node + '#' + hash ); + return hash; + } + + std::string Capabilities::generate( const Disco::IdentityList& il, const StringList& features, const DataForm* form ) + { + StringList sl; + Disco::IdentityList::const_iterator it = il.begin(); + for( ; it != il.end(); ++it ) + { + std::string id = (*it)->category(); + id += '/'; + id += (*it)->type(); + id += '/'; + // FIXME add xml:lang caps here. see XEP-0115 Section 5 + id += '/'; + id += (*it)->name(); + sl.push_back( id ); + } + sl.sort(); + + std::string s; + StringList::const_iterator it2 = sl.begin(); + for( ; it2 != sl.end(); ++it2 ) + { + s += (*it2); + s += '<'; + } + + StringList f = features; + f.sort(); + it2 = f.begin(); + for( ; it2 != f.end(); ++it2 ) + { + s += (*it2); + s += '<'; + } + + if( form ) + { + DataForm::FieldList::const_iterator it3 = form->fields().begin(); + typedef std::map MapSSL; + + MapSSL m; + for( ; it3 != form->fields().end(); ++it3 ) + { + if( (*it3)->name() == "FORM_TYPE" ) + { + s += (*it3)->value(); + s += '<'; + } + else + m.insert( std::make_pair( (*it3)->name(), (*it3)->values() ) ); + } + + MapSSL::iterator it4 = m.begin(); + for( ; it4 != m.end(); ++it4 ) + { + s += it4->first; + s += '<'; + it2 = it4->second.begin(); + for( ; it2 != it4->second.end(); ++it2 ) + { + s += (*it2); + s += '<'; + } + } + } + return s; + } + + std::string Capabilities::generate( const Disco::Info* info ) + { + return info ? generate( info->identities(), info->features(), info->form() ) : EmptyString; + } + + std::string Capabilities::generate( const Disco* disco ) + { + return disco ? generate( disco->identities(), disco->features(), disco->form() ) : EmptyString; + } + + const std::string& Capabilities::filterString() const + { + static const std::string filter = "/presence/c[@xmlns='" + XMLNS_CAPS + "']"; + return filter; + } + + Tag* Capabilities::tag() const + { + if( !m_valid || m_node.empty() ) + return 0; + + Tag* t = new Tag( "c" ); + t->setXmlns( XMLNS_CAPS ); + t->addAttribute( "hash", m_hash ); + t->addAttribute( "node", m_node ); + t->addAttribute( "ver", ver() ); + return t; + } + + StringList Capabilities::handleDiscoNodeFeatures( const JID&, const std::string& ) + { + return m_disco->features(); + } + + Disco::IdentityList Capabilities::handleDiscoNodeIdentities( const JID&, const std::string& ) + { + const Disco::IdentityList& il = m_disco->identities(); + Disco::IdentityList ret; + Disco::IdentityList::const_iterator it = il.begin(); + for( ; it != il.end(); ++it ) + { + ret.push_back( new Disco::Identity( *(*it) ) ); + } + return ret; + } + + Disco::ItemList Capabilities::handleDiscoNodeItems( const JID&, const JID&, const std::string& ) + { + return Disco::ItemList(); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/capabilities.h b/smack/smack/src/main/cpp/gloox/src/capabilities.h new file mode 100644 index 00000000..a801a681 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/capabilities.h @@ -0,0 +1,132 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CAPABILITIES_H__ +#define CAPABILITIES_H__ + +#include "disconodehandler.h" +#include "stanzaextension.h" +#include "tag.h" + +#include + +namespace gloox +{ + + class Disco; + class Tag; + + /** + * @brief This is an implementation of @xep{0115} (Entity Capabilities). + * + * XEP Version: 1.5-15 + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Capabilities : public StanzaExtension, public DiscoNodeHandler + { + + public: + /** + * Constructs a new object and fills it according to the parameters. + * @param disco The current Client's Disco object. + */ + Capabilities( Disco* disco ); + + /** + * Constructs a new object from the given Tag. + * @param tag The Tag to parse. + */ + Capabilities( const Tag* tag = 0 ); + + /** + * Virtual Destructor. + */ + virtual ~Capabilities(); + + /** + * Returns the client's identifying node. + * @return The node. + */ + const std::string& node() const { return m_node; } + + /** + * Sets the client's identifying node. + * @param node The node. + */ + void setNode( const std::string& node ) { m_node = node; } + + /** + * Returns the client's identifying ver string. + * @return The ver string. + */ + const std::string ver() const; + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Capabilities( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Capabilities( *this ); + } + + // reimplemented from DiscoNodeHandler + virtual StringList handleDiscoNodeFeatures( const JID& from, const std::string& node ); + + // reimplemented from DiscoNodeHandler + virtual Disco::IdentityList handleDiscoNodeIdentities( const JID& from, + const std::string& node ); + + // reimplemented from DiscoNodeHandler + virtual Disco::ItemList handleDiscoNodeItems( const JID& from, const JID& to, + const std::string& node = EmptyString ); + + private: + /** + * Returns the hash function used for creating the caps info. + * @return The current hash function's name. + */ + const std::string& hash() const { return m_hash; } + + /** + * Use this function to set the hash function to use. + * @param hash The hash function. + * @todo Convert to using an enum and make public. + */ + void setHash( const std::string& hash ) { m_hash = hash; } + + static std::string generate( const Disco::IdentityList& identities, + const StringList& features, const DataForm* form = 0 ); + static std::string generate( const Disco::Info* info ); + static std::string generate( const Disco* disco ); + + Disco* m_disco; + std::string m_node; + std::string m_hash; + std::string m_ver; + bool m_valid; + }; + +} + +#endif // CAPABILITIES_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/carbons.cpp b/smack/smack/src/main/cpp/gloox/src/carbons.cpp new file mode 100644 index 00000000..acb38f6d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/carbons.cpp @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2013-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + + +#include "carbons.h" + +#include "forward.h" +#include "util.h" + +namespace gloox +{ + /* chat state type values */ + static const char* typeValues [] = { + "received", + "sent", + "enable", + "disable", + "private" + }; + + Carbons::Carbons( Carbons::Type type ) + : StanzaExtension( ExtCarbons ), m_forward( 0 ), m_type( type ) + { + } + + Carbons::Carbons( const Tag* tag ) + : StanzaExtension( ExtCarbons ), m_forward( 0 ), m_type( Invalid ) + { + if( !tag ) + return; + + const std::string& name = tag->name(); + m_type = (Type)util::lookup( name, typeValues ); + + switch( m_type ) + { + case Sent: + case Received: + { + Tag* f = tag->findChild( "forwarded", XMLNS, XMLNS_STANZA_FORWARDING ); + if( f ) + m_forward = new Forward( f ); + break; + } + default: + break; + } + } + + Carbons::~Carbons() + { + delete m_forward; + } + + const std::string& Carbons::filterString() const + { + static const std::string filter = "/message/*[@xmlns='" + XMLNS_MESSAGE_CARBONS + "']"; + return filter; + } + + Stanza* Carbons::embeddedStanza() const + { + if( !m_forward || m_type == Invalid ) + return 0; + + return m_forward->embeddedStanza(); + } + + Tag* Carbons::embeddedTag() const + { + if( !m_forward || m_type == Invalid ) + return 0; + + return m_forward->embeddedTag(); + } + + Tag* Carbons::tag() const + { + if( m_type == Invalid ) + return 0; + + Tag* t = new Tag( util::lookup( m_type, typeValues ), XMLNS, XMLNS_MESSAGE_CARBONS ); + if( m_forward && ( m_type == Received || m_type == Sent ) ) + t->addChild( m_forward->tag() ); + + return t; + } + + StanzaExtension* Carbons::clone() const + { + return 0; // TODO + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/carbons.h b/smack/smack/src/main/cpp/gloox/src/carbons.h new file mode 100644 index 00000000..e32817a0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/carbons.h @@ -0,0 +1,185 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CARBONS_H__ +#define CARBONS_H__ + +#include "macros.h" + +#include "stanzaextension.h" +#include "tag.h" + +namespace gloox +{ + + class Forward; + + /** + * @brief An implementation of Message Carbons (@xep{0280}) as a StanzaExtension. + * + * @section enable Enable Mesage Carbons + * + * Before using Message Carbons you have to check your server for support of the extension. + * You can do so using Disco::getDiscoInfo(). You can check the result (in DiscoHandler::handleDiscoInfo()) + * for a feature of @c XMLNS_MESSAGE_CARBONS (use Disco::Info::hasFeature()). + * + * If the feature exists, you can enable Message Carbons with the server. + * + * @code + * Client cb( ... ); + * // ... + * + * // setup + * cb.registerStanzaExtension( new Forward() ); // required for Message Carbons support + * cb.registerStanzaExtension( new Carbons() ); + * // ... + * + * // enable Message Carbons + * IQ iq( IQ::Set, JID() ); // empty JID + * iq.addExtension( new Carbons( Carbons::Enable ) ); + * cb.send( iq, MyIqHandler, 1 ); // myIqHandler will be notified of the result with the given context ('1' in this case). + * @endcode + * + * @note Once enabled, the server will automatically send all received and sent messages @b of @b type @c Chat to all other Carbons-enabled resources of + * the current account. You have to make sure that you actually send messages of type @c Chat. The default is currently @c Normal. + * + * @section disable Disable Message Carbons + * + * Once enabled, you can easily disable Message carbons. The code is almost identical to the code used to enable the feature, + * except that you use a Carbons::Type of Carbons::Disable when you add the Carbons extension to the IQ: + * @code + * iq.addExtension( new Carbons( Carbons::Disable ) ); + * @endcode + * + * @section private Prevent carbon copies for a single message + * + * To disable carbon copies for a single message, add a Carbons extension of type Private: + * + * @code + * Message msg( Message::Chat, ... ); + * // ... + * msg.addExtension( new Carbons( Carbons::Private ) ); + * @endcode + * + * The server will not copy this message to your other connected resources. + * + * @section access Access received carbon copies + * + * When receiving a message (sent by either another connected client of the current user, or by a 3rd party), a carbon copy will + * have the following characteristics: + * @li The message's @c from attribute will be the @b bare JID of the @b receiving entity. + * @li The message's @c from attribute will be the @b full JID of the @b receiving entity. + * @li The message contains a Carbons StanzaExtension. This extension contains the original message with the @b original + * @c from/to attributes. + * + * Some sample code: + * @code + * bool Myclass::handleMessage( const Message& msg, MessageSession* ) + * { + * if( msg.hasEmbeddedStanza() ) // optional, saves some processing time when there is no Carbons extension + * { + * const Carbons* carbon = msg.findExtension( ExtCarbons ); + * if( carbon && carbon->embeddedStanza() ) + * { + * Message* embeddedMessage = static_cast( carbon->embeddedStanza() ); + * } + * } + * } + * @endcode + * + * You can also determine whether a carbon was sent by a 3rd party or a different client of the current user by checking the return value of Carbons::type(). + * @code + * Carbons* c = msg.findExtension<...>( ... ); + * // check that c is valid + * + * if( c->type() == Carbons::Received ) + * // Message was sent by a 3rd party + * else if( c->type() == Carbons::Sent ) + * // Message was sent by a different client of the current user + * @endcode + * + * XEP Version: 0.8 + * + * @author Jakob Schröter + * @since 1.0.5 + */ + class GLOOX_API Carbons : public StanzaExtension + { + public: + /** + * The types of Message Carbons stanza extensions. + */ + enum Type + { + Received, /**< Indicates that the message received has been sent by a third party. */ + Sent, /**< Indicates that the message received has been sent by one of the user's own resources. */ + Enable, /**< Indicates that the sender wishes to enable carbon copies. */ + Disable, /**< Indicates that the sender wishes to disable carbon copies. */ + Private, /**< Indicates that the sender does not want carbon copies to be sent for this message. */ + Invalid /**< Invalid type. */ + }; + + /** + * Constructs a new Carbons instance of the given type. + * You should only use the @c Enable, @c Disable and @c Private types. + * @param type The Carbons type to create. + */ + Carbons( Type type ); + + /** + * Constructs a new Carbons instance from the given tag. + * @param tag The Tag to create the Carbons instance from. + */ + Carbons( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~Carbons(); + + /** + * Returns the current instance's type. + * @return The intance's type. + */ + Type type() const { return m_type; } + + // reimplemented from StanzaExtension + virtual Stanza* embeddedStanza() const; + + // reimplemented from StanzaExtension + virtual Tag* embeddedTag() const; + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Carbons( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const; + + private: + Forward* m_forward; + Type m_type; + + }; + +} + +#endif // CARBONS_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/chatstate.cpp b/smack/smack/src/main/cpp/gloox/src/chatstate.cpp new file mode 100644 index 00000000..0ddf77a7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/chatstate.cpp @@ -0,0 +1,61 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "chatstate.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + /* chat state type values */ + static const char* stateValues [] = { + "active", + "composing", + "paused", + "inactive", + "gone" + }; + + static inline ChatStateType chatStateType( const std::string& type ) + { + return (ChatStateType)util::lookup2( type, stateValues ); + } + + ChatState::ChatState( const Tag* tag ) + : StanzaExtension( ExtChatState ), + m_state( ChatStateInvalid ) + { + if( tag ) + m_state = chatStateType( tag->name() ); + } + + const std::string& ChatState::filterString() const + { + static const std::string filter = + "/message/active[@xmlns='" + XMLNS_CHAT_STATES + "']" + "|/message/composing[@xmlns='" + XMLNS_CHAT_STATES + "']" + "|/message/paused[@xmlns='" + XMLNS_CHAT_STATES + "']" + "|/message/inactive[@xmlns='" + XMLNS_CHAT_STATES + "']" + "|/message/gone[@xmlns='" + XMLNS_CHAT_STATES + "']"; + return filter; + } + + Tag* ChatState::tag() const + { + if( m_state == ChatStateInvalid ) + return 0; + + return new Tag( util::lookup2( m_state, stateValues ), XMLNS, XMLNS_CHAT_STATES ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/chatstate.h b/smack/smack/src/main/cpp/gloox/src/chatstate.h new file mode 100644 index 00000000..748716ff --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/chatstate.h @@ -0,0 +1,87 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef CHATSTATE_H__ +#define CHATSTATE_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief An implementation of Chat State Notifications (@xep{0085}) as a StanzaExtension. + * + * @author Vincent Thomasset + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API ChatState : public StanzaExtension + { + public: + + /** + * Constructs a new object from the given Tag. + * @param tag A Tag to parse. + */ + ChatState( const Tag* tag ); + + /** + * Constructs a new object of the given type. + * @param state The chat state. + */ + ChatState( ChatStateType state ) + : StanzaExtension( ExtChatState ), m_state( state ) + {} + + /** + * Virtual destructor. + */ + virtual ~ChatState() {} + + /** + * Returns the object's state. + * @return The object's state. + */ + ChatStateType state() const { return m_state; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new ChatState( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new ChatState( *this ); + } + + private: + ChatStateType m_state; + + }; + +} + +#endif // CHATSTATE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/chatstatefilter.cpp b/smack/smack/src/main/cpp/gloox/src/chatstatefilter.cpp new file mode 100644 index 00000000..24dae850 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/chatstatefilter.cpp @@ -0,0 +1,65 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "chatstatefilter.h" +#include "chatstatehandler.h" +#include "messageeventhandler.h" +#include "messagesession.h" +#include "message.h" +#include "chatstate.h" + +namespace gloox +{ + + ChatStateFilter::ChatStateFilter( MessageSession* parent ) + : MessageFilter( parent ), m_chatStateHandler( 0 ), m_lastSent( ChatStateGone ), + m_enableChatStates( true ) + { + } + + ChatStateFilter::~ChatStateFilter() + { + } + + void ChatStateFilter::filter( Message& msg ) + { + if( m_enableChatStates && m_chatStateHandler ) + { + const ChatState* state = msg.findExtension( ExtChatState ); + + m_enableChatStates = state && state->state() != ChatStateInvalid; + if( m_enableChatStates && msg.body().empty() ) + m_chatStateHandler->handleChatState( msg.from(), state->state() ); + } + } + + void ChatStateFilter::setChatState( ChatStateType state ) + { + if( !m_enableChatStates || state == m_lastSent || state == ChatStateInvalid ) + return; + + Message m( Message::Chat, m_parent->target() ); + m.addExtension( new ChatState( state ) ); + + m_lastSent = state; + + send( m ); + } + + void ChatStateFilter::decorate( Message& msg ) + { + if( m_enableChatStates ) + msg.addExtension( new ChatState( ChatStateActive ) ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/chatstatefilter.h b/smack/smack/src/main/cpp/gloox/src/chatstatefilter.h new file mode 100644 index 00000000..31f90bef --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/chatstatefilter.h @@ -0,0 +1,105 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CHATSTATEFILTER_H__ +#define CHATSTATEFILTER_H__ + +#include "messagefilter.h" +#include "gloox.h" + +namespace gloox +{ + + class Tag; + class ChatStateHandler; + class MessageSession; + class Message; + + /** + * @brief This class adds Chat State Notifications (@xep{0085}) support to a MessageSession. + * + * This implementation of Chat States is fully transparent to the user of the class. + * If the remote entity does not request chat states, ChatStateFilter will not send + * any, even if the user requests it. (This is required by the protocol specification.) + * You MUST annouce this capability by use of Disco (associated namespace is XMLNS_CHAT_STATES). + * (This is also required by the protocol specification.) + * + * @note You must register ChatState as a StanzaExtension by calling + * ClientBase::registerStanzaExtension() for notifications to work. + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API ChatStateFilter : public MessageFilter + { + public: + /** + * Contstructs a new Chat State filter for a MessageSession. + * @param parent The MessageSession to decorate. + */ + ChatStateFilter( MessageSession* parent ); + + /** + * Virtual destructor. + */ + virtual ~ChatStateFilter(); + + /** + * Use this function to set a chat state as defined in @xep{0085}. + * @note The Spec states that Chat States shall not be sent to an entity + * which did not request them. Reasonable effort is taken in this function to + * avoid spurious state sending. You should be safe to call this even if Message + * Events were not requested by the remote entity. However, + * calling setChatState( CHAT_STATE_COMPOSING ) for every keystroke still is + * discouraged. ;) + * @param state The state to set. + */ + void setChatState( ChatStateType state ); + + /** + * The ChatStateHandler registered here will receive Chat States according + * to @xep{0085}. + * @param csh The ChatStateHandler to register. + */ + void registerChatStateHandler( ChatStateHandler* csh ) + { m_chatStateHandler = csh; } + + /** + * This function clears the internal pointer to the ChatStateHandler. + * Chat States will not be delivered anymore after calling this function until another + * ChatStateHandler is registered. + */ + void removeChatStateHandler() + { m_chatStateHandler = 0; } + + // reimplemented from MessageFilter + virtual void decorate( Message& msg ); + + // reimplemented from MessageFilter + virtual void filter( Message& msg ); + + protected: + /** A handler for incoming chat state changes. */ + ChatStateHandler* m_chatStateHandler; + + /** Holds the state sent last. */ + ChatStateType m_lastSent; + + /** Indicates whether or not chat states are currently enabled. */ + bool m_enableChatStates; + + }; + +} + +#endif // CHATSTATEFILTER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/chatstatehandler.h b/smack/smack/src/main/cpp/gloox/src/chatstatehandler.h new file mode 100644 index 00000000..1b94626d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/chatstatehandler.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CHATSTATEHANDLER_H__ +#define CHATSTATEHANDLER_H__ + +#include "gloox.h" + +namespace gloox +{ + + class JID; + + /** + * @brief A virtual interface that enables an object to be notified about + * a remote entity's Chat States (@xep{0085}). + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API ChatStateHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~ChatStateHandler() {} + + /** + * Notifies the ChatStateHandler that a different chat state has been set by the remote + * contact. + * @param from The originator of the Event. + * @param state The chat state set by the remote entity. + */ + virtual void handleChatState( const JID& from, ChatStateType state ) = 0; + + }; + +} + +#endif // CHATSTATEHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/client.cpp b/smack/smack/src/main/cpp/gloox/src/client.cpp new file mode 100644 index 00000000..7f3daa66 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/client.cpp @@ -0,0 +1,760 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "config.h" + +#include "client.h" +#include "capabilities.h" +#include "rostermanager.h" +#include "disco.h" +#include "error.h" +#include "logsink.h" +#include "nonsaslauth.h" +#include "prep.h" +#include "stanzaextensionfactory.h" +#include "stanzaextension.h" +#include "tag.h" +#include "tlsbase.h" +#include "util.h" + +#if !defined( _WIN32 ) && !defined( _WIN32_WCE ) +# include +#endif + +namespace gloox +{ + + // ---- Client::ResourceBind ---- + Client::ResourceBind::ResourceBind( const std::string& resource, bool bind ) + : StanzaExtension( ExtResourceBind ), m_jid( JID() ), m_bind( bind ) + { + prep::resourceprep( resource, m_resource ); + m_valid = true; + } + + Client::ResourceBind::ResourceBind( const Tag* tag ) + : StanzaExtension( ExtResourceBind ), m_resource( EmptyString ), m_bind( true ) + { + if( !tag ) + return; + + if( tag->name() == "unbind" ) + m_bind = false; + else if( tag->name() == "bind" ) + m_bind = true; + else + return; + + if( tag->hasChild( "jid" ) ) + m_jid.setJID( tag->findChild( "jid" )->cdata() ); + else if( tag->hasChild( "resource" ) ) + m_resource = tag->findChild( "resource" )->cdata(); + + m_valid = true; + } + + Client::ResourceBind::~ResourceBind() + { + } + + const std::string& Client::ResourceBind::filterString() const + { + static const std::string filter = "/iq/bind[@xmlns='" + XMLNS_STREAM_BIND + "']" + "|/iq/unbind[@xmlns='" + XMLNS_STREAM_BIND + "']"; + return filter; + } + + Tag* Client::ResourceBind::tag() const + { + if( !m_valid ) + return 0; + + Tag* t = new Tag( m_bind ? "bind" : "unbind" ); + t->setXmlns( XMLNS_STREAM_BIND ); + + if( m_bind && m_resource.empty() && m_jid ) + new Tag( t, "jid", m_jid.full() ); + else + new Tag( t, "resource", m_resource ); + + return t; + } + // ---- ~Client::ResourceBind ---- + + // ---- Client::SessionCreation ---- + Tag* Client::SessionCreation::tag() const + { + Tag* t = new Tag( "session" ); + t->setXmlns( XMLNS_STREAM_SESSION ); + return t; + } + // ---- Client::SessionCreation ---- + + // ---- Client ---- + Client::Client( const std::string& server ) + : ClientBase( XMLNS_CLIENT, server ), + m_rosterManager( 0 ), m_auth( 0 ), + m_presence( Presence::Available, JID() ), m_resourceBound( false ), + m_forceNonSasl( false ), m_manageRoster( true ), + m_smId( EmptyString ), m_smLocation( EmptyString ), m_smResume( false ), m_smWanted( false ), m_smMax( 0 ), + m_streamFeatures( 0 ) + { + m_jid.setServer( server ); + init(); + } + + Client::Client( const JID& jid, const std::string& password, int port ) + : ClientBase( XMLNS_CLIENT, password, EmptyString, port ), + m_rosterManager( 0 ), m_auth( 0 ), + m_presence( Presence::Available, JID() ), m_resourceBound( false ), + m_forceNonSasl( false ), m_manageRoster( true ), + m_smId( EmptyString ), m_smLocation( EmptyString ), m_smResume( false ), m_smWanted( false ), m_smMax( 0 ), + m_streamFeatures( 0 ) + { + m_jid = jid; + m_server = m_jid.serverRaw(); + init(); + } + + Client::~Client() + { + delete m_rosterManager; + delete m_auth; + } + + void Client::init() + { + m_rosterManager = new RosterManager( this ); + m_disco->setIdentity( "client", "bot" ); + registerStanzaExtension( new ResourceBind( 0 ) ); + registerStanzaExtension( new Capabilities() ); + m_presenceExtensions.push_back( new Capabilities( m_disco ) ); + } + + void Client::setUsername( const std::string &username ) + { + m_jid.setUsername( username ); + } + + bool Client::handleNormalNode( Tag* tag ) + { + if( tag->name() == "features" && tag->xmlns() == XMLNS_STREAM ) + { + m_streamFeatures = getStreamFeatures( tag ); + + if( m_tls == TLSRequired && !m_encryptionActive + && ( !m_encryption || !( m_streamFeatures & StreamFeatureStartTls ) ) ) + { + logInstance().err( LogAreaClassClient, "Client is configured to require" + " TLS but either the server didn't offer TLS or" + " TLS support is not compiled in." ); + disconnect( ConnTlsNotAvailable ); + } + else if( m_tls > TLSDisabled && m_encryption && !m_encryptionActive + && ( m_streamFeatures & StreamFeatureStartTls ) ) + { + notifyStreamEvent( StreamEventEncryption ); + startTls(); + } + else if( m_compress && m_compression && !m_compressionActive + && ( m_streamFeatures & StreamFeatureCompressZlib ) ) + { + notifyStreamEvent( StreamEventCompression ); + logInstance().warn( LogAreaClassClient, "The server offers compression, but negotiating Compression at this stage is not recommended. See XEP-0170 for details. We'll continue anyway." ); + negotiateCompression( StreamFeatureCompressZlib ); + } + else if( m_sasl ) + { + if( m_authed ) + { + if( m_streamFeatures & StreamFeatureStreamManagement && m_smWanted && m_smContext >= CtxSMEnabled ) + { + sendStreamManagement(); + } + else if( m_streamFeatures & StreamFeatureBind && m_smContext < CtxSMEnabled ) + { + notifyStreamEvent( StreamEventResourceBinding ); + bindResource( resource() ); + } + } + else if( !username().empty() && !password().empty() ) + { + if( !login() ) + { + logInstance().err( LogAreaClassClient, "The server doesn't support" + " any auth mechanisms we know about" ); + disconnect( ConnNoSupportedAuth ); + } + } + else if( !m_clientCerts.empty() && !m_clientKey.empty() + && m_streamFeatures & SaslMechExternal && m_availableSaslMechs & SaslMechExternal ) + { + notifyStreamEvent( StreamEventAuthentication ); + startSASL( SaslMechExternal ); + } +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + else if( m_streamFeatures & SaslMechGssapi && m_availableSaslMechs & SaslMechGssapi ) + { + notifyStreamEvent( StreamEventAuthentication ); + startSASL( SaslMechGssapi ); + } + else if( m_streamFeatures & SaslMechNTLM && m_availableSaslMechs & SaslMechNTLM ) + { + notifyStreamEvent( StreamEventAuthentication ); + startSASL( SaslMechNTLM ); + } +#endif + else if( m_streamFeatures & SaslMechAnonymous + && m_availableSaslMechs & SaslMechAnonymous ) + { + notifyStreamEvent( StreamEventAuthentication ); + startSASL( SaslMechAnonymous ); + } + else + { + notifyStreamEvent( StreamEventFinished ); + connected(); + } + } + else if( m_compress && m_compression && !m_compressionActive + && ( m_streamFeatures & StreamFeatureCompressZlib ) ) + { + notifyStreamEvent( StreamEventCompression ); + negotiateCompression( StreamFeatureCompressZlib ); + } +// else if( ( m_streamFeatures & StreamFeatureCompressDclz ) +// && m_connection->initCompression( StreamFeatureCompressDclz ) ) +// { +// negotiateCompression( StreamFeatureCompressDclz ); +// } + else if( m_streamFeatures & StreamFeatureIqAuth ) + { + notifyStreamEvent( StreamEventAuthentication ); + nonSaslLogin(); + } + else + { + logInstance().err( LogAreaClassClient, "fallback: the server doesn't " + "support any auth mechanisms we know about" ); + disconnect( ConnNoSupportedAuth ); + } + } + else + { + const std::string& name = tag->name(), + xmlns = tag->findAttribute( XMLNS ); + if( name == "proceed" && xmlns == XMLNS_STREAM_TLS ) + { + logInstance().dbg( LogAreaClassClient, "starting TLS handshake..." ); + + if( m_encryption ) + { + m_encryptionActive = true; + m_encryption->handshake(); + } + } + else if( name == "failure" ) + { + if( xmlns == XMLNS_STREAM_TLS ) + { + logInstance().err( LogAreaClassClient, "TLS handshake failed (server-side)!" ); + disconnect( ConnTlsFailed ); + } + else if( xmlns == XMLNS_COMPRESSION ) + { + logInstance().err( LogAreaClassClient, "Stream compression init failed!" ); + disconnect( ConnCompressionFailed ); + } + else if( xmlns == XMLNS_STREAM_SASL ) + { + logInstance().err( LogAreaClassClient, "SASL authentication failed!" ); + processSASLError( tag ); + disconnect( ConnAuthenticationFailed ); + } + } + else if( name == "compressed" && xmlns == XMLNS_COMPRESSION ) + { + logInstance().dbg( LogAreaClassClient, "Stream compression initialized" ); + m_compressionActive = true; + header(); + } + else if( name == "challenge" && xmlns == XMLNS_STREAM_SASL ) + { + logInstance().dbg( LogAreaClassClient, "Processing SASL challenge" ); + processSASLChallenge( tag->cdata() ); + } + else if( name == "success" && xmlns == XMLNS_STREAM_SASL ) + { + if( !processSASLSuccess( tag->cdata() ) ) + { + logInstance().err( LogAreaClassClient, "The Server response could not be verified!" ); + disconnect( ConnAuthenticationFailed ); + return false; + } + + logInstance().dbg( LogAreaClassClient, "SASL authentication successful" ); + setAuthed( true ); + header(); + } + else if( name == "enabled" && xmlns == XMLNS_STREAM_MANAGEMENT ) + { + m_smContext = CtxSMEnabled; + m_smMax = atoi( tag->findAttribute( "max" ).c_str() ); + m_smId = tag->findAttribute( "id" ); + const std::string res = tag->findAttribute( "resume" ); + m_smResume = ( ( res == "true" || res == "1" ) && !m_smId.empty() ) ? true : false; + m_smLocation = tag->findAttribute( "location" ); + + if( m_streamFeatures & StreamFeatureSession ) + createSession(); + else + connected(); + } + else if( name == "resumed" && xmlns == XMLNS_STREAM_MANAGEMENT && m_smContext == CtxSMResume ) + { + if( tag->findAttribute( "previd" ) == m_smId ) + { + m_smContext = CtxSMResumed; + notifyStreamEvent( StreamEventSMResumed ); + int h = atoi( tag->findAttribute( "h" ).c_str() ); + connected(); + checkQueue( h, true ); + } + } + else if( name == "a" && xmlns == XMLNS_STREAM_MANAGEMENT && m_smContext >= CtxSMEnabled ) + { + int h = atoi( tag->findAttribute( "h" ).c_str() ); + checkQueue( h, false ); + } + else if( name == "r" && xmlns == XMLNS_STREAM_MANAGEMENT ) + { + ackStreamManagement(); + } + else if( name == "failed" && xmlns == XMLNS_STREAM_MANAGEMENT ) + { + switch( m_smContext ) + { + case CtxSMEnable: + notifyStreamEvent( StreamEventSMEnableFailed ); + break; + case CtxSMResume: + notifyStreamEvent( StreamEventSMResumeFailed ); + break; + default: + break; + } + m_smContext = CtxSMFailed; + } + else + return false; + } + + return true; + } + + int Client::getStreamFeatures( Tag* tag ) + { + if( tag->name() != "features" || tag->xmlns() != XMLNS_STREAM ) + return 0; + + int features = 0; + + if( tag->hasChild( "starttls", XMLNS, XMLNS_STREAM_TLS ) ) + features |= StreamFeatureStartTls; + + if( tag->hasChild( "mechanisms", XMLNS, XMLNS_STREAM_SASL ) ) + features |= getSaslMechs( tag->findChild( "mechanisms" ) ); + + if( tag->hasChild( "bind", XMLNS, XMLNS_STREAM_BIND ) ) + features |= StreamFeatureBind; + + if( tag->hasChild( "unbind", XMLNS, XMLNS_STREAM_BIND ) ) + features |= StreamFeatureUnbind; + + if( tag->hasChild( "session", XMLNS, XMLNS_STREAM_SESSION ) ) + features |= StreamFeatureSession; + + if( tag->hasChild( "auth", XMLNS, XMLNS_STREAM_IQAUTH ) ) + features |= StreamFeatureIqAuth; + + if( tag->hasChild( "register", XMLNS, XMLNS_STREAM_IQREGISTER ) ) + features |= StreamFeatureIqRegister; + + if( tag->hasChild( "compression", XMLNS, XMLNS_STREAM_COMPRESS ) ) + features |= getCompressionMethods( tag->findChild( "compression" ) ); + + if( tag->hasChild( "sm", XMLNS, XMLNS_STREAM_MANAGEMENT ) ) + features |= StreamFeatureStreamManagement; + + if( features == 0 ) + features = StreamFeatureIqAuth; + + return features; + } + + int Client::getSaslMechs( Tag* tag ) + { + int mechs = SaslMechNone; + + const std::string mech = "mechanism"; + + if( tag->hasChildWithCData( mech, "SCRAM-SHA-1-PLUS" ) ) + mechs |= SaslMechScramSha1Plus; + + if( tag->hasChildWithCData( mech, "SCRAM-SHA-1" ) ) + mechs |= SaslMechScramSha1; + + if( tag->hasChildWithCData( mech, "DIGEST-MD5" ) ) + mechs |= SaslMechDigestMd5; + + if( tag->hasChildWithCData( mech, "PLAIN" ) ) + mechs |= SaslMechPlain; + + if( tag->hasChildWithCData( mech, "ANONYMOUS" ) ) + mechs |= SaslMechAnonymous; + + if( tag->hasChildWithCData( mech, "EXTERNAL" ) ) + mechs |= SaslMechExternal; + + if( tag->hasChildWithCData( mech, "GSSAPI" ) ) + mechs |= SaslMechGssapi; + + if( tag->hasChildWithCData( mech, "NTLM" ) ) + mechs |= SaslMechNTLM; + + return mechs; + } + + int Client::getCompressionMethods( Tag* tag ) + { + int meths = 0; + + if( tag->hasChildWithCData( "method", "zlib" ) ) + meths |= StreamFeatureCompressZlib; + + if( tag->hasChildWithCData( "method", "lzw" ) ) + meths |= StreamFeatureCompressDclz; + + return meths; + } + + bool Client::login() + { + bool retval = true; + + if( ( m_streamFeatures & SaslMechScramSha1Plus && m_availableSaslMechs & SaslMechScramSha1Plus + && m_encryption && m_encryptionActive && m_encryption->hasChannelBinding() ) + && !m_forceNonSasl ) + { + notifyStreamEvent( StreamEventAuthentication ); + startSASL(SaslMechScramSha1Plus); + } + else if( m_streamFeatures & SaslMechScramSha1 && m_availableSaslMechs & SaslMechScramSha1 + && !m_forceNonSasl ) + { + notifyStreamEvent( StreamEventAuthentication ); + startSASL( SaslMechScramSha1 ); + } + else if( m_streamFeatures & SaslMechDigestMd5 && m_availableSaslMechs & SaslMechDigestMd5 + && !m_forceNonSasl ) + { + notifyStreamEvent(StreamEventAuthentication); + startSASL(SaslMechDigestMd5); + } + else if( m_streamFeatures & SaslMechPlain && m_availableSaslMechs & SaslMechPlain + && !m_forceNonSasl ) + { + notifyStreamEvent( StreamEventAuthentication ); + startSASL( SaslMechPlain ); + } + else if( m_streamFeatures & StreamFeatureIqAuth || m_forceNonSasl ) + { + notifyStreamEvent( StreamEventAuthentication ); + nonSaslLogin(); + } + else + retval = false; + + return retval; + } + + void Client::handleIqIDForward( const IQ& iq, int context ) + { + switch( context ) + { + case CtxResourceUnbind: + // we don't store known resources anyway + break; + case CtxResourceBind: + processResourceBind( iq ); + break; + case CtxSessionEstablishment: + processCreateSession( iq ); + break; + default: + break; + } + } + + bool Client::bindOperation( const std::string& resource, bool bind ) + { + if( !( m_streamFeatures & StreamFeatureUnbind ) && m_resourceBound ) + return false; + + IQ iq( IQ::Set, JID(), getID() ); + iq.addExtension( new ResourceBind( resource, bind ) ); + + send( iq, this, bind ? CtxResourceBind : CtxResourceUnbind ); + return true; + } + + bool Client::selectResource( const std::string& resource ) + { + m_selectedResource = resource; // TODO: remove for 1.1 + m_jid.setResource( resource ); + + if( !( m_streamFeatures & StreamFeatureUnbind ) ) + return false; + + return true; + } + + void Client::processResourceBind( const IQ& iq ) + { + switch( iq.subtype() ) + { + case IQ::Result: + { + const ResourceBind* rb = iq.findExtension( ExtResourceBind ); + if( !rb || !rb->jid() ) + { + notifyOnResourceBindError( 0 ); + break; + } + + m_jid = rb->jid(); + m_resourceBound = true; + m_selectedResource = m_jid.resource(); // TODO: remove for 1.1 + notifyOnResourceBind( m_jid.resource() ); + + if( m_streamFeatures & StreamFeatureStreamManagement && m_smWanted ) + sendStreamManagement(); + else if( m_streamFeatures & StreamFeatureSession ) + createSession(); + else + connected(); + break; + } + case IQ::Error: + { + notifyOnResourceBindError( iq.error() ); + break; + } + default: + break; + } + } + + void Client::setStreamManagement( bool enable, bool resume ) + { + m_smWanted = enable; + m_smResume = resume; + + if( !m_smWanted ) + { + m_smId = EmptyString; + m_smLocation = EmptyString; + m_smMax = 0; + m_smResume = false; + return; + } + + if( m_smWanted && m_resourceBound ) + sendStreamManagement(); + } + + void Client::sendStreamManagement() + { + if( !m_smWanted ) + return; + + if( m_smContext == CtxSMInvalid ) + { + notifyStreamEvent( StreamEventSMEnable ); + Tag* e = new Tag( "enable" ); + e->setXmlns( XMLNS_STREAM_MANAGEMENT ); + if( m_smResume ) + e->addAttribute( "resume", "true" ); + send( e ); + m_smContext = CtxSMEnable; + m_smHandled = 0; + } + else if( m_smContext == CtxSMEnabled ) + { + notifyStreamEvent( StreamEventSMResume ); + Tag* r = new Tag( "resume" ); + r->setXmlns( XMLNS_STREAM_MANAGEMENT ); + r->addAttribute( "h", m_smHandled ); + r->addAttribute( "previd", m_smId ); + send( r ); + m_smContext = CtxSMResume; + } + } + + void Client::ackStreamManagement() + { + if( m_smContext >= CtxSMEnabled ) + { + Tag* a = new Tag( "a", "xmlns", XMLNS_STREAM_MANAGEMENT ); + a->addAttribute( "h", m_smHandled ); + send( a ); + } + } + + void Client::reqStreamManagement() + { + if( m_smContext >= CtxSMEnabled ) + { + Tag* r = new Tag( "r", "xmlns", XMLNS_STREAM_MANAGEMENT ); + send( r ); + } + } + + void Client::createSession() + { + notifyStreamEvent( StreamEventSessionCreation ); + IQ iq( IQ::Set, JID(), getID() ); + iq.addExtension( new SessionCreation() ); + send( iq, this, CtxSessionEstablishment ); + } + + void Client::processCreateSession( const IQ& iq ) + { + switch( iq.subtype() ) + { + case IQ::Result: + connected(); + break; + case IQ::Error: + notifyOnSessionCreateError( iq.error() ); + break; + default: + break; + } + } + + void Client::negotiateCompression( StreamFeature method ) + { + Tag* t = new Tag( "compress", XMLNS, XMLNS_COMPRESSION ); + + if( method == StreamFeatureCompressZlib ) + new Tag( t, "method", "zlib" ); + + if( method == StreamFeatureCompressDclz ) + new Tag( t, "method", "lzw" ); + + send( t ); + } + + void Client::setPresence( Presence::PresenceType pres, int priority, + const std::string& status ) + { + m_presence.setPresence( pres ); + m_presence.setPriority( priority ); + m_presence.addStatus( status ); + sendPresence(m_presence); + } + + void Client::setPresence( const JID& to, Presence::PresenceType pres, int priority, + const std::string& status ) + { + Presence p( pres, to, status, priority ); + sendPresence(p); + } + + void Client::sendPresence( Presence& pres ) + { + if( state() < StateConnected ) + return; + + send( pres ); + } + + void Client::disableRoster() + { + m_manageRoster = false; + delete m_rosterManager; + m_rosterManager = 0; + } + + void Client::nonSaslLogin() + { + if( !m_auth ) + m_auth = new NonSaslAuth( this ); + m_auth->doAuth( m_sid ); + } + + void Client::connected() + { + if( m_authed && m_smContext != CtxSMResumed ) + { + if( m_manageRoster ) + { + notifyStreamEvent( StreamEventRoster ); + m_rosterManager->fill(); + } + else + rosterFilled(); + } + else + { + notifyStreamEvent( StreamEventFinished ); + notifyOnConnect(); + } + } + + void Client::rosterFilled() + { + sendPresence(m_presence); + notifyStreamEvent( StreamEventFinished ); + notifyOnConnect(); + } + + void Client::disconnect() + { + m_smContext = CtxSMInvalid; + m_smHandled = 0; + m_smId = EmptyString; + m_smLocation = EmptyString; + m_smMax = 0; + m_smResume = false; + m_smWanted = false; + + disconnect( ConnUserDisconnected ); + } + + void Client::disconnect( ConnectionError reason ) + { + m_resourceBound = false; + m_authed = false; + m_streamFeatures = 0; + ClientBase::disconnect( reason ); + } + + void Client::cleanup() + { + m_authed = false; + m_resourceBound = false; + m_streamFeatures = 0; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/client.h b/smack/smack/src/main/cpp/gloox/src/client.h new file mode 100644 index 00000000..098a481a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/client.h @@ -0,0 +1,502 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CLIENT_H__ +#define CLIENT_H__ + +#include "clientbase.h" +#include "presence.h" + +#include + +namespace gloox +{ + + class Capabilities; + class RosterManager; + class NonSaslAuth; + class IQ; + + /** + * @brief This class implements a basic Jabber/XMPP Client. + * + * It supports @ref sasl_auth as well as TLS (Encryption), which can be + * switched on/off separately. They are used automatically if the server supports them. + * + * To use, create a new Client instance and feed it connection credentials, either in the Constructor or + * afterwards using the setters. You should then register packet handlers implementing the corresponding + * Interfaces (ConnectionListener, PresenceHandler, MessageHandler, IqHandler, SubscriptionHandler), + * and call @ref connect() to establish the connection to the server. + * + * @note While the MessageHandler interface is still available (and will be in future versions) + * it is now recommended to use the new @link gloox::MessageSession MessageSession @endlink for any + * serious messaging. + * + * Simple usage example: + * @code + * using namespace gloox; + * + * void TestProg::doIt() + * { + * Client* j = new Client( "user@server/resource", "password" ); + * j->registerPresenceHandler( this ); + * j->disco()->setVersion( "TestProg", "1.0" ); + * j->disco()->setIdentity( "client", "bot" ); + * j->connect(); + * } + * + * virtual void TestProg::presenceHandler( Presence* presence ) + * { + * // handle incoming presence packets here + * } + * @endcode + * + * However, you can skip the presence handling stuff if you make use of the RosterManager. + * + * By default, the library handles a few (incoming) IQ namespaces on the application's behalf. These + * include: + * @li jabber:iq:roster: by default the server-side roster is fetched and handled. Use + * @ref rosterManager() and @ref RosterManager to interact with the Roster. + * @li @xep{0092} (Software Version): If no version is specified, a name of "based on gloox" with + * gloox's current version is announced. + * @li @xep{0030} (Service Discovery): All supported/available services are announced. No items are + * returned. + * @note As of gloox 0.9, by default a priority of 0 is sent along with the initial presence. + * @note As of gloox 0.9, initial presence is automatically sent. Presence: available, Priority: 0. + * To disable sending of initial Presence use setPresence() with a value of Unavailable + * prior to connecting. + * + * @section sasl_auth SASL Authentication + * + * Besides the simple, IQ-based authentication (@xep{0078}), gloox supports several SASL (Simple + * Authentication and Security Layer, RFC 2222) authentication mechanisms. + * @li DIGEST-MD5: This mechanism is preferred over all other mechanisms if username and password are + * provided to the Client instance. It is secure even without TLS encryption. + * @li PLAIN: This mechanism is used if DIGEST-MD5 is not available. It is @b not secure without + * encryption. + * @li ANONYMOUS This mechanism is used if neither username nor password are set. The server generates + * random, temporary username and resource and may restrict available services. + * @li EXTERNAL This mechanism is currently only available if client certificate and private key + * are provided. The server tries to figure out who the client is by external means -- for instance, + * using the provided certificate or even the IP address. (The restriction to certificate/key + * availability is likely to be lifted in the future.) + * + * Of course, all these mechanisms are not tried unless the server offers them. + * + * @section stream_management Stream Management + * + * To enable Stream Management (@xep{0198}), call @ref setStreamManagement() with the first parameter set to @b true + * at any time. This will tell the server to enable Stream Management, if the feature is available. Once switched on, + * Stream Management can not be disabled for a given active stream. However, setting the first + * parameter to @b false, it can be disabled inside gloox so that Stream Management will not be used + * for subsequent connections. + * + * To enable the stream resumption feature, pass @b true as the second parameter to @ref setStreamManagement(). + * Upon re-connect after an unexpected (i.e. neither user-triggered nor server-triggered) disconnect, gloox will try + * to resume the stream and re-send any non-acknowledged stanzas automatically. + * For stream resumption to work you have to re-connect using the very same Client instance. + * + * After an unexpected disconnect you may check the send queue using @link ClientBase::sendQueue() sendQueue() @endlink. + * Stanzas in the queue have been sent but not yet acknowledged by the server. Depending on the circumstances of the + * disconnect, this does not mean that those stanzas have not been received by the recipient. + * + * + * @author Jakob Schröter + */ + class GLOOX_API Client : public ClientBase + { + public: + + friend class NonSaslAuth; + friend class Parser; + + /** + * Constructs a new Client which can be used for account registration only. + * SASL and TLS are on by default. The port will be determined by looking up SRV records. + * Alternatively, you can set the port explicitly by calling @ref setPort(). + * @param server The server to connect to. + */ + Client( const std::string& server ); + + /** + * Constructs a new Client. + * SASL and TLS are on by default. This should be the default constructor for most use cases. + * The server address will be taken from the JID. The actual host will be resolved using SRV + * records. The domain part of the JID is used as a fallback in case no SRV record is found, or + * you can set the server address separately by calling @ref setServer(). + * @param jid A full Jabber ID used for connecting to the server. + * @param password The password used for authentication. + * @param port The port to connect to. The default of -1 means to look up the port via DNS SRV. + */ + Client( const JID& jid, const std::string& password, int port = -1 ); + + /** + * Virtual destructor. + */ + virtual ~Client(); + + /** + * Use this function to bind an additional resource or to @b re-try to bind a + * resource in case previous binding failed and you were notified by means of + * ConnectionListener::onResourceBindError(). Use hasResourceBind() to find out if the + * server supports binding of multiple resources. bindResource() is a NOOP if it doesn't. + * @note ConnectionListener::onResourceBound() and ConnectionListener::onResourceBindError() + * will be called in case of success and failure, respectively. + * @param resource The resource identifier to bind. May be empty. In that case + * the server will assign a unique resource identifier. + * @return Returns @b true if binding of multiple resources is supported, @b false + * otherwise. A return value of @b true does not indicate that the resource was + * successfully bound. + * @note It is not necessary to call this function to bind the initial, main, resource. + * @since 1.0 + */ + bool bindResource( const std::string& resource ) + { return bindOperation( resource, true ); } + + /** + * Use this function to select a resource identifier that has been bound + * previously by means of bindResource(). It is not necessary to call this function + * if only one resource is bound. Use hasResourceBind() to find out if the + * server supports binding of multiple resources. + * @param resource A resource string that has been bound previously. + * @note If the resource string has not been bound previously, future sending of + * stanzas will fail. + */ + bool selectResource( const std::string& resource ); + + /** + * This function can be used to find out whether the server supports binding of multiple + * resources. + * @return @b True if binding of multiple resources is supported by the server, + * @b false otherwise. + */ + bool hasResourceBind() const { return ((m_streamFeatures & StreamFeatureUnbind) == StreamFeatureUnbind); } + + /** + * Use this function to unbind a resource identifier that has been bound + * previously by means of bindResource(). Use hasResourceBind() to find out if the + * server supports binding of multiple resources. unbindResource() is a NOOP if it doesn't. + * @param resource A resource string that has been bound previously. + * @note Servers are encouraged to terminate the connection should the only bound + * resource be unbound. + */ + bool unbindResource( const std::string& resource ) + { return bindOperation( resource, false ); } + + /** + * Returns the current prepped main resource. + * @return The resource used to connect. + */ + const std::string& resource() const { return m_jid.resource(); } + + /** + * This function enables Stream Management (@xep{0198}) if the server supports it. + * Optionally, stream resumption can be disabled. + * @note You can use this function at any time. However, gloox will make sure Stream Management + * requests are sent only when allowed by the specification. + * @param enable Enable or disable Stream Management. Note: once enabled on a connection, Stream + * Management can not be disabled for that connection. + * @param resume Tells the server whether to enable stream resumption. Defaults to @b true. + * @note This function is part of @xep{0198}. + * @since 1.0.4 + */ + void setStreamManagement( bool enable = true, bool resume = true ); + + /** + * Use this function to send an unrequested 'ack' to the server to let it know the number of handled stanzas. + * You may use this function at any time. However, gloox will also reply to incoming 'ack requests' automatically. + * These automatic 'acks' are not announced anywhere in gloox. + * This function is a no-op if called in situations where sending an ack is not + * allowed by the protocol. + * @note This function is part of @xep{0198}. + * @since 1.0.4 + */ + void ackStreamManagement(); + + /** + * Use this function to request the number of handled stanzas from the server. + * You may use this function at any time. gloox does not send any such requests + * automatically. + * @note This function is part of @xep{0198}. + * @since 1.0.4 + */ + void reqStreamManagement(); + + /** + * Returns the current priority. + * @return The priority of the current resource. + */ + int priority() const { return m_presence.priority(); } + + /** + * Sets the username to use to connect to the XMPP server. + * @param username The username to authenticate with. + */ + void setUsername( const std::string &username ); + + /** + * Sets the main resource to use to connect to the XMPP server. + * @param resource The resource to use to log into the server. + */ + void setResource( const std::string &resource ) { m_jid.setResource( resource ); } + + /** + * Sends directed presence to the given JID. This is a NOOP if there's no active connection. + * To broadcast presence use setPresence( Presence::PresenceType, int, const std::string& ). + * @param to The JID to send directed Presence to. + * @param pres The presence to send. + * @param priority The priority to include. Legal values: -128 <= priority <= 127 + * @param status The optional status message to include. + * @note This function does not include any presence extensions (as added by + * means of addPresenceExtension()) to the stanza. + */ + void setPresence( const JID& to, Presence::PresenceType pres, int priority, + const std::string& status = EmptyString ); + + /** + * Use this function to set the entity's presence, that is, to broadcast presence to all + * subscribed entities. To send directed presence, use + * setPresence( const JID&, Presence::PresenceType, int, const std::string& ). + * If used prior to establishing a connection, the set values will be sent with + * the initial presence stanza. + * If used while a connection already is established, a presence stanza will be + * sent out immediately. + * @param pres The Presence value to set. + * @param priority An optional priority value. Legal values: -128 <= priority <= 127 + * @param status An optional message describing the presence state. + * @since 0.9 + */ + void setPresence( Presence::PresenceType pres, int priority, + const std::string& status = EmptyString ); + + /** + * Use this function to broadcast the entity's presence to all + * subscribed entities. This is a NOOP if there's no active connection. + * To send directed presence, use + * setPresence( const JID&, Presence::PresenceType, int, const std::string& ). + * If used while a connection already is established a repective presence stanza will be + * sent out immediately. Use presence() to modify the Presence object. + * @note When login is finished, initial presence will be sent automatically. + * So you do not need to call this function after login. + * @since 1.0 + */ + void setPresence() { sendPresence( m_presence ); } + + /** + * Returns the current presence. + * @return The current presence. + */ + Presence& presence() { return m_presence; } + + /** + * This is a temporary hack to enforce Non-SASL login. You should not need to use it. + * @param force Whether to force non-SASL auth. Default @b true. + * @deprecated Please update the server to properly support SASL instead. + */ + GLOOX_DEPRECATED void setForceNonSasl( bool force = true ) { m_forceNonSasl = force; } + + /** + * Disables the automatic roster management. + * You have to keep track of incoming presence yourself if + * you want to have a roster. + */ + void disableRoster(); + + /** + * This function gives access to the @c RosterManager object. + * @return A pointer to the RosterManager. + */ + RosterManager* rosterManager() { return m_rosterManager; } + + /** + * Disconnects from the server. + */ + void disconnect(); + + /** + * Initiates a login attempt (currently SASL External not supported). + * This is useful after registering a new account. Simply use setUsername() and setPassword(), + * and call login(). + * @return @b True if a login attempt could be started, @b false otherwise. A return + * value of @b true does not indicate that login was successful. + */ + bool login(); + + protected: + /** + * Initiates non-SASL login. + */ + void nonSaslLogin(); + + private: +#ifdef CLIENT_TEST + public: +#endif + /** + * @brief This is an implementation of a resource binding StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class ResourceBind : public StanzaExtension + { + + public: + /** + * Constructs a new object with the given resource string. + * @param resource The resource to set. + * @param bind Indicates whether this is an bind or unbind request. + * Defaults to @b true (bind). + */ + ResourceBind( const std::string& resource, bool bind = true ); + + /** + * Constructs a new object from the given Tag. + * @param tag The Tag to parse. + */ + ResourceBind( const Tag* tag ); + + /** + * Destructor. + */ + ~ResourceBind(); + + /** + * Returns the requested resource. + * @return The requested resource. + */ + const std::string& resource() const { return m_resource; } + + /** + * Returns the assigned JID. + * @return The assigned JID. + */ + const JID& jid() const { return m_jid; } + + /** + * Use this function to find out whether the extension contains a + * bind or unbind request. + * @return @b True if the extension contains an unbind request, @b false otherwise. + */ + bool unbind() const { return !m_bind; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new ResourceBind( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new ResourceBind( *this ); + } + + private: + std::string m_resource; + JID m_jid; + bool m_bind; + }; + + /** + * @brief This is an implementation of a session creating StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class SessionCreation : public StanzaExtension + { + + public: + /** + * Constructs a new object. + */ + SessionCreation() : StanzaExtension( ExtSessionCreation ) {} + + /** + * Destructor. + */ + ~SessionCreation() {} + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const { return EmptyString; } + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { (void)tag; return 0; } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { return 0; } + + }; + + virtual void handleStartNode( const Tag* /*start*/ ) {} + virtual bool handleNormalNode( Tag* tag ); + virtual void disconnect( ConnectionError reason ); + virtual void handleIqIDForward( const IQ& iq, int context ); + + int getStreamFeatures( Tag* tag ); + int getSaslMechs( Tag* tag ); + int getCompressionMethods( Tag* tag ); + void processResourceBind( const IQ& iq ); + void processCreateSession( const IQ& iq ); + void sendPresence( Presence& pres ); + void createSession(); + void negotiateCompression( StreamFeature method ); + void connected(); + virtual void rosterFilled(); + virtual void cleanup(); + bool bindOperation( const std::string& resource, bool bind ); + void sendStreamManagement(); + + void init(); + + enum TrackContext + { + CtxResourceBind = 1000, // must be higher than the last element in ClientBase's TrackContext + CtxResourceUnbind, + CtxSessionEstablishment + }; + + RosterManager* m_rosterManager; + NonSaslAuth* m_auth; + + Presence m_presence; + + bool m_resourceBound; + bool m_forceNonSasl; + bool m_manageRoster; + + std::string m_smId; + std::string m_smLocation; + bool m_smResume; + bool m_smWanted; + int m_smMax; + + int m_streamFeatures; + + }; + +} + +#endif // CLIENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/clientbase.cpp b/smack/smack/src/main/cpp/gloox/src/clientbase.cpp new file mode 100644 index 00000000..45bfe0cd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/clientbase.cpp @@ -0,0 +1,1826 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "config.h" + +#include "base64.h" +#include "clientbase.h" +#include "compressionbase.h" +#include "compressionzlib.h" +#include "connectionbase.h" +#include "connectionlistener.h" +#include "connectiontcpclient.h" +#include "disco.h" +#include "error.h" +#include "eventhandler.h" +#include "event.h" +#include "iq.h" +#include "iqhandler.h" +#include "jid.h" +#include "loghandler.h" +#include "md5.h" +#include "message.h" +#include "messagehandler.h" +#include "messagesessionhandler.h" +#include "mucinvitationhandler.h" +#include "mucroom.h" +#include "mutexguard.h" +#include "presence.h" +#include "presencehandler.h" +#include "rosterlistener.h" +#include "stanzaextensionfactory.h" +#include "sha.h" +#include "subscription.h" +#include "subscriptionhandler.h" +#include "tag.h" +#include "taghandler.h" +#include "tlsbase.h" +#include "tlsdefault.h" +#include "prep.h" +#include "util.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include // for memset() + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +#include +# ifdef __MINGW32__ +# ifndef SecureZeroMemory +# define SecureZeroMemory(p,s) RtlFillMemory((p),(s),0) +# endif +# endif +#endif + +namespace gloox +{ + + // ---- ClientBase::Ping ---- + ClientBase::Ping::Ping() + : StanzaExtension( ExtPing ) + { + } + + ClientBase::Ping::~Ping() + { + } + + const std::string& ClientBase::Ping::filterString() const + { + static const std::string filter = "/iq/ping[@xmlns='" + XMLNS_XMPP_PING + "']"; + return filter; + } + // ---- ~ClientBase::Ping ---- + + // ---- ClientBase ---- + ClientBase::ClientBase( const std::string& ns, const std::string& server, int port ) + : m_connection( 0 ), m_encryption( 0 ), m_compression( 0 ), m_disco( 0 ), m_namespace( ns ), + m_xmllang( "en" ), m_server( server ), m_compressionActive( false ), m_encryptionActive( false ), + m_compress( true ), m_authed( false ), m_block( false ), m_sasl( true ), m_tls( TLSOptional ), m_port( port ), + m_availableSaslMechs( SaslMechAll ), m_smContext( CtxSMInvalid ), m_smHandled( 0 ), + m_statisticsHandler( 0 ), m_mucInvitationHandler( 0 ), + m_messageSessionHandlerChat( 0 ), m_messageSessionHandlerGroupchat( 0 ), + m_messageSessionHandlerHeadline( 0 ), m_messageSessionHandlerNormal( 0 ), + m_parser( this ), m_seFactory( 0 ), m_authError( AuthErrorUndefined ), + m_streamError( StreamErrorUndefined ), m_streamErrorAppCondition( 0 ), + m_selectedSaslMech( SaslMechNone ), m_customConnection( false ), + m_uniqueBaseId( (unsigned int)( ( (unsigned long long)time( 0 ) & 0xFFFF ) << 16 ) | ( ( (unsigned long long) & m_nextId ) & 0xFFFF ) ), + m_smSent( 0 ) + { + init(); + } + + ClientBase::ClientBase( const std::string& ns, const std::string& password, + const std::string& server, int port ) + : m_connection( 0 ), m_encryption( 0 ), m_compression( 0 ), m_disco( 0 ), m_namespace( ns ), + m_password( password ), + m_xmllang( "en" ), m_server( server ), m_compressionActive( false ), m_encryptionActive( false ), + m_compress( true ), m_authed( false ), m_block( false ), m_sasl( true ), m_tls( TLSOptional ), + m_port( port ), m_availableSaslMechs( SaslMechAll ), m_smContext( CtxSMInvalid ), m_smHandled( 0 ), + m_statisticsHandler( 0 ), m_mucInvitationHandler( 0 ), + m_messageSessionHandlerChat( 0 ), m_messageSessionHandlerGroupchat( 0 ), + m_messageSessionHandlerHeadline( 0 ), m_messageSessionHandlerNormal( 0 ), + m_parser( this ), m_seFactory( 0 ), m_authError( AuthErrorUndefined ), + m_streamError( StreamErrorUndefined ), m_streamErrorAppCondition( 0 ), + m_selectedSaslMech( SaslMechNone ), m_customConnection( false ), + m_uniqueBaseId( (unsigned int)( ( (unsigned long long)time( 0 ) & 0xFFFF ) << 16 ) | ( ( (unsigned long long) & m_nextId ) & 0xFFFF ) ), + m_smSent( 0 ) + { + init(); + } + + void ClientBase::init() + { + srand( time( 0 ) ); + + if( !m_disco ) + { + m_disco = new Disco( this ); + m_disco->setVersion( "based on gloox", GLOOX_VERSION ); + m_disco->addFeature( XMLNS_XMPP_PING ); + } + + registerStanzaExtension( new Error() ); + registerStanzaExtension( new Ping() ); + registerIqHandler( this, ExtPing ); + + m_streamError = StreamErrorUndefined; + m_block = false; + memset( &m_stats, 0, sizeof( m_stats ) ); + cleanup(); + } + + ClientBase::~ClientBase() + { + m_iqHandlerMapMutex.lock(); + m_iqIDHandlers.clear(); + m_iqHandlerMapMutex.unlock(); + + m_iqExtHandlerMapMutex.lock(); + m_iqExtHandlers.clear(); + m_iqExtHandlerMapMutex.unlock(); + + util::clearList( m_presenceExtensions ); + util::clearMap( m_smQueue ); + + setConnectionImpl( 0 ); + setEncryptionImpl( 0 ); + setCompressionImpl( 0 ); + delete m_seFactory; + m_seFactory = 0; // to avoid usage when Disco gets deleted below + delete m_disco; + m_disco = 0; + + util::clearList( m_messageSessions ); + + PresenceJidHandlerList::const_iterator it1 = m_presenceJidHandlers.begin(); + for( ; it1 != m_presenceJidHandlers.end(); ++it1 ) + delete (*it1).jid; + } + + ConnectionError ClientBase::recv( int timeout ) + { + if( !m_connection || m_connection->state() == StateDisconnected ) + return ConnNotConnected; + + return m_connection->recv( timeout ); + } + + bool ClientBase::connect( bool block ) + { + if( m_server.empty() ) + return false; + + if( !m_connection ) + m_connection = new ConnectionTCPClient( this, m_logInstance, m_server, m_port ); + + if( m_connection->state() >= StateConnecting ) + return true; + + if( !m_encryption ) + m_encryption = getDefaultEncryption(); + + if( !m_compression ) + m_compression = getDefaultCompression(); + + m_logInstance.dbg( LogAreaClassClientbase, "This is gloox " + GLOOX_VERSION + ", connecting to " + + m_server + ( ( m_customConnection )?( " using a custom connection" ):( m_port > 0 ? ( ":" + util::int2string( m_port ) ) : EmptyString ) ) + "..." ); + m_block = block; + ConnectionError ret = m_connection->connect(); + if( ret != ConnNoError ) + return false; + + if( m_block ) + m_connection->receive(); + + return true; + } + void ClientBase::setJID(JID jid){ + m_jid = jid; + } + + + void ClientBase::handleTag( Tag* tag ) + { + if( !tag ) + { + logInstance().dbg( LogAreaClassClientbase, "stream closed" ); + disconnect( ConnStreamClosed ); + return; + } + + logInstance().dbg( LogAreaXmlIncoming, tag->xml() ); + ++m_stats.totalStanzasReceived; + + if( tag->name() == "stream" && tag->xmlns() == XMLNS_STREAM ) + { + const std::string& version = tag->findAttribute( "version" ); + if( !checkStreamVersion( version ) ) + { + logInstance().dbg( LogAreaClassClientbase, "This server is not XMPP-compliant" + " (it does not send a 'version' attribute). Please fix it or try another one.\n" ); + disconnect( ConnStreamVersionError ); + return; + } + + m_sid = tag->findAttribute( "id" ); + handleStartNode( tag ); + } + else if( tag->name() == "error" && tag->xmlns() == XMLNS_STREAM ) + { + handleStreamError( tag ); + disconnect( ConnStreamError ); + } + else + { + if( !handleNormalNode( tag ) ) + { + if( tag->xmlns().empty() || tag->xmlns() == XMLNS_CLIENT ) + { + if( tag->name() == "iq" ) + { + IQ iq( tag ); + m_seFactory->addExtensions( iq, tag ); + if( iq.hasEmbeddedStanza() ) + m_seFactory->addExtensions( *iq.embeddedStanza(), iq.embeddedTag() ); + notifyIqHandlers( iq ); + ++m_stats.iqStanzasReceived; + if( m_smContext >= CtxSMEnabled ) + ++m_smHandled; + } + else if( tag->name() == "message" ) + { + Message msg( tag ); + m_seFactory->addExtensions( msg, tag ); + if( msg.hasEmbeddedStanza() ) + m_seFactory->addExtensions( *msg.embeddedStanza(), msg.embeddedTag() ); + notifyMessageHandlers( msg ); + ++m_stats.messageStanzasReceived; + if( m_smContext >= CtxSMEnabled ) + ++m_smHandled; + } + else if( tag->name() == "presence" ) + { + const std::string& type = tag->findAttribute( TYPE ); + if( type == "subscribe" || type == "unsubscribe" + || type == "subscribed" || type == "unsubscribed" ) + { + Subscription sub( tag ); + m_seFactory->addExtensions( sub, tag ); + if( sub.hasEmbeddedStanza() ) + m_seFactory->addExtensions( *sub.embeddedStanza(), sub.embeddedTag() ); + notifySubscriptionHandlers( sub ); + ++m_stats.s10nStanzasReceived; + } + else + { + Presence pres( tag ); + m_seFactory->addExtensions( pres, tag ); + if( pres.hasEmbeddedStanza() ) + m_seFactory->addExtensions( *pres.embeddedStanza(), pres.embeddedTag() ); + notifyPresenceHandlers( pres ); + ++m_stats.presenceStanzasReceived; + } + if( m_smContext >= CtxSMEnabled ) + ++m_smHandled; + } + else + m_logInstance.err( LogAreaClassClientbase, "Invalid stanza received: " + tag->name() ); + } + else + { + notifyTagHandlers( tag ); + } + } + } + + if( m_statisticsHandler ) + m_statisticsHandler->handleStatistics( getStatistics() ); + } + + void ClientBase::handleCompressedData( const std::string& data ) + { + if( m_encryption && m_encryptionActive ) + m_encryption->encrypt( data ); + else if( m_connection ) + m_connection->send( data ); + else + m_logInstance.err( LogAreaClassClientbase, "Compression finished, but chain broken" ); + } + + void ClientBase::handleDecompressedData( const std::string& data ) + { + parse( data ); + } + + void ClientBase::handleEncryptedData( const TLSBase* /*base*/, const std::string& data ) + { + if( m_connection ) + m_connection->send( data ); + else + m_logInstance.err( LogAreaClassClientbase, "Encryption finished, but chain broken" ); + } + + void ClientBase::handleDecryptedData( const TLSBase* /*base*/, const std::string& data ) + { + if( m_compression && m_compressionActive ) + m_compression->decompress( data ); + else + parse( data ); + } + + void ClientBase::handleHandshakeResult( const TLSBase* /*base*/, bool success, CertInfo &certinfo ) + { + if( success ) + { + if( !notifyOnTLSConnect( certinfo ) ) + { + logInstance().err( LogAreaClassClientbase, "Server's certificate rejected!" ); + disconnect( ConnTlsFailed ); + } + else + { + logInstance().dbg( LogAreaClassClientbase, "connection encryption active" ); + header(); + } + } + else + { + logInstance().err( LogAreaClassClientbase, "TLS handshake failed!" ); + disconnect( ConnTlsFailed ); + } + } + + void ClientBase::handleReceivedData( const ConnectionBase* /*connection*/, const std::string& data ) + { + if( m_encryption && m_encryptionActive ) + m_encryption->decrypt( data ); + else if( m_compression && m_compressionActive ) + m_compression->decompress( data ); + else + parse( data ); + } + + void ClientBase::handleConnect( const ConnectionBase* /*connection*/ ) + { + header(); + } + + void ClientBase::handleDisconnect( const ConnectionBase* /*connection*/, ConnectionError reason ) + { + if( m_connection ) + m_connection->cleanup(); + + if( m_encryption ) + m_encryption->cleanup(); + + if( m_compression ) + m_compression->cleanup(); + + m_encryptionActive = false; + m_compressionActive = false; + + notifyOnDisconnect( reason ); + } + + void ClientBase::disconnect( ConnectionError reason ) + { + if( !m_connection || m_connection->state() < StateConnecting ) + return; + + if( reason != ConnTlsFailed ) + send( "" ); + + m_connection->disconnect(); + m_connection->cleanup(); + + if( m_encryption ) + m_encryption->cleanup(); + + if( m_compression ) + m_compression->cleanup(); + + m_encryptionActive = false; + m_compressionActive = false; + m_smSent = 0; + + notifyOnDisconnect( reason ); + +#ifdef CLIENTBASE_TEST + m_nextId.reset(); +#endif + } + + void ClientBase::parse( const std::string& data ) + { + std::string copy = data; + int i = 0; + if( ( i = m_parser.feed( copy ) ) >= 0 ) + { + std::string error = "parse error (at pos "; + error += util::int2string( i ); + error += "): "; + m_logInstance.err( LogAreaClassClientbase, error + copy ); + Tag* e = new Tag( "stream:error" ); + new Tag( e, "restricted-xml", "xmlns", XMLNS_XMPP_STREAM ); + send( e ); + disconnect( ConnParseError ); + } + } + + void ClientBase::header() + { + std::string head = ""; + head += ""; + send( head ); + } + + bool ClientBase::hasTls() + { +#if defined( HAVE_GNUTLS ) || defined( HAVE_OPENSSL ) || defined( HAVE_WINTLS ) + return true; +#else + return false; +#endif + } + + void ClientBase::startTls() + { + send( new Tag( "starttls", XMLNS, XMLNS_STREAM_TLS ) ); + } + + void ClientBase::setServer( const std::string &server ) + { + m_server = server; + if( m_connection ) + m_connection->setServer( server ); + } + + void ClientBase::setClientCert( const std::string& clientKey, const std::string& clientCerts ) + { + m_clientKey = clientKey; + m_clientCerts = clientCerts; + } + + void ClientBase::startSASL( SaslMechanism type ) + { + m_selectedSaslMech = type; + + Tag* a = new Tag( "auth", XMLNS, XMLNS_STREAM_SASL ); + + switch( type ) + { + case SaslMechScramSha1Plus: + case SaslMechScramSha1: + { + if( type == SaslMechScramSha1 ) + { + if( ( m_availableSaslMechs & SaslMechScramSha1Plus ) != SaslMechScramSha1Plus ) + m_gs2Header = "y,"; + else + m_gs2Header = "n,"; + a->addAttribute( "mechanism", "SCRAM-SHA-1" ); + } + else // SaslMechScramSha1Plus + { + m_gs2Header = "p=tls-unique,"; + a->addAttribute( "mechanism", "SCRAM-SHA-1-PLUS" ); + } + + std::string t; + if( m_authzid && prep::saslprep( m_authzid.bare(), t ) ) + m_gs2Header += "a=" + t; + + m_gs2Header += ","; + + m_clientFirstMessageBare = "n="; + if( !m_authcid.empty() && prep::saslprep( m_authcid, t ) ) + m_clientFirstMessageBare += t; + else if( prep::saslprep( m_jid.username(), t ) ) + m_clientFirstMessageBare += t; + + m_clientFirstMessageBare += ",r=" + getRandom(); + + a->setCData( Base64::encode64( m_gs2Header + m_clientFirstMessageBare ) ); + break; + } + case SaslMechDigestMd5: + a->addAttribute( "mechanism", "DIGEST-MD5" ); + break; + case SaslMechPlain: + { + a->addAttribute( "mechanism", "PLAIN" ); + + std::string tmp; + if( m_authzid ) + tmp += m_authzid.bare(); + + tmp += '\0'; + if( !m_authcid.empty() ) + tmp += m_authcid; + else + tmp += m_jid.username(); + tmp += '\0'; + tmp += m_password; + a->setCData( Base64::encode64( tmp ) ); + break; + } + case SaslMechAnonymous: + a->addAttribute( "mechanism", "ANONYMOUS" ); + break; + case SaslMechExternal: + a->addAttribute( "mechanism", "EXTERNAL" ); + a->setCData( Base64::encode64( m_authzid ? m_authzid.bare() : m_jid.bare() ) ); + break; + case SaslMechGssapi: + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + a->addAttribute( "mechanism", "GSSAPI" ); +// The client calls GSS_Init_sec_context, passing in 0 for +// input_context_handle (initially) and a targ_name equal to output_name +// from GSS_Import_Name called with input_name_type of +// GSS_C_NT_HOSTBASED_SERVICE and input_name_string of +// "service@hostname" where "service" is the service name specified in +// the protocol's profile, and "hostname" is the fully qualified host +// name of the server. The client then responds with the resulting +// output_token. + std::string token; + a->setCData( Base64::encode64( token ) ); +// etc... see gssapi-sasl-draft.txt +#else + logInstance().err( LogAreaClassClientbase, + "SASL GSSAPI is not supported on this platform. You should never see this." ); +#endif + break; + } + case SaslMechNTLM: + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + a->addAttribute( "mechanism", "NTLM" ); + SEC_WINNT_AUTH_IDENTITY_W identity, *ident = 0; + memset( &identity, 0, sizeof( identity ) ); + + WCHAR *usernameW = 0, *domainW = 0, *passwordW = 0; + int cchUsernameW = 0, cchDomainW = 0, cchPasswordW = 0; + + if( m_jid.username().length() > 0 ) + { + // NOTE: The return values of MultiByteToWideChar will include room + // for the NUL character since we use -1 for the input length. + + cchUsernameW = ::MultiByteToWideChar( CP_UTF8, 0, m_jid.username().c_str(), -1, 0, 0 ); + if( cchUsernameW > 0 ) + { + usernameW = new WCHAR[cchUsernameW]; + ::MultiByteToWideChar( CP_UTF8, 0, m_jid.username().c_str(), -1, usernameW, cchUsernameW ); + // Guarantee its NUL terminated. + usernameW[cchUsernameW-1] = L'\0'; + } + cchDomainW = ::MultiByteToWideChar( CP_UTF8, 0, m_ntlmDomain.c_str(), -1, 0, 0 ); + if( cchDomainW > 0 ) + { + domainW = new WCHAR[cchDomainW]; + ::MultiByteToWideChar( CP_UTF8, 0, m_ntlmDomain.c_str(), -1, domainW, cchDomainW ); + // Guarantee its NUL terminated. + domainW[cchDomainW-1] = L'\0'; + } + cchPasswordW = ::MultiByteToWideChar( CP_UTF8, 0, m_password.c_str(), -1, 0, 0 ); + if( cchPasswordW > 0 ) + { + passwordW = new WCHAR[cchPasswordW]; + ::MultiByteToWideChar( CP_UTF8, 0, m_password.c_str(), -1, passwordW, cchPasswordW ); + // Guarantee its NUL terminated. + passwordW[cchPasswordW-1] = L'\0'; + } + identity.User = (unsigned short*)usernameW; + identity.UserLength = (unsigned long)cchUsernameW-1; + identity.Domain = (unsigned short*)domainW; + identity.DomainLength = (unsigned long)cchDomainW-1; + identity.Password = (unsigned short*)passwordW; + identity.PasswordLength = (unsigned long)cchPasswordW-1; + identity.Flags = SEC_WINNT_AUTH_IDENTITY_UNICODE; + ident = &identity; + } + + AcquireCredentialsHandleW( 0, L"NTLM", SECPKG_CRED_OUTBOUND, 0, ident, 0, 0, &m_credHandle, 0 ); + + if( usernameW != 0 ) + { + delete[] usernameW; + usernameW = 0; + } + if( domainW != 0 ) + { + delete[] domainW; + domainW = 0; + } + if( passwordW != 0 ) + { + ::SecureZeroMemory( passwordW, cchPasswordW* sizeof( WCHAR ) ); + delete[] passwordW; + passwordW = 0; + } + +#else + logInstance().err( LogAreaClassClientbase, + "SASL NTLM is not supported on this platform. You should never see this." ); +#endif + break; + } + default: + break; + } + + send( a ); + } + + std::string ClientBase::hmac( const std::string& key, const std::string& str ) + { + SHA sha; + std::string key_ = key; + if( key_.length() > 64 ) + { + sha.feed( key_ ); + key_ = sha.binary(); + sha.reset(); + } + unsigned char ipad[65]; + unsigned char opad[65]; + memset( ipad, '\0', sizeof( ipad ) ); + memset( opad, '\0', sizeof( opad ) ); + memcpy( ipad, key_.c_str(), key_.length() ); + memcpy( opad, key_.c_str(), key_.length() ); + for( int i = 0; i < 64; i++ ) + { + ipad[i] ^= 0x36; + opad[i] ^= 0x5c; + } + sha.feed( ipad, 64 ); + sha.feed( str ); + key_ = sha.binary(); + sha.reset(); + sha.feed( opad, 64 ); + sha.feed( key_ ); + + return sha.binary(); // hex() for testing + } + + std::string ClientBase::hi( const std::string& str, const std::string& salt, int iter ) + { + unsigned char xored[20]; + memset( xored, '\0', sizeof( xored ) ); + std::string tmp = salt; + tmp.append( "\0\0\0\1", 4 ); + for( int i = 0; i < iter; ++i ) + { + tmp = hmac( str, tmp ); + for( int j = 0; j < 20; ++j ) + xored[j] ^= tmp.c_str()[j]; + } + return std::string( (char*)xored, 20 ); + } + + void ClientBase::processSASLChallenge( const std::string& challenge ) + { + Tag* t = new Tag( "response", XMLNS, XMLNS_STREAM_SASL ); + + const std::string& decoded = Base64::decode64( challenge ); + + switch( m_selectedSaslMech ) + { + case SaslMechScramSha1Plus: + case SaslMechScramSha1: + { + std::string snonce, salt, tmp; + int iter = 0; + std::string::size_type posn = decoded.find( "r=" ); + std::string::size_type poss = decoded.find( "s=" ); + std::string::size_type posi = decoded.find( "i=" ); + if( posn == std::string::npos || poss == std::string::npos || posi == std::string::npos ) + break; + + snonce = decoded.substr( posn + 2, poss - posn - 3 ); + salt = Base64::decode64( decoded.substr( poss + 2, posi - poss - 3 ) ); + tmp = decoded.substr( posi + 2, decoded.length() - posi - 2 ); + iter = atoi( tmp.c_str() ); + + if( !prep::saslprep( m_password, tmp ) ) + break; + + std::string saltedPwd = hi( tmp, salt, iter ); + std::string ck = hmac( saltedPwd, "Client Key" ); + SHA sha; + sha.feed( ck ); + std::string storedKey = sha.binary(); + + if( m_selectedSaslMech == SaslMechScramSha1Plus ) + tmp = "c=" + Base64::encode64( m_gs2Header + m_encryption->channelBinding() ); + else + tmp = "c=biws"; + tmp += ",r=" + snonce; + + std::string authMessage = m_clientFirstMessageBare + "," + decoded + "," + tmp; // client-final-message-without-proof + std::string clientSignature = hmac( storedKey, authMessage ); + unsigned char clientProof[20]; // ck XOR clientSignature + memcpy( clientProof, ck.c_str(), 20 ); + for( int i = 0; i < 20; ++i ) + clientProof[i] ^= clientSignature.c_str()[i]; + std::string serverKey = hmac( saltedPwd, "Server Key" ); + m_serverSignature = hmac( serverKey, authMessage ); + + tmp += ",p="; + tmp.append( Base64::encode64( std::string( (char*)clientProof, 20 ) ) ); + + t->setCData( Base64::encode64( tmp ) ); + + break; + } + case SaslMechDigestMd5: + { + if( !decoded.compare( 0, 7, "rspauth" ) ) + break; + + std::string realm; + std::string::size_type end = 0; + std::string::size_type pos = decoded.find( "realm=" ); + if( pos != std::string::npos ) + { + end = decoded.find( '"', pos + 7 ); + realm = decoded.substr( pos + 7, end - ( pos + 7 ) ); + } + else + realm = m_jid.server(); + + pos = decoded.find( "nonce=" ); + if( pos == std::string::npos ) + return; + + end = decoded.find( '"', pos + 7 ); + while( decoded[end-1] == '\\' ) + end = decoded.find( '"', end + 1 ); + std::string nonce = decoded.substr( pos + 7, end - ( pos + 7 ) ); + + std::string cnonce = getRandom(); + + MD5 md5; + md5.feed( m_jid.username() ); + md5.feed( ":" ); + md5.feed( realm ); + md5.feed( ":" ); + md5.feed( m_password ); + md5.finalize(); + const std::string& a1_h = md5.binary(); + md5.reset(); + md5.feed( a1_h ); + md5.feed( ":" ); + md5.feed( nonce ); + md5.feed( ":" ); + md5.feed( cnonce ); + md5.finalize(); + const std::string& a1 = md5.hex(); + md5.reset(); + md5.feed( "AUTHENTICATE:xmpp/" ); + md5.feed( m_jid.server() ); + md5.finalize(); + const std::string& a2 = md5.hex(); + md5.reset(); + md5.feed( a1 ); + md5.feed( ":" ); + md5.feed( nonce ); + md5.feed( ":00000001:" ); + md5.feed( cnonce ); + md5.feed( ":auth:" ); + md5.feed( a2 ); + md5.finalize(); + + std::string response = "username=\""; + response += m_jid.username(); + response += "\",realm=\""; + response += realm; + response += "\",nonce=\""; + response += nonce; + response += "\",cnonce=\""; + response += cnonce; + response += "\",nc=00000001,qop=auth,digest-uri=\"xmpp/"; + response += m_jid.server(); + response += "\",response="; + response += md5.hex(); + response += ",charset=utf-8"; + + if( m_authzid ) + response += ",authzid=" + m_authzid.bare(); + + t->setCData( Base64::encode64( response ) ); + + break; + } + case SaslMechGssapi: +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + // see gssapi-sasl-draft.txt +#else + m_logInstance.err( LogAreaClassClientbase, + "Huh, received GSSAPI challenge?! This should have never happened!" ); +#endif + break; + case SaslMechNTLM: + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + bool type1 = ( decoded.length() < 7 ) ? true : false; + + SecBuffer bufferIn = { type1 ? 0 : (unsigned long)decoded.length(), + SECBUFFER_TOKEN, + (void*)decoded.c_str() }; + SecBufferDesc secIn = { 0, 1, &bufferIn }; + + char buffer[4096]; + + SecBuffer bufferOut = { sizeof( buffer ), SECBUFFER_TOKEN, buffer }; + SecBufferDesc secOut = { 0, 1, &bufferOut }; + + TimeStamp timestamp; + unsigned long contextAttr; + + SECURITY_STATUS status = InitializeSecurityContext( &m_credHandle, type1 ? 0 : &m_ctxtHandle, + 0, ISC_REQ_MUTUAL_AUTH, 0, 0, &secIn, 0, + &m_ctxtHandle, &secOut, &contextAttr, + ×tamp ); + std::string response; + if( SUCCEEDED( status ) ) + { + response = std::string( (const char *)bufferOut.pvBuffer, bufferOut.cbBuffer ); + } + else + { + logInstance().err( LogAreaClassClientbase, + "InitializeSecurityContext() failed, return value " + + util::int2string( status ) ); + } + + t->setCData( Base64::encode64( response ) ); +#else + m_logInstance.err( LogAreaClassClientbase, + "Huh, received NTLM challenge?! This should have never happened!" ); +#endif + break; + } + + default: + // should never happen. + break; + } + + send( t ); + } + + void ClientBase::processSASLError( Tag* tag ) + { + if( tag->hasChild( "aborted" ) ) + m_authError = SaslAborted; + else if( tag->hasChild( "incorrect-encoding" ) ) + m_authError = SaslIncorrectEncoding; + else if( tag->hasChild( "invalid-authzid" ) ) + m_authError = SaslInvalidAuthzid; + else if( tag->hasChild( "invalid-mechanism" ) ) + m_authError = SaslInvalidMechanism; + else if( tag->hasChild( "malformed-request" ) ) + m_authError = SaslMalformedRequest; + else if( tag->hasChild( "mechanism-too-weak" ) ) + m_authError = SaslMechanismTooWeak; + else if( tag->hasChild( "not-authorized" ) ) + m_authError = SaslNotAuthorized; + else if( tag->hasChild( "temporary-auth-failure" ) ) + m_authError = SaslTemporaryAuthFailure; + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + if( m_selectedSaslMech == SaslMechNTLM ) + { + FreeCredentialsHandle( &m_credHandle ); + DeleteSecurityContext( &m_ctxtHandle ); + } +#endif + } + + bool ClientBase::processSASLSuccess( const std::string& payload ) + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + if( m_selectedSaslMech == SaslMechNTLM ) + { + FreeCredentialsHandle( &m_credHandle ); + DeleteSecurityContext( &m_ctxtHandle ); + } +#endif + if( m_selectedSaslMech == SaslMechScramSha1 || m_selectedSaslMech == SaslMechScramSha1Plus ) + { + const std::string decoded = Base64::decode64( payload ); + if( decoded.length() < 3 || Base64::decode64( decoded.substr( 2 ) ) != m_serverSignature ) + return false; + } + + return true; + } + + void ClientBase::send( IQ& iq, IqHandler* ih, int context, bool del ) + { + if( ih && ( iq.subtype() == IQ::Set || iq.subtype() == IQ::Get ) ) + { + if( iq.id().empty() ) + iq.setID( getID() ); + + TrackStruct track; + track.ih = ih; + track.context = context; + track.del = del; + m_iqHandlerMapMutex.lock(); + m_iqIDHandlers[iq.id()] = track; + m_iqHandlerMapMutex.unlock(); + } + + send( iq ); + } + + void ClientBase::send( const IQ& iq ) + { + ++m_stats.iqStanzasSent; + Tag* tag = iq.tag(); + addFrom( tag ); + addNamespace( tag ); + send( tag, true, false ); + } + + void ClientBase::send( const Message& msg ) + { + ++m_stats.messageStanzasSent; + Tag* tag = msg.tag(); + addFrom( tag ); + addNamespace( tag ); + send( tag, true, false ); + } + + void ClientBase::send( const Subscription& sub ) + { + ++m_stats.s10nStanzasSent; + Tag* tag = sub.tag(); + addFrom(tag); + addNamespace(tag); + send( tag, true, false ); + } + + void ClientBase::send( const Presence& pres ) + { + ++m_stats.presenceStanzasSent; + Tag* tag = pres.tag(); + StanzaExtensionList::const_iterator it = m_presenceExtensions.begin(); + for( ; it != m_presenceExtensions.end(); ++it ) + tag->addChild( (*it)->tag() ); + addFrom( tag ); + addNamespace( tag ); + send( tag, true, false ); + } + + void ClientBase::send( Tag* tag ) + { + if( !tag ) + return; + + send( tag, false, true ); + } + + void ClientBase::send( Tag* tag, bool queue, bool del ) + { + if( !tag ) + return; + + send( tag->xml() ); + + ++m_stats.totalStanzasSent; + + if( m_statisticsHandler ) + m_statisticsHandler->handleStatistics( getStatistics() ); + + if( queue && m_smContext >= CtxSMEnabled ) + { + m_queueMutex.lock(); + m_smQueue.insert( std::make_pair( ++m_smSent, tag ) ); + m_queueMutex.unlock(); + } + else if( del || m_smContext < CtxSMEnabled ) + delete tag; + } + + void ClientBase::send( const std::string& xml ) + { + if( m_connection && m_connection->state() == StateConnected ) + { + if( m_compression && m_compressionActive ) + m_compression->compress( xml ); + else if( m_encryption && m_encryptionActive ) + m_encryption->encrypt( xml ); + else + m_connection->send( xml ); + + logInstance().dbg( LogAreaXmlOutgoing, xml ); + } + } + + void ClientBase::checkQueue( int handled, bool resend ) + { + if( m_smContext < CtxSMEnabled || handled < 0 ) + return; + + util::MutexGuard mg( m_queueMutex ); + SMQueueMap::iterator it = m_smQueue.begin(); + while( it != m_smQueue.end() ) + { + if( (*it).first <= handled ) + { + delete (*it).second; + m_smQueue.erase( it++ ); + } + else if( resend && (*it).first > handled ) + { + send( (*it).second, false, false ); + ++it; + } + else + { + ++it; + } + } + } + + const TagList ClientBase::sendQueue() + { + TagList l; + util::MutexGuard mg( m_queueMutex ); + SMQueueMap::iterator it = m_smQueue.begin(); + for( ; it != m_smQueue.end(); ++it ) + l.push_back( (*it).second->clone() ); + + return l; + } + + void ClientBase::addFrom( Tag* tag ) + { + if( !m_authed /*for IQ Auth */ || !tag || tag->hasAttribute( "from" ) ) + return; + + tag->addAttribute( "from", m_jid.full() ); + } + + void ClientBase::addNamespace( Tag* tag ) + { + if( !tag || !tag->xmlns().empty() ) + return; + + tag->setXmlns( m_namespace ); + } + + void ClientBase::registerStanzaExtension( StanzaExtension* ext ) + { + if( !m_seFactory ) + m_seFactory = new StanzaExtensionFactory(); + + m_seFactory->registerExtension( ext ); + } + + bool ClientBase::removeStanzaExtension( int ext ) + { + if( !m_seFactory ) + return false; + + return m_seFactory->removeExtension( ext ); + } + + StatisticsStruct ClientBase::getStatistics() + { + if( m_connection ) + m_connection->getStatistics( m_stats.totalBytesReceived, m_stats.totalBytesSent ); + + return m_stats; + } + + ConnectionState ClientBase::state() const + { + return m_connection ? m_connection->state() : StateDisconnected; + } + + void ClientBase::whitespacePing() + { + send( " " ); + } + + void ClientBase::xmppPing( const JID& to, EventHandler* eh ) + { + const std::string& id = getID(); + IQ iq( IQ::Get, to, id ); + iq.addExtension( new Ping() ); + m_dispatcher.registerEventHandler( eh, id ); + send( iq, this, XMPPPing ); + } + + bool ClientBase::handleIq( const IQ& iq ) + { + const Ping* p = iq.findExtension( ExtPing ); + if( !p || iq.subtype() != IQ::Get ) + return false; + + m_dispatcher.dispatch( Event( Event::PingPing, iq ) ); + IQ re( IQ::Result, iq.from(), iq.id() ); + send( re ); + + return true; + } + + void ClientBase::handleIqID( const IQ& iq, int context ) + { + if( context == XMPPPing ) + m_dispatcher.dispatch( Event( ( iq.subtype() == IQ::Result ) ? Event::PingPong + : Event::PingError, iq ), + iq.id(), true ); + else + handleIqIDForward( iq, context ); + } + + const std::string ClientBase::getID() + { +#ifdef CLIENTBASE_TEST // to create predictable UIDs in test mode + return "uid" + util::int2string( m_nextId.increment() ); +#else + char r[21+1]; + sprintf( r, "uid-%08x-%08x", m_uniqueBaseId, m_nextId.increment() ); + std::string ret( r, 21 ); + return ret; +#endif + } + + bool ClientBase::checkStreamVersion( const std::string& version ) + { + if( version.empty() ) + return false; + + int major = 0; +// int minor = 0; + int myMajor = atoi( XMPP_STREAM_VERSION_MAJOR.c_str() ); + + size_t dot = version.find( '.' ); + if( !version.empty() && dot && dot != std::string::npos ) + { + major = atoi( version.substr( 0, dot ).c_str() ); +// minor = atoi( version.substr( dot ).c_str() ); + } + + return myMajor >= major; + } + + void ClientBase::setConnectionImpl( ConnectionBase* connection ) + { + ConnectionBase* old = m_connection; + m_connection = connection; + m_customConnection = true; + if( old ) + delete old; + } + + void ClientBase::setEncryptionImpl( TLSBase* encryption ) + { + TLSBase* old = m_encryption; + m_encryption = encryption; + if( old ) + delete old; + } + + void ClientBase::setCompressionImpl( CompressionBase* compression ) + { + CompressionBase* old = m_compression; + m_compression = compression; + if( old ) + delete old; + } + + void ClientBase::handleStreamError( Tag* tag ) + { + StreamError err = StreamErrorUndefined; + const TagList& c = tag->children(); + TagList::const_iterator it = c.begin(); + for( ; it != c.end(); ++it ) + { + const std::string& name = (*it)->name(); + if( name == "bad-format" ) + err = StreamErrorBadFormat; + else if( name == "bad-namespace-prefix" ) + err = StreamErrorBadNamespacePrefix; + else if( name == "conflict" ) + err = StreamErrorConflict; + else if( name == "connection-timeout" ) + err = StreamErrorConnectionTimeout; + else if( name == "host-gone" ) + err = StreamErrorHostGone; + else if( name == "host-unknown" ) + err = StreamErrorHostUnknown; + else if( name == "improper-addressing" ) + err = StreamErrorImproperAddressing; + else if( name == "internal-server-error" ) + err = StreamErrorInternalServerError; + else if( name == "invalid-from" ) + err = StreamErrorInvalidFrom; + else if( name == "invalid-id" ) + err = StreamErrorInvalidId; + else if( name == "invalid-namespace" ) + err = StreamErrorInvalidNamespace; + else if( name == "invalid-xml" ) + err = StreamErrorInvalidXml; + else if( name == "not-authorized" ) + err = StreamErrorNotAuthorized; + else if( name == "policy-violation" ) + err = StreamErrorPolicyViolation; + else if( name == "remote-connection-failed" ) + err = StreamErrorRemoteConnectionFailed; + else if( name == "resource-constraint" ) + err = StreamErrorResourceConstraint; + else if( name == "restricted-xml" ) + err = StreamErrorRestrictedXml; + else if( name == "see-other-host" ) + { + err = StreamErrorSeeOtherHost; + m_streamErrorCData = tag->findChild( "see-other-host" )->cdata(); + } + else if( name == "system-shutdown" ) + err = StreamErrorSystemShutdown; + else if( name == "undefined-condition" ) + err = StreamErrorUndefinedCondition; + else if( name == "unsupported-encoding" ) + err = StreamErrorUnsupportedEncoding; + else if( name == "unsupported-stanza-type" ) + err = StreamErrorUnsupportedStanzaType; + else if( name == "unsupported-version" ) + err = StreamErrorUnsupportedVersion; + else if( name == "xml-not-well-formed" ) + err = StreamErrorXmlNotWellFormed; + else if( name == "text" ) + { + const std::string& lang = (*it)->findAttribute( "xml:lang" ); + if( !lang.empty() ) + m_streamErrorText[lang] = (*it)->cdata(); + else + m_streamErrorText["default"] = (*it)->cdata(); + } + else + m_streamErrorAppCondition = (*it); + + if( err != StreamErrorUndefined && (*it)->hasAttribute( XMLNS, XMLNS_XMPP_STREAM ) ) + m_streamError = err; + } + } + + const std::string& ClientBase::streamErrorText( const std::string& lang ) const + { + StringMap::const_iterator it = m_streamErrorText.find( lang ); + return ( it != m_streamErrorText.end() ) ? (*it).second : EmptyString; + } + + void ClientBase::registerMessageSessionHandler( MessageSessionHandler* msh, int types ) + { + if( types & Message::Chat || types == 0 ) + m_messageSessionHandlerChat = msh; + + if( types & Message::Normal || types == 0 ) + m_messageSessionHandlerNormal = msh; + + if( types & Message::Groupchat || types == 0 ) + m_messageSessionHandlerGroupchat = msh; + + if( types & Message::Headline || types == 0 ) + m_messageSessionHandlerHeadline = msh; + } + + void ClientBase::registerPresenceHandler( PresenceHandler* ph ) + { + if( ph ) + m_presenceHandlers.push_back( ph ); + } + + void ClientBase::removePresenceHandler( PresenceHandler* ph ) + { + if( ph ) + m_presenceHandlers.remove( ph ); + } + + void ClientBase::registerPresenceHandler( const JID& jid, PresenceHandler* ph ) + { + if( ph && jid ) + { + JidPresHandlerStruct jph; + jph.jid = new JID( jid.bare() ); + jph.ph = ph; + m_presenceJidHandlers.push_back( jph ); + } + } + + void ClientBase::removePresenceHandler( const JID& jid, PresenceHandler* ph ) + { + PresenceJidHandlerList::iterator t; + PresenceJidHandlerList::iterator it = m_presenceJidHandlers.begin(); + while( it != m_presenceJidHandlers.end() ) + { + t = it; + ++it; + if( ( !ph || (*t).ph == ph ) && (*t).jid->bare() == jid.bare() ) + { + delete (*t).jid; + m_presenceJidHandlers.erase( t ); + } + } + } + + void ClientBase::removeIDHandler( IqHandler* ih ) + { + IqTrackMap::iterator t; + m_iqHandlerMapMutex.lock(); + IqTrackMap::iterator it = m_iqIDHandlers.begin(); + while( it != m_iqIDHandlers.end() ) + { + t = it; + ++it; + if( ih == (*t).second.ih ) + m_iqIDHandlers.erase( t ); + } + m_iqHandlerMapMutex.unlock(); + } + + void ClientBase::registerIqHandler( IqHandler* ih, int exttype ) + { + if( !ih ) + return; + + util::MutexGuard m( m_iqExtHandlerMapMutex ); + typedef IqHandlerMap::const_iterator IQci; + std::pair g = m_iqExtHandlers.equal_range( exttype ); + for( IQci it = g.first; it != g.second; ++it ) + { + if( (*it).second == ih ) + return; + } + + m_iqExtHandlers.insert( std::make_pair( exttype, ih ) ); + } + + void ClientBase::removeIqHandler( IqHandler* ih, int exttype ) + { + if( !ih ) + return; + + util::MutexGuard m( m_iqExtHandlerMapMutex ); + typedef IqHandlerMap::iterator IQi; + std::pair g = m_iqExtHandlers.equal_range( exttype ); + IQi it2; + IQi it = g.first; + while( it != g.second ) + { + it2 = it++; + if( (*it2).second == ih ) + m_iqExtHandlers.erase( it2 ); + } + } + + void ClientBase::registerMessageSession( MessageSession* session ) + { + if( session ) + m_messageSessions.push_back( session ); + } + + void ClientBase::disposeMessageSession( MessageSession* session ) + { + if( !session ) + return; + + MessageSessionList::iterator it = std::find( m_messageSessions.begin(), + m_messageSessions.end(), + session ); + if( it != m_messageSessions.end() ) + { + delete (*it); + m_messageSessions.erase( it ); + } + } + + void ClientBase::registerMessageHandler( MessageHandler* mh ) + { + if( mh ) + m_messageHandlers.push_back( mh ); + } + + void ClientBase::removeMessageHandler( MessageHandler* mh ) + { + if( mh ) + m_messageHandlers.remove( mh ); + } + + void ClientBase::registerSubscriptionHandler( SubscriptionHandler* sh ) + { + if( sh ) + m_subscriptionHandlers.push_back( sh ); + } + + void ClientBase::removeSubscriptionHandler( SubscriptionHandler* sh ) + { + if( sh ) + m_subscriptionHandlers.remove( sh ); + } + + void ClientBase::registerTagHandler( TagHandler* th, const std::string& tag, const std::string& xmlns ) + { + if( th && !tag.empty() ) + { + TagHandlerStruct ths; + ths.tag = tag; + ths.xmlns = xmlns; + ths.th = th; + m_tagHandlers.push_back( ths ); + } + } + + void ClientBase::removeTagHandler( TagHandler* th, const std::string& tag, const std::string& xmlns ) + { + if( th ) + { + for( TagHandlerList::iterator it = m_tagHandlers.begin(); it != m_tagHandlers.end(); ) + { + if( (*it).th == th && (*it).tag == tag && (*it).xmlns == xmlns ) + { + // Normally we'd just assign it to the return value of the .erase() call, + // which is either the next element, or .end(). However, + // it's only since C++11 that this works; C++03 version returns void. + // So instead, we do a post-increment. this increments the iterator to point + // to the next element, then passes a copy of the old iterator (that is to the item to be deleted) + m_tagHandlers.erase( it++ ); + } + else + { + ++it; + } + } + } + } + + void ClientBase::registerStatisticsHandler( StatisticsHandler* sh ) + { + if( sh ) + m_statisticsHandler = sh; + } + + void ClientBase::removeStatisticsHandler() + { + m_statisticsHandler = 0; + } + + void ClientBase::registerMUCInvitationHandler( MUCInvitationHandler* mih ) + { + if( mih ) + { + m_mucInvitationHandler = mih; + m_disco->addFeature( XMLNS_MUC ); + } + } + + void ClientBase::removeMUCInvitationHandler() + { + m_mucInvitationHandler = 0; + m_disco->removeFeature( XMLNS_MUC ); + } + + void ClientBase::registerConnectionListener( ConnectionListener* cl ) + { + if( cl ) + m_connectionListeners.push_back( cl ); + } + + void ClientBase::removeConnectionListener( ConnectionListener* cl ) + { + if( cl ) + m_connectionListeners.remove( cl ); + } + + void ClientBase::notifyOnConnect() + { + util::ForEach( m_connectionListeners, &ConnectionListener::onConnect ); + } + + void ClientBase::notifyOnDisconnect( ConnectionError e ) + { + util::ForEach( m_connectionListeners, &ConnectionListener::onDisconnect, e ); + init(); + } + + bool ClientBase::notifyOnTLSConnect( const CertInfo& info ) + { + ConnectionListenerList::const_iterator it = m_connectionListeners.begin(); + for( ; it != m_connectionListeners.end() && (*it)->onTLSConnect( info ); ++it ) + ; + return m_stats.encryption = ( it == m_connectionListeners.end() ); + } + + void ClientBase::notifyOnResourceBindError( const Error* error ) + { + util::ForEach( m_connectionListeners, &ConnectionListener::onResourceBindError, error ); + } + + void ClientBase::notifyOnResourceBind( const std::string& resource ) + { + util::ForEach( m_connectionListeners, &ConnectionListener::onResourceBind, resource ); + } + + void ClientBase::notifyOnSessionCreateError( const Error* error ) + { + util::ForEach( m_connectionListeners, &ConnectionListener::onSessionCreateError, error ); + } + + void ClientBase::notifyStreamEvent( StreamEvent event ) + { + util::ForEach( m_connectionListeners, &ConnectionListener::onStreamEvent, event ); + } + + void ClientBase::notifyPresenceHandlers( Presence& pres ) + { + bool match = false; + PresenceJidHandlerList::const_iterator t; + PresenceJidHandlerList::const_iterator itj = m_presenceJidHandlers.begin(); + while( itj != m_presenceJidHandlers.end() ) + { + t = itj++; + if( (*t).jid->bare() == pres.from().bare() && (*t).ph ) + { + (*t).ph->handlePresence( pres ); + match = true; + } + } + if( match ) + return; + + // FIXME remove this for() for 1.1: + PresenceHandlerList::const_iterator it = m_presenceHandlers.begin(); + for( ; it != m_presenceHandlers.end(); ++it ) + { + (*it)->handlePresence( pres ); + } + // FIXME and reinstantiate this: +// util::ForEach( m_presenceHandlers, &PresenceHandler::handlePresence, pres ); + } + + void ClientBase::notifySubscriptionHandlers( Subscription& s10n ) + { + // FIXME remove this for() for 1.1: + SubscriptionHandlerList::const_iterator it = m_subscriptionHandlers.begin(); + for( ; it != m_subscriptionHandlers.end(); ++it ) + { + (*it)->handleSubscription( s10n ); + } + // FIXME and reinstantiate this: +// util::ForEach( m_subscriptionHandlers, &SubscriptionHandler::handleSubscription, s10n ); + } + + void ClientBase::notifyIqHandlers( IQ& iq ) + { + m_iqHandlerMapMutex.lock(); + IqTrackMap::iterator it_id = m_iqIDHandlers.find( iq.id() ); + bool haveIdHandler = ( it_id != m_iqIDHandlers.end() ); + m_iqHandlerMapMutex.unlock(); + if( haveIdHandler && ( iq.subtype() == IQ::Result || iq.subtype() == IQ::Error ) ) + { + (*it_id).second.ih->handleIqID( iq, (*it_id).second.context ); + if( (*it_id).second.del ) + delete (*it_id).second.ih; + m_iqHandlerMapMutex.lock(); + m_iqIDHandlers.erase( it_id ); + m_iqHandlerMapMutex.unlock(); + return; + } + + if( iq.extensions().empty() ) + { + if ( iq.subtype() == IQ::Get || iq.subtype() == IQ::Set ) + { + IQ re( IQ::Error, iq.from(), iq.id() ); + re.addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorFeatureNotImplemented ) ); + send( re ); + } + return; + } + + bool handled = false; + + // FIXME remove for 1.1 +// typedef IqHandlerMapXmlns::const_iterator IQciXmlns +// Tag *tag = iq.tag()->xmlns(); +// std::pair g = m_iqNSHandlers.equal_range( tag->xmlns() ); +// for( IQciXmlns it = g.first; it != g.second; ++it ) +// { +// if( (*it).second->handleIq( iq ) ) +// res = true; +// } +// delete tag; + + m_iqExtHandlerMapMutex.lock(); + typedef IqHandlerMap::const_iterator IQci; + const StanzaExtensionList& sel = iq.extensions(); + StanzaExtensionList::const_iterator itse = sel.begin(); + for( ; !handled && itse != sel.end(); ++itse ) + { + std::pair g = m_iqExtHandlers.equal_range( (*itse)->extensionType() ); + for( IQci it = g.first; !handled && it != g.second; ++it ) + { + if( (*it).second->handleIq( iq ) ) + handled = true; + } + } + m_iqExtHandlerMapMutex.unlock(); + + if( !handled && ( iq.subtype() == IQ::Get || iq.subtype() == IQ::Set ) ) + { + IQ re( IQ::Error, iq.from(), iq.id() ); + re.addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorServiceUnavailable ) ); + send( re ); + } + } + + void ClientBase::notifyMessageHandlers( Message& msg ) + { + if( m_mucInvitationHandler ) + { + const MUCRoom::MUCUser* mu = msg.findExtension( ExtMUCUser ); + if( mu && mu->operation() != MUCRoom::OpInviteTo ) + { + + m_mucInvitationHandler->handleMUCInvitation( msg.from(), + mu->jid() ? JID( *(mu->jid()) ) : JID(), + mu->reason() ? *(mu->reason()) : EmptyString, + msg.body(), + mu->password() ? *(mu->password()) : EmptyString, + mu->continued(), + mu->thread() ? *(mu->thread()) : EmptyString ); + return; + } + } + + MessageSessionList::const_iterator it1 = m_messageSessions.begin(); + for( ; it1 != m_messageSessions.end(); ++it1 ) + { + if( (*it1)->target().full() == msg.from().full() && + ( msg.thread().empty() + || (*it1)->threadID() == msg.thread() + || (*it1)->honorThreadID() ) && +// FIXME don't use '== 0' here + ( (*it1)->types() & msg.subtype() || (*it1)->types() == 0 ) ) + { + (*it1)->handleMessage( msg ); + return; + } + } + + it1 = m_messageSessions.begin(); + for( ; it1 != m_messageSessions.end(); ++it1 ) + { + if( (*it1)->target().bare() == msg.from().bare() && + ( msg.thread().empty() + || (*it1)->threadID() == msg.thread() + || (*it1)->honorThreadID() ) && +// FIXME don't use '== 0' here + ( (*it1)->types() & msg.subtype() || (*it1)->types() == 0 ) ) + { + (*it1)->handleMessage( msg ); + return; + } + } + + MessageSessionHandler* msHandler = 0; + + switch( msg.subtype() ) + { + case Message::Chat: + msHandler = m_messageSessionHandlerChat; + break; + case Message::Normal: + msHandler = m_messageSessionHandlerNormal; + break; + case Message::Groupchat: + msHandler = m_messageSessionHandlerGroupchat; + break; + case Message::Headline: + msHandler = m_messageSessionHandlerHeadline; + break; + default: + break; + } + + if( msHandler ) + { + MessageSession* session = new MessageSession( this, msg.from(), true, msg.subtype() ); + msHandler->handleMessageSession( session ); + session->handleMessage( msg ); + } + else + { + // FIXME remove this for() for 1.1: + MessageHandlerList::const_iterator it = m_messageHandlers.begin(); + for( ; it != m_messageHandlers.end(); ++it ) + { + (*it)->handleMessage( msg ); + } + // FIXME and reinstantiate this: +// util::ForEach( m_messageHandlers, &MessageHandler::handleMessage, msg ); // FIXME remove for 1.1 + } + } + + void ClientBase::notifyTagHandlers( Tag* tag ) + { + TagHandlerList::const_iterator it = m_tagHandlers.begin(); + for( ; it != m_tagHandlers.end(); ++it ) + { + if( (*it).tag == tag->name() && tag->hasAttribute( XMLNS, (*it).xmlns ) ) + (*it).th->handleTag( tag ); + } + } + + void ClientBase::addPresenceExtension( StanzaExtension* se ) + { + if( !se ) + return; + + removePresenceExtension( se->extensionType() ); + m_presenceExtensions.push_back( se ); + } + + bool ClientBase::removePresenceExtension( int type ) + { + StanzaExtensionList::iterator it = m_presenceExtensions.begin(); + for( ; it != m_presenceExtensions.end(); ++it ) + { + if( (*it)->extensionType() == type ) + { + delete (*it); + m_presenceExtensions.erase( it ); + return true; + } + } + + return false; + } + + std::string ClientBase::getRandom() + { + char cn[4*8+1]; + for( int i = 0; i < 4; ++i ) + sprintf( cn + i*8, "%08x", rand() ); + return std::string( cn, 4*8 );; + } + + CompressionBase* ClientBase::getDefaultCompression() + { + if( !m_compress ) + return 0; + +#ifdef HAVE_ZLIB + CompressionBase* cmp = new CompressionZlib( this ); + if( cmp->init() ) + return cmp; + + delete cmp; +#endif + return 0; + } + + TLSBase* ClientBase::getDefaultEncryption() + { + if( m_tls == TLSDisabled || !hasTls() ) + return 0; + + TLSDefault* tls = new TLSDefault( this, m_server ); + if( tls->init( m_clientKey, m_clientCerts, m_cacerts ) ) + return tls; + else + { + delete tls; + return 0; + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/clientbase.h b/smack/smack/src/main/cpp/gloox/src/clientbase.h new file mode 100644 index 00000000..acd0b126 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/clientbase.h @@ -0,0 +1,1112 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef CLIENTBASE_H__ +#define CLIENTBASE_H__ + +#include "macros.h" +#include "gloox.h" +#include "eventdispatcher.h" +#include "iqhandler.h" +#include "jid.h" +#include "logsink.h" +#include "mutex.h" +#include "taghandler.h" +#include "statisticshandler.h" +#include "tlshandler.h" +#include "compressiondatahandler.h" +#include "connectiondatahandler.h" +#include "parser.h" +#include "atomicrefcount.h" + +#include +#include +#include + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +#include +#define SECURITY_WIN32 +#include +#endif + +namespace gloox +{ + + class Disco; + class EventHandler; + class Event; + class Tag; + class IQ; + class Message; + class Presence; + class Subscription; + class MessageSessionHandler; + class ConnectionListener; + class MessageHandler; + class MessageSession; + class PresenceHandler; + class SubscriptionHandler; + class MUCInvitationHandler; + class TagHandler; + class TLSBase; + class ConnectionBase; + class CompressionBase; + class StanzaExtensionFactory; + + /** + * @brief This is the common base class for a Jabber/XMPP Client and a Jabber Component. + * + * It manages connection establishing, authentication, filter registration and invocation. + * You should normally use Client for client connections and Component for component connections. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API ClientBase : public TagHandler, public ConnectionDataHandler, + public CompressionDataHandler, public TLSHandler, + public IqHandler + { + + friend class RosterManager; + + public: + /** + * Constructs a new ClientBase. + * You should not need to use this class directly. Use Client or Component instead. + * @param ns The namespace which qualifies the stream. Either jabber:client or jabber:component:* + * @param server The server to connect to. + * @param port The port to connect to. The default of -1 means to look up the port via DNS SRV + * or to use a default port of 5222 as defined in XMPP Core. + */ + ClientBase( const std::string& ns, const std::string& server, int port = -1 ); + + /** + * Constructs a new ClientBase. + * You should not need to use this class directly. Use Client or Component instead. + * @param ns The namespace which qualifies the stream. Either jabber:client or jabber:component:* + * @param password The password to use for further authentication. + * @param server The server to connect to. + * @param port The port to connect to. The default of -1 means to look up the port via DNS SRV + * or to use a default port of 5222 as defined in XMPP: Core. + */ + ClientBase( const std::string& ns, const std::string& password, + const std::string& server, int port = -1 ); + + /** + * Virtual destrcuctor. + */ + virtual ~ClientBase(); + + /** + * Initiates the connection to a server. This function blocks as long as a connection is + * established. + * You can have the connection block 'til the end of the connection, or you can have it return + * immediately. If you choose the latter, its your responsibility to call @ref recv() every now + * and then to actually receive data from the socket and to feed the parser. + * @param block @b True for blocking, @b false for non-blocking connect. Defaults to @b true. + * @return @b False if prerequisits are not met (server not set) or if the connection was refused, + * @b true otherwise. + * @note Since 0.9 @link ConnectionListener::onDisconnect() onDisconnect() @endlink is called + * in addition to a return value of @b false. + */ + bool connect( bool block = true ); + void setJID(JID jid); + /** + * Use this periodically to receive data from the socket and to feed the parser. You need to use + * this only if you chose to connect in non-blocking mode. + * @param timeout The timeout in microseconds to use for select. Default of -1 means blocking + * until data was available. + * @return The state of the connection. + */ + virtual ConnectionError recv( int timeout = -1 ); + + /** + * Reimplement this function to provide a username for connection purposes. + * @return The username. + */ + virtual const std::string& username() const { return m_jid.username(); } + + /** + * Returns the current Jabber ID. If an authorization ID has been set (using setAuthzid()) + * this authzid is returned. + * @return A reference to the Jabber ID. + * @note If you change the server part of the JID, the server of the connection is not synced. + * You have to do that manually using @ref setServer(). + */ + const JID& jid() { return m_authzid ? m_authzid : m_jid; } + + /** + * Switches usage of SASL on/off. Default: on. SASL should only be disabled if there are + * problems with using it, and if an alternative authentication method exists. + * @param sasl Whether to switch SASL usage on or off. + */ + void setSasl( bool sasl ) { m_sasl = sasl; } + + /** + * Sets the TLS policy. Default: TLS will be used if available. TLS should only be + * disabled if there are problems with using it. + * @param tls The TLS policy. + */ + void setTls( TLSPolicy tls ) { m_tls = tls; } + + /** + * Switches usage of Stream Compression on/off (if available). Default: on if available. Stream + * Compression should only be disabled if there are problems with using it. + * @param compression Whether to switch Stream Compression usage on or off. + */ + void setCompression( bool compression ) { m_compress = compression; } + + /** + * Sets the port to connect to. This is not necessary if either the default port (5222) is used + * or SRV records exist which will be resolved. + * @param port The port to connect to. + */ + void setPort( int port ) { m_port = port; } + + /** + * Sets the XMPP server to connect to. + * @param server The server to connect to. Either IP or fully qualified domain name. + * @note If you change the server, the server part of the JID is not synced. You have to do that + * manually using @ref jid() and @ref JID::setServer(). + * @note This function also sets the server of the Connection(Base) in use. + */ + void setServer( const std::string &server ); + + /** + * Sets the password to use to connect to the XMPP server. + * @param password The password to use for authentication. + */ + void setPassword( const std::string &password ) { m_password = password; } + + /** + * Returns the current prepped server. + * @return The server used to connect. + */ + const std::string& server() const { return m_server; } + + /** + * Returns whether SASL is currently enabled (not necessarily used). + * @return The current SASL status. + */ + bool sasl() const { return m_sasl; } + + /** + * Returns whether TLS is currently enabled (not necessarily used). + * @return The current TLS status. + */ + TLSPolicy tls() const { return m_tls; } + + /** + * Returns whether Stream Compression is currently enabled (not necessarily used). + * @return The current Stream Compression status. + */ + bool compression() const { return m_compress; } + + /** + * Returns the port. The default of -1 means that the actual port will be looked up using + * SRV records, or the XMPP default port of 5222 will be used. + * @return The port used to connect. + */ + int port() const { return m_port; } + + /** + * Returns the current password. + * @return The password used to connect. + */ + virtual const std::string& password() const { return m_password; } + + /** + * This function gives access to the @c Disco object. + * @return A pointer to the Disco object. + */ + virtual Disco* disco() const { return m_disco; } + + /** + * Creates a string which is unique in the current instance and + * can be used as an ID for queries. + * @return A unique string suitable for query IDs. + */ + const std::string getID(); + + /** + * Sends the given Tag over an established connection. + * The ClientBase object becomes the owner of this Tag and will delete it after sending it. + * You should not rely on the existance of the Tag after it's been sent. If you still need + * it after sending it, use Tag::clone() to create a deep copy. + * @param tag The Tag to send. + */ + void send( Tag* tag ); + + /** + * Sends the given IQ stanza. The given IqHandler is registered to be notified of replies. This, + * of course, only works for IQs of type get or set. An ID is added if necessary. + * @param iq The IQ stanza to send. + * @param ih The handler to register for replies. + * @param context A value that allows for restoring context. + * @param del Whether or not delete the IqHandler object after its being called. + * Default: @b false. + */ + void send( IQ& iq, IqHandler* ih, int context, bool del = false ); + + /** + * A convenience function that sends the given IQ stanza. + * @param iq The IQ stanza to send. + */ + void send( const IQ& iq ); + + /** + * A convenience function that sends the given Message stanza. + * @param msg The Message stanza to send. + */ + void send( const Message& msg ); + + /** + * A convenience function that sends the given Subscription stanza. + * @param sub The Subscription stanza to send. + */ + void send( const Subscription& sub ); + + /** + * A convenience function that sends the given Presence stanza. + * @param pres The Presence stanza to send. + */ + void send( const Presence& pres ); + + /** + * Returns whether authentication has taken place and was successful. + * @return @b True if authentication has been carried out @b and was successful, @b false otherwise. + */ + bool authed() const { return m_authed; } + + /** + * Returns the current connection status. + * @return The status of the connection. + */ + ConnectionState state() const; + + /** + * Retrieves the value of the xml:lang attribute of the initial stream. + * Default is 'en', i.e. if not changed by a call to @ref setXmlLang(). + */ + const std::string& xmlLang() const { return m_xmllang; } + + /** + * Sets the value for the xml:lang attribute of the initial stream. + * @param xmllang The language identifier for the stream. It must conform to + * section 2.12 of the XML specification and RFC 3066. + * Default is 'en'. + */ + void setXmlLang( const std::string& xmllang ) { m_xmllang = xmllang; } + + /** + * This function returns the concrete connection implementation currently in use. + * @return The concrete connection implementation. + * @since 0.9 + */ + ConnectionBase* connectionImpl() const { return m_connection; } + + /** + * Use this function if you have a class implementing a UDP, SCTP (or whatever) + * connection. This should be called before calling connect(). If there already is a + * connection implementation set (either manually or automatically), it gets deleted. + * @param cb The connection to use. + * @since 0.9 + */ + void setConnectionImpl( ConnectionBase* cb ); + + /** + * This function returns the concrete encryption implementation currently in use. + * @return The concrete encryption implementation. + * @since 0.9 + */ + TLSBase* encryptionImpl() const { return m_encryption; } + + /** + * Use this function if you have a class supporting hardware encryption (or whatever). + * This should be called before calling connect(). If there already is a + * encryption implementation set (either manually or automatically), it gets deleted. + * @param tb The encryption implementation to use. + * @since 0.9 + */ + void setEncryptionImpl( TLSBase* tb ); + + /** + * This function returns the concrete compression implementation currently in use. + * @return The concrete compression implementation. + * @since 0.9 + */ + CompressionBase* compressionImpl() const { return m_compression; } + + /** + * Use this function if you have a class supporting some fancy compression algorithm. + * This should be called before calling connect(). If there already is a + * compression implementation set (either manually or automatically), it gets deleted. + * @param cb The compression implementation to use. + * @since 0.9 + */ + void setCompressionImpl( CompressionBase* cb ); + + /** + * Sends a whitespace ping to the server. + * @since 0.9 + */ + void whitespacePing(); + + /** + * Sends a XMPP Ping (@xep{0199}) to the given JID. + * @param to Then entity to ping. + * @param eh An EventHandler to inform about the reply. + * @since 0.9 + */ + void xmppPing( const JID& to, EventHandler* eh ); + + /** + * Use this function to set an authorization ID (authzid). Provided the server supports it + * and the user has sufficient rights, they could then authenticate as bob@example.net but + * act as alice@example.net. + * @param authzid The JID to authorize as. Only the bare JID is used. + * @since 0.9 + */ + void setAuthzid( const JID& authzid ) { m_authzid = authzid; } + + /** + * Use this function to set an authentication ID (authcid) for SASL PLAIN. + * The default authcid is the username, i.e. the JID's node part. This should work in most cases. + * If this is not what you want to use for authentication, use this function. + * @param authcid The authentication ID. + * @since 1.0 + * @note Right now this is used for SASL PLAIN authentication only. + */ + void setAuthcid( const std::string& authcid ) { m_authcid = authcid; } + + /** + * Use this function to limit SASL mechanisms gloox can use. By default, all + * supported mechanisms are allowed. To exclude one (or more) mechanisms, remove + * it from SaslMechAll like so: + * @code + * int mymechs = SaslMechAll ^ SaslMechDigestMd5; + * @endcode + * @param mechanisms Bitwise ORed @ref SaslMechanism. + * @since 0.9 + */ + void setSASLMechanisms( int mechanisms ) { m_availableSaslMechs = mechanisms; } + + /** + * Registers a new StanzaExtension with the StanzaExtensionFactory. + * @param ext The extension to register. + */ + void registerStanzaExtension( StanzaExtension* ext ); + + /** + * Removes the given StanzaExtension type from the StanzaExtensionFactory. + * @param ext The extension type. + * @return @b True if the given type was found (and removed), @b false otherwise. + */ + bool removeStanzaExtension( int ext ); + + /** + * Registers @c cl as object that receives connection notifications. + * @param cl The object to receive connection notifications. + */ + void registerConnectionListener( ConnectionListener* cl ); + + /** + * Registers @c ih as object that receives notifications for IQ stanzas + * that contain StanzaExtensions of the given type. The number of handlers + * per extension type is not limited. + * @param ih The object to receive IQ stanza notifications. + * @param exttype The extension type. See StanzaExtension and + * @link gloox::StanzaExtensionType StanzaExtensionType @endlink. + * @since 1.0 + */ + void registerIqHandler( IqHandler* ih, int exttype ); + + /** + * Removes the given IqHandler from the list of handlers of pending operations, added + * using send( IQ&, IqHandler*, int, bool ). Necessary, for example, when closing a GUI element that has an + * operation pending. + * @param ih The IqHandler to remove. + * @since 0.8.7 + */ + void removeIDHandler( IqHandler* ih ); + + /** + * Registers @c mh as object that receives Message stanza notifications. + * @param mh The object to receive Message stanza notifications. + */ + void registerMessageHandler( MessageHandler* mh ); + + /** + * Removes the given object from the list of message handlers. + * @param mh The object to remove from the list. + */ + void removeMessageHandler( MessageHandler* mh ); + + /** + * Registers the given MessageSession to receive Messages incoming from the session's + * target JID. + * @note The ClientBase instance becomes the owner of the MessageSession, it will be deleted + * in ClientBase's destructor. To get rid of the session before that, use disposeMessageSession(). + * @param session The MessageSession to register. + * @note Since a MessageSession automatically registers itself with the ClientBase, there is no + * need to call this function directly. + */ + void registerMessageSession( MessageSession* session ); + + /** + * Removes the given MessageSession from the list of MessageSessions and deletes it. + * @param session The MessageSession to be deleted. + */ + void disposeMessageSession( MessageSession* session ); + + /** + * Registers @c ph as object that receives Presence stanza notifications. + * @param ph The object to receive Presence stanza notifications. + */ + void registerPresenceHandler( PresenceHandler* ph ); + + /** + * Registers a new PresenceHandler for the given JID. Presences received for this + * particular JID will not be forwarded to the generic PresenceHandler (and therefore + * the Roster). + * This functionality is primarily intended for the MUC implementation. + * @param jid The JID to 'watch'. + * @param ph The PresenceHandler to inform about presence changes from @c jid. + * @since 0.9 + */ + void registerPresenceHandler( const JID& jid, PresenceHandler* ph ); + + /** + * Registers @c sh as object that receives Subscription stanza notifications. + * @param sh The object to receive Subscription stanza notifications. + */ + void registerSubscriptionHandler( SubscriptionHandler* sh ); + + /** + * Registers @c th as object that receives incoming packts with a given root tag + * qualified by the given namespace. + * @param th The object to receive Subscription packet notifications. + * @param tag The element's name. + * @param xmlns The element's namespace. + */ + void registerTagHandler( TagHandler* th, const std::string& tag, + const std::string& xmlns ); + + /** + * Registers @c sh as object that receives up-to-date connection statistics each time + * a Stanza is received or sent. Alternatively, you can use getStatistics() manually. + * Only one StatisticsHandler per ClientBase at a time is possible. + * @param sh The StatisticsHandler to register. + */ + void registerStatisticsHandler( StatisticsHandler* sh ); + + /** + * Removes the given object from the list of connection listeners. + * @param cl The object to remove from the list. + */ + void removeConnectionListener( ConnectionListener* cl ); + + /** + * Removes the given IQ handler for the given extension type. + * @param ih The IqHandler. + * @param exttype The extension type. See + * @link gloox::StanzaExtensionType StanzaExtensionType @endlink. + * @since 1.0 + */ + void removeIqHandler( IqHandler* ih, int exttype ); + + /** + * Removes the given object from the list of presence handlers. + * @param ph The object to remove from the list. + */ + void removePresenceHandler( PresenceHandler* ph ); + + /** + * Removes the given object from the list of presence handlers for the given JID. + * @param jid The JID to remove the PresenceHandler(s) for. + * @param ph The PresenceHandler to remove from the list. If @c ph is 0, + * all handlers for the given JID will be removed. + */ + void removePresenceHandler( const JID& jid, PresenceHandler* ph ); + + /** + * Removes the given object from the list of subscription handlers. + * @param sh The object to remove from the list. + */ + void removeSubscriptionHandler( SubscriptionHandler* sh ); + + /** + * Removes the given object from the list of tag handlers for the given element and namespace. + * @param th The object to remove from the list. + * @param tag The element to remove the handler for. + * @param xmlns The namespace qualifying the element. + */ + void removeTagHandler( TagHandler* th, const std::string& tag, + const std::string& xmlns ); + + /** + * Removes the current StatisticsHandler. + */ + void removeStatisticsHandler(); + + /** + * Use this function to set a number of trusted root CA certificates which shall be + * used to verify a servers certificate. + * @param cacerts A list of absolute paths to CA root certificate files in PEM format. + */ + void setCACerts( const StringList& cacerts ) { m_cacerts = cacerts; } + + /** + * Use this function to set the user's certificate and private key. The certificate will + * be presented to the server upon request and can be used for SASL EXTERNAL authentication. + * The user's certificate file should be a bundle of more than one certificate in PEM format. + * The first one in the file should be the user's certificate, each cert following that one + * should have signed the previous one. + * @note These certificates are not necessarily the same as those used to verify the server's + * certificate. + * @param clientKey The absolute path to the user's private key in PEM format. + * @param clientCerts A path to a certificate bundle in PEM format. + */ + void setClientCert( const std::string& clientKey, const std::string& clientCerts ); + + /** + * Use this function to register a MessageSessionHandler with the Client. + * Optionally the MessageSessionHandler can receive only MessageSessions with a given + * message type. There can be only one handler per message type.
    + * A MessageSession will be created for every incoming + * message stanza if there is no MessageHandler registered for the originating JID. + * @param msh The MessageSessionHandler that will receive the newly created MessageSession. + * @param types ORed StanzaSubType's that describe the desired message types the handler + * shall receive. Only StanzaMessage* types are valid. A value of 0 means any type (default). + */ + void registerMessageSessionHandler( MessageSessionHandler* msh, int types = 0 ); + + /** + * Returns the LogSink instance for this ClientBase and all related objects. + * @return The LogSink instance used in the current ClientBase. + */ + LogSink& logInstance() { return m_logInstance; } + + /** + * Use this function to retrieve the type of the stream error after it occurs and you received a + * ConnectionError of type @b ConnStreamError from the ConnectionListener. + * @return The StreamError. + * @note The return value is only meaningful when called from ConnectionListener::onDisconnect(). + */ + StreamError streamError() const { return m_streamError; } + + /** + * Returns the text of a stream error for the given language if available. + * If the requested language is not available, the default text (without a xml:lang + * attribute) will be returned. + * @param lang The language identifier for the desired language. It must conform to + * section 2.12 of the XML specification and RFC 3066. If empty, the default body + * will be returned, if any. + * @return The describing text of a stream error. Empty if no stream error occured. + */ + const std::string& streamErrorText( const std::string& lang = "default" ) const; + + /** + * In case the defined-condition element of an stream error contains XML character data you can + * use this function to retrieve it. RFC 3920 only defines one condition (see-other-host)where + * this is possible. + * @return The cdata of the stream error's text element (only for see-other-host). + */ + const std::string& streamErrorCData() const { return m_streamErrorCData; } + + /** + * This function can be used to retrieve the application-specific error condition of a stream error. + * @return The application-specific error element of a stream error. 0 if no respective element was + * found or no error occured. + */ + const Tag* streamErrorAppCondition() const { return m_streamErrorAppCondition; } + + /** + * Use this function to retrieve the type of the authentication error after it occurs and you + * received a ConnectionError of type @b ConnAuthenticationFailed from the ConnectionListener. + * @return The type of the authentication, if any, @b AuthErrorUndefined otherwise. + */ + AuthenticationError authError() const { return m_authError; } + + /** + * Returns a StatisticsStruct containing byte and stanza counts for the current + * active connection. + * @return A struct containing the current connection's statistics. + */ + StatisticsStruct getStatistics(); + + /** + * Registers a MUCInvitationHandler with the ClientBase. + * @param mih The MUCInvitationHandler to register. + */ + void registerMUCInvitationHandler( MUCInvitationHandler* mih ); + + /** + * Removes the currently registered MUCInvitationHandler. + */ + void removeMUCInvitationHandler(); + + /** + * Adds a StanzaExtension that will be sent with every Presence stanza + * sent. Capabilities are included by default if you are using a Client. + * @param se A StanzaExtension to add. If an extension of the same type + * has been added previously it will be replaced by the new one. + * Use removePresenceExtension() to remove an extension. + */ + void addPresenceExtension( StanzaExtension* se ); + + /** + * Removes the StanzaExtension of the given type from the list of Presence + * StanzaExtensions. + * Use addPresenceExtension() to replace an already added type. + */ + bool removePresenceExtension( int type ); + + /** + * Returns the current list of Presence StanzaExtensions. + * @return The current list of Presence StanzaExtensions. + */ + const StanzaExtensionList& presenceExtensions() const { return m_presenceExtensions; } + + /** + * Returns a list of Tags that are currently in the send queue. + * You should not rely on the currentness of this data when there is an established connection. + * @return A 'decoupled' list of Tags (deep copies) in the send queue. The caller is responsible + * for deleting the tags. + * @since 1.0.6 + */ + const TagList sendQueue(); + + // reimplemented from ParserHandler + virtual void handleTag( Tag* tag ); + + // reimplemented from CompressionDataHandler + virtual void handleCompressedData( const std::string& data ); + + // reimplemented from CompressionDataHandler + virtual void handleDecompressedData( const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleConnect( const ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + + // reimplemented from TLSHandler + virtual void handleEncryptedData( const TLSBase* base, const std::string& data ); + + // reimplemented from TLSHandler + virtual void handleDecryptedData( const TLSBase* base, const std::string& data ); + + // reimplemented from TLSHandler + virtual void handleHandshakeResult( const TLSBase* base, bool success, CertInfo &certinfo ); + + protected: +#ifdef CLIENTBASE_TEST + public: +#endif + /** + * This function is called when resource binding yieled an error. + * @param error A pointer to an Error object that contains more + * information. May be 0. + */ + void notifyOnResourceBindError( const Error* error ); + + /** + * This function is called when binding a resource succeeded. + * @param resource The bound resource. + */ + void notifyOnResourceBind( const std::string& resource ); + + /** + * This function is called when session creation yieled an error. + * @param error A pointer to an Error object that contains more + * information. May be 0. + */ + void notifyOnSessionCreateError( const Error* error ); + + /** + * This function is called when the TLS handshake completed correctly. The return + * value is used to determine whether or not the client accepted the server's + * certificate. If @b false is returned the connection is closed. + * @param info Information on the server's certificate. + * @return @b True if the certificate seems trustworthy, @b false otherwise. + */ + bool notifyOnTLSConnect( const CertInfo& info ); + + /** + * This function is called to notify about successful connection. + */ + void notifyOnConnect(); + + /** + * This function is used to notify subscribers of stream events. + * @param event The event to publish. + */ + void notifyStreamEvent( StreamEvent event ); + + /** + * Disconnects the underlying stream and broadcasts the given reason. + * @param reason The reason for the disconnect. + */ + virtual void disconnect( ConnectionError reason ); + + /** + * Sends the stream header. + */ + void header(); + + /** + * Tells ClientBase that authentication was successful (or not). + * @param authed Whether or not authentication was successful. + */ + void setAuthed( bool authed ) { m_authed = authed; } + + /** + * If authentication failed, this function tells ClientBase + * the reason. + * @param e The reason for the authentication failure. + */ + void setAuthFailure( AuthenticationError e ) { m_authError = e; } + + /** + * Implementors of this function can check if they support the advertized stream version. + * The return value indicates whether or not the stream can be handled. A default + * implementation is provided. + * @param version The advertized stream version. + * @return @b True if the stream can be handled, @b false otherwise. + */ + virtual bool checkStreamVersion( const std::string& version ); + + /** + * Starts authentication using the given SASL mechanism. + * @param type A SASL mechanism to use for authentication. + */ + void startSASL( SaslMechanism type ); + + /** + * Verifies the server response after successful authentication (if applicable) and + * releases SASL related resources (if applicable). + * @param payload The server's verification string. + * @return @b True if verification is not supported by the chosen SASL mechanism or could be completed successfully, + * @b false if verification failed. + */ + bool processSASLSuccess( const std::string& payload ); + + /** + * Processes the given SASL challenge and sends a response. + * @param challenge The SASL challenge to process. + */ + void processSASLChallenge( const std::string& challenge ); + + /** + * Examines the given Tag for SASL errors. + * @param tag The Tag to parse. + */ + void processSASLError( Tag* tag ); + + /** + * Sets the domain to use in SASL NTLM authentication. + * @param domain The domain. + */ + void setNTLMDomain( const std::string& domain ) { m_ntlmDomain = domain; } + + /** + * Starts the TLS handshake. + */ + void startTls(); + + /** + * Indicates whether or not TLS is supported. + * @return @b True if TLS is supported, @b false otherwise. + */ + bool hasTls(); + + /** + * Sends the given data unchecked over the underlying transport connection. Use at your own risk. + * The server will check any data received anyway and disconnect if something is wrong. + * @param xml The data to send. + */ + void send( const std::string& xml ); + + /** + * This function checks if there are any unacknowledged Tags in the send queue and resends + * as necessary. + * @param handled The sequence number of the last handled stanza. + * @param resend Whether to resend unhandled stanzas. + * @note This function is part of @xep{0198}. You should not need to use it directly. + * @since 1.0.4 + */ + void checkQueue( int handled, bool resend ); + + /** + * Returns the number of sent stanzas, if Stream Management is enabled. + * @return The number of sent stanzas. + */ + int stanzasSent() const { return m_smSent; } + + /** + * Returns 32 octets of random characters. + * @return Random characters. + */ + std::string getRandom(); + + JID m_jid; /**< The 'self' JID. */ + JID m_authzid; /**< An optional authorization ID. See setAuthzid(). */ + std::string m_authcid; /**< An alternative authentication ID. See setAuthcid(). */ + ConnectionBase* m_connection; /**< The transport connection. */ + TLSBase* m_encryption; /**< Used for connection encryption. */ + CompressionBase* m_compression; /**< Used for connection compression. */ + Disco* m_disco; /**< The local Service Discovery client. */ + + /** A list of permanent presence extensions. */ + StanzaExtensionList m_presenceExtensions; + + GLOOX_DEPRECATED std::string m_selectedResource; /**< The currently selected resource. + * See Client::selectResource() and Client::bindRessource(). + * @deprecated Not used anymore. Will be removed for 1.1. + * @todo Remove for 1.1 */ + std::string m_clientCerts; /**< TLS client certificates. */ + std::string m_clientKey; /**< TLS client private key. */ + std::string m_namespace; /**< Default namespace. */ + std::string m_password; /**< Client's password. */ + std::string m_xmllang; /**< Default value of the xml:lang attribute. */ + std::string m_server; /**< The server to connect to, if different from the + * JID's server. */ + std::string m_sid; /**< The stream ID. */ + bool m_compressionActive; /**< Indicates whether or not stream compression + * is currently activated. */ + bool m_encryptionActive; /**< Indicates whether or not stream encryption + * is currently activated. */ + bool m_compress; /**< Whether stream compression + * is desired at all. */ + bool m_authed; /**< Whether authentication has been completed successfully. */ + bool m_block; /**< Whether blocking connection is wanted. */ + bool m_sasl; /**< Whether SASL authentication is wanted. */ + TLSPolicy m_tls; /**< The current TLS policy. */ + int m_port; /**< The port to connect to, if not to be determined + * by querying the server's SRV records. */ + + int m_availableSaslMechs; /**< The SASL mechanisms the server offered. */ + + /** + * An enum for the Stream Management state machine. + */ + enum SMContext + { + CtxSMInvalid, /**< Initial value. */ + CtxSMFailed, /**< Either of the below failed. */ + CtxSMEnable, /**< 'enable' request sent */ + CtxSMResume, /**< 'resume' request sent */ + CtxSMEnabled, /**< Stream Management successfully enabled. */ + CtxSMResumed /**< Stream successfully resumed. */ + }; + + SMContext m_smContext; /**< The Stream Management state. Used in @xep{0198}. */ + int m_smHandled; /**< The number of handled stanzas. Used in @xep{0198}. + * You should NOT mess with this. */ + + private: +#ifdef CLIENTBASE_TEST + public: +#endif + /** + * @brief This is an implementation of an XMPP Ping (@xep{0199}). + * + * @author Jakob Schröter + * @since 1.0 + */ + class Ping : public StanzaExtension + { + + public: + /** + * Constructs a new object. + */ + Ping(); + + /** + * Destructor. + */ + virtual ~Ping(); + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + (void)tag; + return new Ping(); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const + { + return new Tag( "ping", "xmlns", XMLNS_XMPP_PING ); + } + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Ping(); + } + + }; + + ClientBase( const ClientBase& ); + ClientBase& operator=( const ClientBase& ); + + /** + * This function is called right after the opening <stream:stream> was received. + * @param start The complete stream opening tag. Note that the XML representation (Tag::xml()) + * will contain a closed stream tag. The original is open. + */ + virtual void handleStartNode( const Tag* start ) = 0; + + /** + * This function is called for each Tag. Only stream initiation/negotiation should + * be done here. + * @param tag A Tag to handle. + * @return Returns @b true if the tag has been handled inside the function, @b false otherwise. + */ + virtual bool handleNormalNode( Tag* tag ) = 0; + virtual void rosterFilled() = 0; + virtual void cleanup() {} + virtual void handleIqIDForward( const IQ& iq, int context ) { (void) iq; (void) context; } + void send( Tag* tag, bool queue, bool del ); + std::string hmac( const std::string& str, const std::string& key ); + std::string hi( const std::string& str, const std::string& key, int iter ); + + void parse( const std::string& data ); + void init(); + void handleStreamError( Tag* tag ); + TLSBase* getDefaultEncryption(); + CompressionBase* getDefaultCompression(); + + void notifyIqHandlers( IQ& iq ); + void notifyMessageHandlers( Message& msg ); + void notifyPresenceHandlers( Presence& presence ); + void notifySubscriptionHandlers( Subscription& s10n ); + void notifyTagHandlers( Tag* tag ); + void notifyOnDisconnect( ConnectionError e ); + void addFrom( Tag* tag ); + void addNamespace( Tag* tag ); + + // reimplemented from IqHandler + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler + virtual void handleIqID( const IQ& iq, int context ); + + struct TrackStruct + { + IqHandler* ih; + int context; + bool del; + }; + + struct TagHandlerStruct + { + TagHandler* th; + std::string xmlns; + std::string tag; + }; + + struct JidPresHandlerStruct + { + JID* jid; + PresenceHandler* ph; + }; + + enum TrackContext + { + XMPPPing + }; + + typedef std::list ConnectionListenerList; + typedef std::multimap IqHandlerMapXmlns; + typedef std::multimap IqHandlerMap; + typedef std::map IqTrackMap; + typedef std::map MessageHandlerMap; + typedef std::map SMQueueMap; + typedef std::list MessageSessionList; + typedef std::list MessageHandlerList; + typedef std::list PresenceHandlerList; + typedef std::list PresenceJidHandlerList; + typedef std::list SubscriptionHandlerList; + typedef std::list TagHandlerList; + + ConnectionListenerList m_connectionListeners; + IqHandlerMapXmlns m_iqNSHandlers; + IqHandlerMap m_iqExtHandlers; + IqTrackMap m_iqIDHandlers; + SMQueueMap m_smQueue; + MessageSessionList m_messageSessions; + MessageHandlerList m_messageHandlers; + PresenceHandlerList m_presenceHandlers; + PresenceJidHandlerList m_presenceJidHandlers; + SubscriptionHandlerList m_subscriptionHandlers; + TagHandlerList m_tagHandlers; + StringList m_cacerts; + StatisticsHandler * m_statisticsHandler; + MUCInvitationHandler * m_mucInvitationHandler; + MessageSessionHandler * m_messageSessionHandlerChat; + MessageSessionHandler * m_messageSessionHandlerGroupchat; + MessageSessionHandler * m_messageSessionHandlerHeadline; + MessageSessionHandler * m_messageSessionHandlerNormal; + + util::Mutex m_iqHandlerMapMutex; + util::Mutex m_iqExtHandlerMapMutex; + util::Mutex m_queueMutex; + + Parser m_parser; + LogSink m_logInstance; + StanzaExtensionFactory* m_seFactory; + EventDispatcher m_dispatcher; + + AuthenticationError m_authError; + StreamError m_streamError; + StringMap m_streamErrorText; + std::string m_streamErrorCData; + Tag* m_streamErrorAppCondition; + + StatisticsStruct m_stats; + + SaslMechanism m_selectedSaslMech; + + std::string m_clientFirstMessageBare; + std::string m_serverSignature; + std::string m_gs2Header; + std::string m_ntlmDomain; + bool m_customConnection; + + int m_uniqueBaseId; + util::AtomicRefCount m_nextId; + + int m_smSent; + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + CredHandle m_credHandle; + CtxtHandle m_ctxtHandle; +#endif + + }; + +} + +#endif // CLIENTBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/component.cpp b/smack/smack/src/main/cpp/gloox/src/component.cpp new file mode 100644 index 00000000..a49ff74d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/component.cpp @@ -0,0 +1,62 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "component.h" + +#include "disco.h" +#include "stanza.h" +#include "prep.h" +#include "sha.h" + +#include + +namespace gloox +{ + + Component::Component( const std::string& ns, const std::string& server, + const std::string& component, const std::string& password, int port ) + : ClientBase( ns, password, server, port ) + { + m_jid.setServer( component ); + m_disco->setIdentity( "component", "generic" ); + } + + void Component::handleStartNode( const Tag* /*start*/ ) + { + if( m_sid.empty() ) + return; + + notifyStreamEvent( StreamEventAuthentication ); + + SHA sha; + sha.feed( m_sid + m_password ); + sha.finalize(); + + Tag* h = new Tag( "handshake", sha.hex() ); + send( h ); + } + + bool Component::handleNormalNode( Tag* tag ) + { + if( tag->name() != "handshake" ) + return false; + + m_authed = true; + notifyStreamEvent( StreamEventFinished ); + notifyOnConnect(); + + return true; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/component.h b/smack/smack/src/main/cpp/gloox/src/component.h new file mode 100644 index 00000000..6fb0a81f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/component.h @@ -0,0 +1,77 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef COMPONENT_H__ +#define COMPONENT_H__ + +#include "clientbase.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an implementation of a basic jabber Component. + * + * It's using @xep{0114} (Jabber Component Protocol) to authenticate with a server. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API Component : public ClientBase + { + public: + /** + * Constructs a new Component. + * @param ns The namespace that qualifies the stream. Either @b jabber:component:accept or + * @b jabber:component:connect. See @xep{0114} for details. + * @param server The server to connect to. + * @param component The component's hostname. FQDN. + * @param password The component's password. + * @param port The port to connect to. The default of 5347 is the default port of the router + * in jabberd2. + */ + Component( const std::string& ns, const std::string& server, + const std::string& component, const std::string& password, int port = 5347 ); + + /** + * Virtual Destructor. + */ + virtual ~Component() {} + + /** + * Disconnects from the server. + */ + virtual void disconnect() { ClientBase::disconnect( ConnUserDisconnected ); } + + protected: + // reimplemented from ClientBase + virtual void handleStartNode( const Tag* start ); + + // reimplemented from ClientBase + virtual bool handleNormalNode( Tag* tag ); + + // reimplemented from ClientBase + virtual bool checkStreamVersion( const std::string& /*version*/ ) { return true; } + + private: + // reimplemented from ClientBase + virtual void rosterFilled() {} + + }; + +} + +#endif // COMPONENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/compressionbase.h b/smack/smack/src/main/cpp/gloox/src/compressionbase.h new file mode 100644 index 00000000..40e62271 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/compressionbase.h @@ -0,0 +1,85 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef COMPRESSIONBASE_H__ +#define COMPRESSIONBASE_H__ + +#include "gloox.h" +#include "compressiondatahandler.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an abstract base class for stream compression implementations. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API CompressionBase + { + public: + /** + * Contructor. + * @param cdh A CompressionDataHandler-derived object that will be notified + * about finished de/compression. + */ + CompressionBase( CompressionDataHandler* cdh ) : m_handler( cdh ), m_valid( false ) {} + + /** + * Virtual Destructor. + */ + virtual ~CompressionBase() {} + + /** + * This function initializes the compression module. + * it is mandatory to be called. + * @return @b True if the module was initialized successfully, false otherwise. + */ + virtual bool init() = 0; + + /** + * Compresses the given chunk of data. + * @param data The original (uncompressed) data. + */ + virtual void compress( const std::string& data ) = 0; + + /** + * Decompresses the given chunk of data. + * @param data The compressed data. + */ + virtual void decompress( const std::string& data ) = 0; + + /** + * Performs internal cleanup. + * @since 1.0 + */ + virtual void cleanup() = 0; + + protected: + /** A handler for compressed/uncompressed data. */ + CompressionDataHandler* m_handler; + + /** Whether the compression module can be used. */ + bool m_valid; + + }; + +} + +#endif // COMPRESSIONBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/compressiondatahandler.h b/smack/smack/src/main/cpp/gloox/src/compressiondatahandler.h new file mode 100644 index 00000000..190ca8d8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/compressiondatahandler.h @@ -0,0 +1,58 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef COMPRESSIONDATAHANDLER_H__ +#define COMPRESSIONDATAHANDLER_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + /** + * @brief An abstract base class used to receive de/compressed data from a + * CompressionBase-derived object. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API CompressionDataHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~CompressionDataHandler() {} + + /** + * This function is called when compression is finished. + * @param data The compressed data. + */ + virtual void handleCompressedData( const std::string& data ) = 0; + + /** + * This function is called when decompression is finished. + * @param data The decompressed data. + */ + virtual void handleDecompressedData( const std::string& data ) = 0; + + }; + +} + +#endif // COMPRESSIONDATAHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/compressiondefault.cpp b/smack/smack/src/main/cpp/gloox/src/compressiondefault.cpp new file mode 100644 index 00000000..6486babf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/compressiondefault.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2009-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "compressiondefault.h" + +#include "compressiondatahandler.h" + +#include "config.h" + +#if defined( HAVE_ZLIB ) +# define HAVE_COMPRESSION +# include "compressionzlib.h" +#endif + +// #if defined( HAVE_LZW ) +// # define HAVE_COMPRESSION +// # include "compressionlzw.h" +// #endif + +namespace gloox +{ + + CompressionDefault::CompressionDefault( CompressionDataHandler* cdh, Method method ) + : CompressionBase( cdh ), m_impl( 0 ) + { + switch( method ) + { + case MethodZlib: +#ifdef HAVE_ZLIB + m_impl = new CompressionZlib( cdh ); +#endif + break; + case MethodLZW: +#ifdef HAVE_LZW + m_impl = new CompressionLZW( cdh ); +#endif + break; + default: + break; + } + } + + CompressionDefault::~CompressionDefault() + { + delete m_impl; + } + + bool CompressionDefault::init() + { + return m_impl ? m_impl->init() : false; + } + + int CompressionDefault::types() + { + int types = 0; +#ifdef HAVE_ZLIB + types |= MethodZlib; +#endif +#ifdef HAVE_LZW + types |= MethodLZW; +#endif + return types; + } + + void CompressionDefault::compress( const std::string& data ) + { + if( m_impl ) + m_impl->compress( data ); + } + + void CompressionDefault::decompress( const std::string& data ) + { + if( m_impl ) + m_impl->decompress( data ); + } + + void CompressionDefault::cleanup() + { + if( m_impl ) + m_impl->cleanup(); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/compressiondefault.h b/smack/smack/src/main/cpp/gloox/src/compressiondefault.h new file mode 100644 index 00000000..43fb510d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/compressiondefault.h @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2009-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + + +#ifndef COMPRESSIONDEFAULT_H__ +#define COMPRESSIONDEFAULT_H__ + +#include "compressionbase.h" + +namespace gloox +{ + + class CompressionDataHandler; + + /** + * @brief This is an abstraction of the various Compression implementations. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API CompressionDefault : public CompressionBase + { + public: + + /** + * Supported ctypes. + */ + enum Method + { + MethodZlib = 1, /**< Zlib compression. */ + MethodLZW = 2 /**< LZW compression. */ + }; + + /** + * Constructs a new compression wrapper. + * @param cdh The CompressionDataHandler to handle de/compressed data. + * @param method The desired compression method. + */ + CompressionDefault( CompressionDataHandler* cdh, Method method = MethodZlib ); + + /** + * Virtual Destructor. + */ + virtual ~CompressionDefault(); + + /** + * Returns an int holding the available compression types, ORed. + * @return An int holding the available compression types, ORed. + */ + static int types(); + + // reimplemented from CompressionBase + virtual bool init(); + + // reimplemented from CompressionBase + virtual void compress( const std::string& data ); + + // reimplemented from CompressionBase + virtual void decompress( const std::string& data ); + + // reimplemented from CompressionBase + virtual void cleanup(); + + private: + CompressionBase* m_impl; + + }; + +} + +#endif // COMPRESSIONDEFAULT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/compressionzlib.cpp b/smack/smack/src/main/cpp/gloox/src/compressionzlib.cpp new file mode 100644 index 00000000..b947626f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/compressionzlib.cpp @@ -0,0 +1,137 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "compressionzlib.h" + +#ifdef HAVE_ZLIB + +namespace gloox +{ + + CompressionZlib::CompressionZlib( CompressionDataHandler* cdh ) + : CompressionBase( cdh ) + { + } + + bool CompressionZlib::init() + { + int ret = Z_OK; + m_zinflate.zalloc = Z_NULL; + m_zinflate.zfree = Z_NULL; + m_zinflate.opaque = Z_NULL; + m_zinflate.avail_in = 0; + m_zinflate.next_in = Z_NULL; + ret = inflateInit( &m_zinflate ); + if( ret != Z_OK ) + return false; + + m_zdeflate.zalloc = Z_NULL; + m_zdeflate.zfree = Z_NULL; + m_zdeflate.opaque = Z_NULL; + m_zinflate.avail_in = 0; + m_zinflate.next_in = Z_NULL; + ret = deflateInit( &m_zdeflate, Z_BEST_COMPRESSION/*Z_DEFAULT_COMPRESSION*/ ); + if( ret != Z_OK ) + return false; + + m_valid = true; + return true; + } + + CompressionZlib::~CompressionZlib() + { + cleanup(); + } + + void CompressionZlib::compress( const std::string& data ) + { + if( !m_valid ) + init(); + + if( !m_valid || !m_handler || data.empty() ) + return; + + long unsigned int CHUNK = data.length() + ( data.length() / 100 ) + 13; + Bytef* out = new Bytef[CHUNK]; + char* in = const_cast( data.c_str() ); + + m_compressMutex.lock(); + + m_zdeflate.avail_in = static_cast( data.length() ); + m_zdeflate.next_in = (Bytef*)in; + + std::string result; + do { + m_zdeflate.avail_out = static_cast( CHUNK ); + m_zdeflate.next_out = (Bytef*)out; + + deflate( &m_zdeflate, Z_SYNC_FLUSH ); + result.append( (char*)out, CHUNK - m_zdeflate.avail_out ); + } while( m_zdeflate.avail_out == 0 ); + + m_compressMutex.unlock(); + + delete[] out; + + m_handler->handleCompressedData( result ); + } + + void CompressionZlib::decompress( const std::string& data ) + { + if( !m_valid ) + init(); + + if( !m_valid || !m_handler || data.empty() ) + return; + + int CHUNK = 50; + char* out = new char[CHUNK]; + char* in = const_cast( data.c_str() ); + + m_zinflate.avail_in = static_cast( data.length() ); + m_zinflate.next_in = (Bytef*)in; + + std::string result; + do + { + m_zinflate.avail_out = CHUNK; + m_zinflate.next_out = (Bytef*)out; + + inflate( &m_zinflate, Z_SYNC_FLUSH ); + result.append( out, CHUNK - m_zinflate.avail_out ); + } while( m_zinflate.avail_out == 0 ); + + delete[] out; + + m_handler->handleDecompressedData( result ); + } + + void CompressionZlib::cleanup() + { + m_compressMutex.lock(); + + if( m_valid ) + { + inflateEnd( &m_zinflate ); + deflateEnd( &m_zdeflate ); + + m_valid = false; + } + + m_compressMutex.unlock(); + } + +} + +#endif // HAVE_ZLIB diff --git a/smack/smack/src/main/cpp/gloox/src/compressionzlib.h b/smack/smack/src/main/cpp/gloox/src/compressionzlib.h new file mode 100644 index 00000000..b275eaf0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/compressionzlib.h @@ -0,0 +1,74 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef COMPRESSIONZLIB_H__ +#define COMPRESSIONZLIB_H__ + +#include "compressionbase.h" +#include "mutex.h" + +#include "config.h" + +#ifdef HAVE_ZLIB + +#include + +#include + +namespace gloox +{ + /** + * An implementation of CompressionBase using zlib. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API CompressionZlib : public CompressionBase + { + public: + /** + * Contructor. + * @param cdh The CompressionDataHandler to receive de/compressed data. + */ + CompressionZlib( CompressionDataHandler* cdh ); + + /** + * Virtual Destructor. + */ + virtual ~CompressionZlib(); + + // reimplemented from CompressionBase + virtual bool init(); + + // reimplemented from CompressionBase + virtual void compress( const std::string& data ); + + // reimplemented from CompressionBase + virtual void decompress( const std::string& data ); + + // reimplemented from CompressionBase + virtual void cleanup(); + + private: + z_stream m_zinflate; + z_stream m_zdeflate; + + util::Mutex m_compressMutex; + + }; + +} + +#endif // HAVE_ZLIB + +#endif // COMPRESSIONZLIB_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/config.h b/smack/smack/src/main/cpp/gloox/src/config.h new file mode 100644 index 00000000..a8411d1c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/config.h @@ -0,0 +1,31 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CONFIG_H__ +#define CONFIG_H__ + +#if ( defined _WIN32 ) && !defined( __SYMBIAN32__ ) +# include "../config.h.win" +#elif defined( _WIN32_WCE ) +# include "../config.h.win" +#elif defined( __SYMBIAN32__ ) +# include "../config.h.symbian" +#elif defined( __ANDROID__ ) +# include "../config.h.android" +#elif defined( __OHOS__ ) +# include "../config.h.ohos" +#else +# include "config.h.unix" // run ./configure to create config.h.unix +#endif + +#endif // CONFIG_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectionbase.h b/smack/smack/src/main/cpp/gloox/src/connectionbase.h new file mode 100644 index 00000000..b5ae5c75 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionbase.h @@ -0,0 +1,167 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef CONNECTIONBASE_H__ +#define CONNECTIONBASE_H__ + +#include "gloox.h" +#include "connectiondatahandler.h" + +#include + +namespace gloox +{ + + /** + * @brief An abstract base class for a connection. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionBase + { + public: + /** + * Constructor. + * @param cdh An object derived from @ref ConnectionDataHandler that will receive + * received data. + */ + ConnectionBase( ConnectionDataHandler* cdh ) + : m_handler( cdh ), m_state( StateDisconnected ), m_port( -1 ) + {} + + /** + * Virtual destructor. + */ + virtual ~ConnectionBase() { cleanup(); } + + /** + * Used to initiate the connection. + * @return Returns the connection state. + */ + virtual ConnectionError connect() = 0; + + /** + * Use this periodically to receive data from the socket. + * @param timeout The timeout to use for select in microseconds. Default of -1 means blocking. + * @return The state of the connection. + */ + virtual ConnectionError recv( int timeout = -1 ) = 0; + + /** + * Use this function to send a string of data over the wire. The function returns only after + * all data has been sent. + * @param data The data to send. + * @return @b True if the data has been sent (no guarantee of receipt), @b false + * in case of an error. + */ + virtual bool send( const std::string& data ) = 0; + + /** + * Use this function to put the connection into 'receive mode', i.e. this function returns only + * when the connection is terminated. + * @return Returns a value indicating the disconnection reason. + */ + virtual ConnectionError receive() = 0; + + /** + * Disconnects an established connection. NOOP if no active connection exists. + */ + virtual void disconnect() = 0; + + /** + * This function is called after a disconnect to clean up internal state. It is also called by + * ConnectionBase's destructor. + */ + virtual void cleanup() {} + + /** + * Returns the current connection state. + * @return The state of the connection. + */ + ConnectionState state() const { return m_state; } + + /** + * Use this function to register a new ConnectionDataHandler. There can be only one + * ConnectionDataHandler at any one time. + * @param cdh The new ConnectionDataHandler. + */ + void registerConnectionDataHandler( ConnectionDataHandler* cdh ) { m_handler = cdh; } + + /** + * Sets the server to connect to. + * @param server The server to connect to. Either IP or fully qualified domain name. + * @param port The port to connect to. + */ + void setServer( const std::string &server, int port = -1 ) { m_server = server; m_port = port; } + + /** + * Returns the currently set server/IP. + * @return The server host/IP. + */ + const std::string& server() const { return m_server; } + + /** + * Returns the currently set port. + * @return The server port. + */ + int port() const { return m_port; } + + /** + * Returns the local port. + * @return The local port. + */ + virtual int localPort() const { return -1; } + + /** + * Returns the locally bound IP address. + * @return The locally bound IP address. + */ + virtual const std::string localInterface() const { return EmptyString; } + + /** + * Returns current connection statistics. + * @param totalIn The total number of bytes received. + * @param totalOut The total number of bytes sent. + */ + virtual void getStatistics( long int &totalIn, long int &totalOut ) = 0; + + /** + * This function returns a new instance of the current ConnectionBase-derived object. + * The idea is to be able to 'clone' ConnectionBase-derived objects without knowing of + * what type they are exactly. + * @return A new Connection* instance. + */ + virtual ConnectionBase* newInstance() const = 0; + + protected: + /** A handler for incoming data and connect/disconnect events. */ + ConnectionDataHandler* m_handler; + + /** Holds the current connection state. */ + ConnectionState m_state; + + /** Holds the server's name/address. */ + std::string m_server; + + /** Holds the port to connect to. */ + int m_port; + + }; + +} + +#endif // CONNECTIONBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectionbosh.cpp b/smack/smack/src/main/cpp/gloox/src/connectionbosh.cpp new file mode 100644 index 00000000..58b9961c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionbosh.cpp @@ -0,0 +1,643 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "config.h" + +#include "gloox.h" + +#include "connectionbosh.h" +#include "logsink.h" +#include "prep.h" +#include "tag.h" +#include "util.h" + +#include +#include +#include +#include + +namespace gloox +{ + + ConnectionBOSH::ConnectionBOSH( ConnectionBase* connection, const LogSink& logInstance, + const std::string& boshHost, const std::string& xmppServer, + int xmppPort ) + : ConnectionBase( 0 ), + m_logInstance( logInstance ), m_parser( this ), m_boshHost( boshHost ), m_path( "/http-bind/" ), + m_rid( 0 ), m_initialStreamSent( false ), m_openRequests( 0 ), + m_maxOpenRequests( 2 ), m_wait( 30 ), m_hold( 2 ), m_streamRestart( false ), + m_lastRequestTime( std::time( 0 ) ), m_minTimePerRequest( 0 ), m_bufferContentLength( 0 ), + m_connMode( ModePipelining ) + { + initInstance( connection, xmppServer, xmppPort ); + } + + ConnectionBOSH::ConnectionBOSH( ConnectionDataHandler* cdh, ConnectionBase* connection, + const LogSink& logInstance, const std::string& boshHost, + const std::string& xmppServer, int xmppPort ) + : ConnectionBase( cdh ), + m_logInstance( logInstance ), m_parser( this ), m_boshHost( boshHost ), m_path( "/http-bind/" ), + m_rid( 0 ), m_initialStreamSent( false ), m_openRequests( 0 ), + m_maxOpenRequests( 2 ), m_wait( 30 ), m_hold( 2 ), m_streamRestart( false ), + m_lastRequestTime( std::time( 0 ) ), m_minTimePerRequest( 0 ), m_bufferContentLength( 0 ), + m_connMode( ModePipelining ) + { + initInstance( connection, xmppServer, xmppPort ); + } + + void ConnectionBOSH::initInstance( ConnectionBase* connection, const std::string& xmppServer, + const int xmppPort ) + { +// FIXME: check return value + prep::idna( xmppServer, m_server ); + m_port = xmppPort; + if( m_port != -1 ) + { + m_boshedHost = m_boshHost + ":" + util::int2string( m_port ); + } + + // drop this connection into our pool of available connections + if( connection ) + { + connection->registerConnectionDataHandler( this ); + m_connectionPool.push_back( connection ); + } + } + + ConnectionBOSH::~ConnectionBOSH() + { + util::clearList( m_activeConnections ); + util::clearList( m_connectionPool ); + } + + ConnectionBase* ConnectionBOSH::newInstance() const + { + ConnectionBase* pBaseConn = 0; + + if( !m_connectionPool.empty() ) + { + pBaseConn = m_connectionPool.front()->newInstance(); + } + else if( !m_activeConnections.empty() ) + { + pBaseConn = m_activeConnections.front()->newInstance(); + } + else + { + return 0; + } + + return new ConnectionBOSH( m_handler, pBaseConn, m_logInstance, + m_boshHost, m_server, m_port ); + } + + ConnectionError ConnectionBOSH::connect() + { + if( m_state >= StateConnecting ) + return ConnNoError; + + if( !m_handler ) + return ConnNotConnected; + + m_state = StateConnecting; + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "Initiating BOSH connection to server: " + + ( ( m_connMode == ModePipelining ) ? std::string( "Pipelining" ) + : ( ( m_connMode == ModeLegacyHTTP ) ? std::string( "LegacyHTTP" ) + : std::string( "PersistentHTTP" ) ) ) ); + getConnection(); + return ConnNoError; // FIXME? + } + + void ConnectionBOSH::disconnect() + { + if( ( m_connMode == ModePipelining && m_activeConnections.empty() ) + || ( m_connectionPool.empty() && m_activeConnections.empty() ) ) + return; + + if( m_state != StateDisconnected ) + { + ++m_rid; + + std::string requestBody = ""; + m_sendBuffer = EmptyString; + } + sendRequest( requestBody ); + + m_logInstance.dbg( LogAreaClassConnectionBOSH, "BOSH disconnection request sent" ); + } + else + { + m_logInstance.err( LogAreaClassConnectionBOSH, + "Disconnecting from server in a non-graceful fashion" ); + } + + util::ForEach( m_activeConnections, &ConnectionBase::disconnect ); + util::ForEach( m_connectionPool, &ConnectionBase::disconnect ); + + m_state = StateDisconnected; + if( m_handler ) + m_handler->handleDisconnect( this, ConnUserDisconnected ); + } + + ConnectionError ConnectionBOSH::recv( int timeout ) + { + ConnectionError ret = ConnNoError; + + if( m_state == StateDisconnected ) + return ConnNotConnected; + + if( !m_connectionPool.empty() ) + ret = m_connectionPool.front()->recv( 0 ); + if( !m_activeConnections.empty() ) + ret = m_activeConnections.front()->recv( timeout ); + + // If there are no open requests then the spec allows us to send an empty request... + // (Some CMs do not obey this, it seems) + if( ( m_openRequests == 0 || m_sendBuffer.size() > 0 ) && m_state == StateConnected ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "Sending empty request (or there is data in the send buffer)" ); + sendXML(); + } + + return ret; + } + + bool ConnectionBOSH::send( const std::string& data ) + { + + if( m_state == StateDisconnected ) + return false; + + if( data.substr( 0, 2 ) == " dropped" ); +// return true; +// } + } + else if( data == "
    " ) + return true; + + m_sendBuffer += data; + sendXML(); + + return true; + } + + /* Sends XML. Wraps data in a tag, and then passes to sendRequest(). */ + bool ConnectionBOSH::sendXML() + { + if( m_state != StateConnected ) + { + m_logInstance.warn( LogAreaClassConnectionBOSH, + "Data sent before connection established (will be buffered)" ); + return false; + } + + if( m_sendBuffer.empty() ) + { + time_t now = time( 0 ); + unsigned int delta = (int)(now - m_lastRequestTime); + if( delta < m_minTimePerRequest && m_openRequests > 0 ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Too little time between requests: " + util::int2string( delta ) + " seconds" ); + return false; + } + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Send buffer is empty, sending empty request" ); + } + + ++m_rid; + + std::string requestBody = ""; + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Restarting stream" ); + } + else + { + requestBody += ">" + m_sendBuffer + ""; + } + // Send a request. Force if we are not sending an empty request, or if there are no connections open + if( sendRequest( requestBody ) ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Successfully sent m_sendBuffer" ); + m_sendBuffer = EmptyString; + m_streamRestart = false; + } + else + { + --m_rid; // I think... (may need to rethink when acks are implemented) + m_logInstance.warn( LogAreaClassConnectionBOSH, + "Unable to send. Connection not complete, or too many open requests," + " so added to buffer." ); + } + + return true; + } + + /* Chooses the appropriate connection, or opens a new one if necessary. Wraps xml in HTTP and sends. */ + bool ConnectionBOSH::sendRequest( const std::string& xml ) + { + ConnectionBase* conn = getConnection(); + if( !conn ) + return false; + + std::string request = "POST " + m_path; + if( m_connMode == ModeLegacyHTTP ) + { + request += " HTTP/1.0\r\n"; + request += "Connection: close\r\n"; + } + else + request += " HTTP/1.1\r\n"; + + request += "Host: " + m_boshedHost + "\r\n"; + request += "Content-Type: text/xml; charset=utf-8\r\n"; + request += "Content-Length: " + util::int2string( xml.length() ) + "\r\n"; + request += "User-Agent: gloox/" + GLOOX_VERSION + "\r\n\r\n"; + request += xml; + + + if( conn->send( request ) ) + { + m_lastRequestTime = time( 0 ); + ++m_openRequests; + return true; + } +// else // FIXME What to do in this case? +// printf( "Error while trying to send on socket (state: %d)\n", conn->state() ); + + return false; + } + + bool ci_equal( char ch1, char ch2 ) + { + return std::toupper( (unsigned char)ch1 ) == std::toupper( (unsigned char)ch2 ); + } + + std::string::size_type ci_find( const std::string& str1, const std::string& str2 ) + { + std::string::const_iterator pos = std::search( str1.begin(), str1.end(), + str2.begin(), str2.end(), ci_equal ); + if( pos == str1.end() ) + return std::string::npos; + else + return std::distance( str1.begin(), pos ); + } + + const std::string ConnectionBOSH::getHTTPField( const std::string& field ) + { + std::string::size_type fp = ci_find( m_bufferHeader, "\r\n" + field + ": " ); + + if( fp == std::string::npos ) + return EmptyString; + + fp += field.length() + 4; + + const std::string::size_type fp2 = m_bufferHeader.find( "\r\n", fp ); + if( fp2 == std::string::npos ) + return EmptyString; + + return m_bufferHeader.substr( fp, fp2 - fp ); + } + + ConnectionError ConnectionBOSH::receive() + { + ConnectionError err = ConnNoError; + while( m_state != StateDisconnected && ( err = recv( 10 ) ) == ConnNoError ) + ; + return err == ConnNoError ? ConnNotConnected : err; + } + + void ConnectionBOSH::cleanup() + { + m_state = StateDisconnected; + + util::ForEach( m_activeConnections, &ConnectionBase::cleanup ); + util::ForEach( m_connectionPool, &ConnectionBase::cleanup ); + } + + void ConnectionBOSH::getStatistics( long int& totalIn, long int& totalOut ) + { + util::ForEach( m_activeConnections, &ConnectionBase::getStatistics, totalIn, totalOut ); + util::ForEach( m_connectionPool, &ConnectionBase::getStatistics, totalIn, totalOut ); + } + + void ConnectionBOSH::handleReceivedData( const ConnectionBase* /*connection*/, + const std::string& data ) + { + m_buffer += data; + std::string::size_type headerLength = 0; + while( ( headerLength = m_buffer.find( "\r\n\r\n" ) ) != std::string::npos ) + { + m_bufferHeader = m_buffer.substr( 0, headerLength+2 ); + + const std::string& statusCode = m_bufferHeader.substr( 9, 3 ); + if( statusCode != "200" ) + { + m_logInstance.warn( LogAreaClassConnectionBOSH, + "Received error via legacy HTTP status code: " + statusCode + + ". Disconnecting." ); + m_state = StateDisconnected; // As per XEP, consider connection broken + disconnect(); + } + + m_bufferContentLength = atol( getHTTPField( "Content-Length" ).c_str() ); + if( !m_bufferContentLength ) + return; + + if( m_connMode != ModeLegacyHTTP && ( getHTTPField( "Connection" ) == "close" + || m_bufferHeader.substr( 0, 8 ) == "HTTP/1.0" ) ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "Server indicated lack of support for HTTP/1.1 - falling back to HTTP/1.0" ); + m_connMode = ModeLegacyHTTP; + } + + if( m_buffer.length() >= ( headerLength + 4 + m_bufferContentLength ) ) + { + putConnection(); + --m_openRequests; + std::string xml = m_buffer.substr( headerLength + 4, m_bufferContentLength ); + m_parser.feed( xml ); + m_buffer.erase( 0, headerLength + 4 + m_bufferContentLength ); + m_bufferContentLength = 0; + m_bufferHeader = EmptyString; + } + else + { + m_logInstance.warn( LogAreaClassConnectionBOSH, "Buffer length mismatch" ); + break; + } + } + } + + void ConnectionBOSH::handleConnect( const ConnectionBase* /*connection*/ ) + { + if( m_state == StateConnecting ) + { + m_rid = rand() % 100000 + 1728679472; + + Tag requestBody( "body" ); + requestBody.setXmlns( XMLNS_HTTPBIND ); + requestBody.setXmlns( XMLNS_XMPP_BOSH, "xmpp" ); + + requestBody.addAttribute( "content", "text/xml; charset=utf-8" ); + requestBody.addAttribute( "hold", (long)m_hold ); + requestBody.addAttribute( "rid", (long)m_rid ); + requestBody.addAttribute( "ver", "1.6" ); + requestBody.addAttribute( "wait", (long)m_wait ); + requestBody.addAttribute( "ack", 0 ); + requestBody.addAttribute( "secure", "false" ); + requestBody.addAttribute( "route", "xmpp:" + m_server + ":5222" ); + requestBody.addAttribute( "xml:lang", "en" ); + requestBody.addAttribute( "xmpp:version", "1.0" ); + requestBody.addAttribute( "to", m_server ); + + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Sending BOSH connection request" ); + sendRequest( requestBody.xml() ); + } + } + + void ConnectionBOSH::handleDisconnect( const ConnectionBase* /*connection*/, + ConnectionError reason ) + { + if( m_handler && m_state == StateConnecting ) + { + m_state = StateDisconnected; + m_handler->handleDisconnect( this, reason ); + return; + } + + switch( m_connMode ) // FIXME avoid that if we're disconnecting on purpose + { + case ModePipelining: + m_connMode = ModeLegacyHTTP; // Server seems not to support pipelining + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "Connection closed - falling back to HTTP/1.0 connection method" ); + break; + case ModeLegacyHTTP: + case ModePersistentHTTP: + // FIXME do we need to do anything here? +// printf( "A TCP connection %p was disconnected (reason: %d).\n", connection, reason ); + break; + } + } + + void ConnectionBOSH::handleTag( Tag* tag ) + { + if( !m_handler || tag->name() != "body" ) + return; + + if( m_streamRestart ) + { + m_streamRestart = false; + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Sending spoofed " ); + m_handler->handleReceivedData( this, "" + "" ); + } + + if( tag->hasAttribute( "sid" ) ) + { + m_state = StateConnected; + m_sid = tag->findAttribute( "sid" ); + + if( tag->hasAttribute( "requests" ) ) + { + const int serverRequests = atoi( tag->findAttribute( "requests" ).c_str() ); + if( serverRequests < m_maxOpenRequests ) + { + m_maxOpenRequests = serverRequests; + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "BOSH parameter 'requests' now set to " + tag->findAttribute( "requests" ) ); + } + } + if( tag->hasAttribute( "hold" ) ) + { + const int maxHold = atoi( tag->findAttribute( "hold" ).c_str() ); + if( maxHold < m_hold ) + { + m_hold = maxHold; + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "BOSH parameter 'hold' now set to " + tag->findAttribute( "hold" ) ); + } + } + if( tag->hasAttribute( "wait" ) ) + { + const int maxWait = atoi( tag->findAttribute( "wait" ).c_str() ); + if( maxWait < m_wait ) + { + m_wait = maxWait; + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "BOSH parameter 'wait' now set to " + tag->findAttribute( "wait" ) + + " seconds" ); + } + } + if( tag->hasAttribute( "polling" ) ) + { + const int minTime = atoi( tag->findAttribute( "polling" ).c_str() ); + m_minTimePerRequest = minTime; + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "BOSH parameter 'polling' now set to " + tag->findAttribute( "polling" ) + + " seconds" ); + } + + if( m_state < StateConnected ) + m_handler->handleConnect( this ); + + m_handler->handleReceivedData( this, "" // FIXME move to send() so that + // it is more clearly a response + // to the initial stream opener? + "" ); + } + + if( tag->findAttribute( "type" ) == "terminate" ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, + "BOSH connection closed by server: " + tag->findAttribute( "condition" ) ); + m_state = StateDisconnected; + m_handler->handleDisconnect( this, ConnStreamClosed ); + return; + } + + const TagList& stanzas = tag->children(); + TagList::const_iterator it = stanzas.begin(); + for( ; it != stanzas.end(); ++it ) + m_handler->handleReceivedData( this, (*it)->xml() ); + } + + ConnectionBase* ConnectionBOSH::getConnection() + { + if( m_openRequests > 0 && m_openRequests >= m_maxOpenRequests ) + { + m_logInstance.warn( LogAreaClassConnectionBOSH, + "Too many requests already open. Cannot send." ); + return 0; + } + + ConnectionBase* conn = 0; + switch( m_connMode ) + { + case ModePipelining: + if( !m_activeConnections.empty() ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Using default connection for Pipelining." ); + return m_activeConnections.front(); + } + else if( !m_connectionPool.empty() ) + { + m_logInstance.warn( LogAreaClassConnectionBOSH, + "Pipelining selected, but no connection open. Opening one." ); + return activateConnection(); + } + else + m_logInstance.warn( LogAreaClassConnectionBOSH, + "No available connections to pipeline on." ); + break; + case ModeLegacyHTTP: + case ModePersistentHTTP: + { + if( !m_connectionPool.empty() ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, "LegacyHTTP/PersistentHTTP selected, " + "using connection from pool." ); + return activateConnection(); + } + else if( !m_activeConnections.empty() ) + { + m_logInstance.dbg( LogAreaClassConnectionBOSH, "No connections in pool, creating a new one." ); + conn = m_activeConnections.front()->newInstance(); + conn->registerConnectionDataHandler( this ); + m_connectionPool.push_back( conn ); + conn->connect(); + } + else + m_logInstance.warn( LogAreaClassConnectionBOSH, + "No available connections to send on." ); + break; + } + } + return 0; + } + + ConnectionBase* ConnectionBOSH::activateConnection() + { + ConnectionBase* conn = m_connectionPool.front(); + m_connectionPool.pop_front(); + if( conn->state() == StateConnected ) + { + m_activeConnections.push_back( conn ); + return conn; + } + + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Connecting pooled connection." ); + m_connectionPool.push_back( conn ); + conn->connect(); + return 0; + } + + void ConnectionBOSH::putConnection() + { + ConnectionBase* conn = m_activeConnections.front(); + + switch( m_connMode ) + { + case ModeLegacyHTTP: + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Disconnecting LegacyHTTP connection" ); + conn->disconnect(); + conn->cleanup(); // This is necessary + m_activeConnections.pop_front(); + m_connectionPool.push_back( conn ); + break; + case ModePersistentHTTP: + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Deactivating PersistentHTTP connection" ); + m_activeConnections.pop_front(); + m_connectionPool.push_back( conn ); + break; + case ModePipelining: + m_logInstance.dbg( LogAreaClassConnectionBOSH, "Keeping Pipelining connection" ); + default: + break; + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectionbosh.h b/smack/smack/src/main/cpp/gloox/src/connectionbosh.h new file mode 100644 index 00000000..ef74882b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionbosh.h @@ -0,0 +1,225 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#ifndef CONNECTIONBOSH_H__ +#define CONNECTIONBOSH_H__ + +#include "gloox.h" +#include "connectionbase.h" +#include "logsink.h" +#include "taghandler.h" +#include "parser.h" + +#include +#include +#include + +namespace gloox +{ + + /** + * @brief This is an implementation of a BOSH (HTTP binding) connection. + * + * Usage: + * + * @code + * Client *c = new Client( ... ); + * c->setConnectionImpl( new ConnectionBOSH( c, + * new ConnectionTCPClient( c->logInstance(), httpServer, httpPort ), + * c->logInstance(), boshHost, xmpphost, xmppPort ) ); + * @endcode + * + * Make sure to pass the BOSH connection manager's host/port to the transport connection + * (ConnectionTCPClient in this case), and the XMPP server's host and port to the BOSH connection. + * You must also pass to BOSH the address of the BOSH server you are dealing with, this is used + * in the HTTP Host header. + * + * In the case of using ConnectionBOSH through a HTTP proxy, supply httpServer and httpPort as + * those of the proxy. In all cases, boshHost should be set to the hostname (not IP address) of + * the server running the BOSH connection manager. + * + * The reason why ConnectionBOSH doesn't manage its own ConnectionTCPClient is that it allows it + * to be used with other transports (like chained SOCKS5/HTTP proxies, or ConnectionTLS + * for HTTPS). + * + * @note To avoid problems, you should disable TLS in gloox by calling + * ClientBase::setTls( TLSDisabled ). + * + * Sample configurations for different servers can be found in the bosh_example.cpp file included + * with gloox in the @b src/examples/ directory. + * + * @author Matthew Wild + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API ConnectionBOSH : public ConnectionBase, ConnectionDataHandler, TagHandler + { + public: + /** + * Constructs a new ConnectionBOSH object. + * @param connection A transport connection. It should be configured to connect to + * the BOSH connection manager's (or a HTTP proxy's) host and port, @b not to the XMPP host. + * ConnectionBOSH will own the transport connection and delete it in its destructor. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param boshHost The hostname of the BOSH connection manager + * @param xmppServer A server to connect to. This is the XMPP server's address, @b not the + * connection manager's. + * @param xmppPort The port to connect to. This is the XMPP server's port, @b not the connection + * manager's. + * @note To properly use this object, you have to set a ConnectionDataHandler using + * registerConnectionDataHandler(). This is not necessary if this object is + * part of a 'connection chain', e.g. with ConnectionSOCKS5Proxy. + */ + ConnectionBOSH( ConnectionBase* connection, const LogSink& logInstance, const std::string& boshHost, + const std::string& xmppServer, int xmppPort = 5222 ); + + /** + * Constructs a new ConnectionBOSH object. + * @param cdh An ConnectionDataHandler-derived object that will handle incoming data. + * @param connection A transport connection. It should be configured to connect to + * the connection manager's (or proxy's) host and port, @b not to the XMPP host. ConnectionBOSH + * will own the transport connection and delete it in its destructor. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param boshHost The hostname of the BOSH connection manager (not any intermediate proxy) + * @param xmppServer A server to connect to. This is the XMPP server's address, @b not the connection + * manager's. + * @param xmppPort The port to connect to. This is the XMPP server's port, @b not the connection + * manager's. + */ + ConnectionBOSH( ConnectionDataHandler* cdh, ConnectionBase* connection, + const LogSink& logInstance, const std::string& boshHost, + const std::string& xmppServer, int xmppPort = 5222 ); + + /** + * Virtual destructor + */ + virtual ~ConnectionBOSH(); + + /** + * The supported connection modes. Usually auto-detected. + */ + enum ConnMode + { + ModeLegacyHTTP, /**< HTTP 1.0 connections, closed after receiving a response */ + ModePersistentHTTP, /**< HTTP 1.1 connections, re-used after receiving a response */ + ModePipelining /**< HTTP Pipelining (implies HTTP 1.1) a single connection is used */ + }; + + /** + * Sets the XMPP server to proxy to. + * @param xmppHost The XMPP server hostname (IP address). + * @param xmppPort The XMPP server port. + */ + void setServer( const std::string& xmppHost, unsigned short xmppPort = 5222 ) + { m_server = xmppHost; m_port = xmppPort; } + + /** + * Sets the path on the connection manager to request + * @param path The path, the default is "/http-bind/", which is the default for + * many connection managers. + */ + void setPath( const std::string& path ) { m_path = path; } + + /** + * Sets the connection mode + * @param mode The connection mode, @sa ConnMode + * @note In the case that a mode is selected that the connection manager + * or proxy does not support, gloox will fall back to using HTTP/1.0 connections, + * which should work with any server. + */ + void setMode( ConnMode mode ) { m_connMode = mode; } + + // reimplemented from ConnectionBase + virtual ConnectionError connect(); + + // reimplemented from ConnectionBase + virtual ConnectionError recv( int timeout = -1 ); + + // reimplemented from ConnectionBase + virtual bool send( const std::string& data ); + + // reimplemented from ConnectionBase + virtual ConnectionError receive(); + + // reimplemented from ConnectionBase + virtual void disconnect(); + + // reimplemented from ConnectionBase + virtual void cleanup(); + + // reimplemented from ConnectionBase + virtual void getStatistics( long int& totalIn, long int& totalOut ); + + // reimplemented from ConnectionDataHandler + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleConnect( const ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + + // reimplemented from ConnectionDataHandler + virtual ConnectionBase* newInstance() const; + + // reimplemented from TagHandler + virtual void handleTag( Tag* tag ); + + private: + ConnectionBOSH& operator=( const ConnectionBOSH& ); + void initInstance( ConnectionBase* connection, const std::string& xmppServer, const int xmppPort ); + bool sendRequest( const std::string& xml ); + bool sendXML(); + const std::string getHTTPField( const std::string& field ); + ConnectionBase* getConnection(); + ConnectionBase* activateConnection(); + void putConnection(); + + //ConnectionBase *m_connection; + const LogSink& m_logInstance; + + Parser m_parser; // Used for parsing XML section of responses + std::string m_boshHost; // The hostname of the BOSH connection manager + std::string m_boshedHost; // The hostname of the BOSH connection manager + : + port + std::string m_path; // The path part of the URL that we need to request + + // BOSH parameters + unsigned long m_rid; + std::string m_sid; + + bool m_initialStreamSent; + int m_openRequests; + int m_maxOpenRequests; + int m_wait; + int m_hold; + + bool m_streamRestart; // Set to true if we are waiting for an acknowledgement of a stream restart + + time_t m_lastRequestTime; + unsigned long m_minTimePerRequest; + + std::string m_buffer; // Buffer of received data + std::string m_bufferHeader; // HTTP header of data currently in buffer // FIXME doens't need to be member + std::string::size_type m_bufferContentLength; // Length of the data in the current response + + std::string m_sendBuffer; // Data waiting to be sent + + typedef std::list ConnectionList; + ConnectionList m_activeConnections; + ConnectionList m_connectionPool; + ConnMode m_connMode; + + }; + +} + +#endif // CONNECTIONBOSH_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectiondatahandler.h b/smack/smack/src/main/cpp/gloox/src/connectiondatahandler.h new file mode 100644 index 00000000..6481644f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiondatahandler.h @@ -0,0 +1,66 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef CONNECTIONDATAHANDLER_H__ +#define CONNECTIONDATAHANDLER_H__ + +#include "gloox.h" + +#include + +namespace gloox +{ + + class ConnectionBase; + + /** + * @brief This is an abstract base class to receive events from a ConnectionBase-derived object. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionDataHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~ConnectionDataHandler() {} + + /** + * This function is called for received from the underlying transport. + * @param connection The connection that received the data. + * @param data The data received. + */ + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ) = 0; + + /** + * This function is called when e.g. the raw TCP connection was established. + * @param connection The connection. + */ + virtual void handleConnect( const ConnectionBase* connection ) = 0; + + /** + * This connection is called when e.g. the raw TCP connection was closed. + * @param connection The connection. + * @param reason The reason for the disconnect. + */ + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ) = 0; + }; + +} + +#endif // CONNECTIONDATAHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectionhandler.h b/smack/smack/src/main/cpp/gloox/src/connectionhandler.h new file mode 100644 index 00000000..20b0060a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionhandler.h @@ -0,0 +1,52 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef CONNECTIONHANDLER_H__ +#define CONNECTIONHANDLER_H__ + +#include "connectionbase.h" + +namespace gloox +{ + + /** + * @brief This is an abstract base class to receive incoming connection attempts. Do not + * confuse this with ConnectionListener, which is used with XMPP streams and has a + * completely different meaning. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~ConnectionHandler() {} + + /** + * This function is called to receive an incoming connection. + * @param server The server that the connection was made to. + * @param connection The incoming connection. + */ + virtual void handleIncomingConnection( ConnectionBase* server, ConnectionBase* connection ) = 0; + + }; + +} + +#endif // CONNECTIONHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.cpp b/smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.cpp new file mode 100644 index 00000000..8a4d48ea --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.cpp @@ -0,0 +1,215 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "gloox.h" + +#include "connectionhttpproxy.h" +#include "dns.h" +#include "logsink.h" +#include "prep.h" +#include "base64.h" +#include "util.h" + +#include + +namespace gloox +{ + + ConnectionHTTPProxy::ConnectionHTTPProxy( ConnectionBase* connection, + const LogSink& logInstance, + const std::string& server, int port ) + : ConnectionBase( 0 ), m_connection( connection ), + m_logInstance( logInstance ), m_http11( false ) + { +// FIXME check return value? + prep::idna( server, m_server ); + m_port = port; + + if( m_connection ) + m_connection->registerConnectionDataHandler( this ); + } + + ConnectionHTTPProxy::ConnectionHTTPProxy( ConnectionDataHandler* cdh, + ConnectionBase* connection, + const LogSink& logInstance, + const std::string& server, int port ) + : ConnectionBase( cdh ), m_connection( connection ), + m_logInstance( logInstance ) + { +// FIXME check return value? + prep::idna( server, m_server ); + m_port = port; + + if( m_connection ) + m_connection->registerConnectionDataHandler( this ); + } + + ConnectionHTTPProxy::~ConnectionHTTPProxy() + { + delete m_connection; + } + + ConnectionBase* ConnectionHTTPProxy::newInstance() const + { + ConnectionBase* conn = m_connection ? m_connection->newInstance() : 0; + return new ConnectionHTTPProxy( m_handler, conn, m_logInstance, m_server, m_port ); + } + + void ConnectionHTTPProxy::setConnectionImpl( ConnectionBase* connection ) + { + if( m_connection ) + delete m_connection; + + m_connection = connection; + } + + ConnectionError ConnectionHTTPProxy::connect() + { + if( m_connection && m_handler ) + { + m_state = StateConnecting; + return m_connection->connect(); + } + + return ConnNotConnected; + } + + void ConnectionHTTPProxy::disconnect() + { + m_state = StateDisconnected; + if( m_connection ) + m_connection->disconnect(); + } + + ConnectionError ConnectionHTTPProxy::recv( int timeout ) + { + return m_connection ? m_connection->recv( timeout ) : ConnNotConnected; + } + + ConnectionError ConnectionHTTPProxy::receive() + { + return m_connection ? m_connection->receive() : ConnNotConnected; + } + + bool ConnectionHTTPProxy::send( const std::string& data ) + { + return m_connection && m_connection->send( data ); + } + + void ConnectionHTTPProxy::cleanup() + { + m_state = StateDisconnected; + + if( m_connection ) + m_connection->cleanup(); + } + + void ConnectionHTTPProxy::getStatistics( long int& totalIn, long int& totalOut ) + { + if( m_connection ) + m_connection->getStatistics( totalIn, totalOut ); + else + totalIn = totalOut = 0; + } + + void ConnectionHTTPProxy::handleReceivedData( const ConnectionBase* /*connection*/, + const std::string& data ) + { + if( !m_handler ) + return; + + if( m_state == StateConnecting ) + { + m_proxyHandshakeBuffer += data; + if( ( !m_proxyHandshakeBuffer.compare( 0, 12, "HTTP/1.0 200" ) + || !m_proxyHandshakeBuffer.compare( 0, 12, "HTTP/1.1 200" ) ) + && !m_proxyHandshakeBuffer.compare( m_proxyHandshakeBuffer.length() - 4, 4, "\r\n\r\n" ) ) + { + m_proxyHandshakeBuffer = EmptyString; + m_state = StateConnected; + m_logInstance.dbg( LogAreaClassConnectionHTTPProxy, + "HTTP proxy connection established" ); + m_handler->handleConnect( this ); + } + else if( !m_proxyHandshakeBuffer.compare( 9, 3, "407" ) ) + { + m_handler->handleDisconnect( this, ConnProxyAuthRequired ); + m_connection->disconnect(); + } + else if( !m_proxyHandshakeBuffer.compare( 9, 3, "403" ) + || !m_proxyHandshakeBuffer.compare( 9, 3, "404" ) ) + { + m_handler->handleDisconnect( this, ConnProxyAuthFailed ); + m_connection->disconnect(); + } + } + else if( m_state == StateConnected ) + m_handler->handleReceivedData( this, data ); + } + + void ConnectionHTTPProxy::handleConnect( const ConnectionBase* /*connection*/ ) + { + if( m_connection ) + { + std::string server = m_server; + int port = m_port; + if( port == -1 ) + { + const DNS::HostMap& servers = DNS::resolve( m_server, m_logInstance ); + if( !servers.empty() ) + { + const std::pair< std::string, int >& host = *servers.begin(); + server = host.first; + port = host.second; + } + } + std::string message = "Requesting HTTP proxy connection to " + server + ":" + + util::int2string( port ); + m_logInstance.dbg( LogAreaClassConnectionHTTPProxy, message ); + + std::string os = "CONNECT " + server + ":" + util::int2string( port ) + " HTTP/1." + + util::int2string( m_http11 ? 1 : 0 ) + "\r\n" + "Host: " + server + "\r\n" + "Content-Length: 0\r\n" + "Proxy-Connection: Keep-Alive\r\n" + "Pragma: no-cache\r\n" + "User-Agent: gloox/" + GLOOX_VERSION + "\r\n"; + + if( !m_proxyUser.empty() && !m_proxyPwd.empty() ) + { + os += "Proxy-Authorization: Basic " + Base64::encode64( m_proxyUser + ":" + m_proxyPwd ) + + "\r\n"; + } + os += "\r\n"; + + if( !m_connection->send( os ) ) + { + m_state = StateDisconnected; + if( m_handler ) + m_handler->handleDisconnect( this, ConnIoError ); + } + } + } + + void ConnectionHTTPProxy::handleDisconnect( const ConnectionBase* /*connection*/, + ConnectionError reason ) + { + m_state = StateDisconnected; + m_logInstance.dbg( LogAreaClassConnectionHTTPProxy, "HTTP Proxy connection closed" ); + + if( m_handler ) + m_handler->handleDisconnect( this, reason ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.h b/smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.h new file mode 100644 index 00000000..d830f925 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionhttpproxy.h @@ -0,0 +1,171 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CONNECTIONHTTPPROXY_H__ +#define CONNECTIONHTTPPROXY_H__ + +#include "gloox.h" +#include "connectionbase.h" +#include "logsink.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an implementation of a simple HTTP Proxying connection. + * + * Usage: + * + * @code + * Client* c = new Client( ... ); + * ConnectionTCPClient* conn0 = new ConnectionTCPClient( c->logInstance(), + * proxyHost, proxyPort ); + * ConnectionHTTPProxy* conn1 = new ConnectionHTTPProxy( c, conn0, c->logInstance(), + * xmppHost, xmppPort ); + * c->setConnectionImpl( conn1 ); + * @endcode + * + * Make sure to pass the proxy host/port to the transport connection (ConnectionTCPClient in this case), + * and the XMPP host/port to the proxy connection. + * + * ConnectionHTTPProxy uses the CONNECT method to pass through the proxy. If your proxy does not + * allow this kind of connections, or if it kills connections after some time, you may want to use + * ConnectionBOSH instead or in addition. + * + * The reason why ConnectionHTTPProxy doesn't manage its own ConnectionTCPClient is that it allows it + * to be used with other transports (like IPv6 or chained SOCKS5/HTTP proxies). + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionHTTPProxy : public ConnectionBase, public ConnectionDataHandler + { + public: + /** + * Constructs a new ConnectionHTTPProxy object. + * @param connection A transport connection. It should be configured to connect to + * the proxy host and port, @b not to the XMPP host. ConnectionHTTPProxy will own the + * transport connection and delete it in its destructor. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. This is the XMPP server's address, @b not the proxy. + * @param port The port to connect to. This is the XMPP server's port, @b not the proxy's. + * The default of -1 means that SRV records will be used to find out about the actual host:port. + * @note To properly use this object, you have to set a ConnectionDataHandler using + * registerConnectionDataHandler(). This is not necessary if this object is + * part of a 'connection chain', e.g. with ConnectionSOCKS5Proxy. + */ + ConnectionHTTPProxy( ConnectionBase* connection, const LogSink& logInstance, + const std::string& server, int port = -1 ); + + /** + * Constructs a new ConnectionHTTPProxy object. + * @param cdh An ConnectionDataHandler-derived object that will handle incoming data. + * @param connection A transport connection. It should be configured to connect to + * the proxy host and port, @b not to the XMPP host. ConnectionHTTPProxy will own the + * transport connection and delete it in its destructor. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. This is the XMPP server's address, @b not the proxy. + * @param port The port to connect to. This is the XMPP server's port, @b not the proxy's. + * The default of -1 means that SRV records will be used to find out about the actual host:port. + */ + ConnectionHTTPProxy( ConnectionDataHandler* cdh, ConnectionBase* connection, + const LogSink& logInstance, + const std::string& server, int port = -1 ); + + /** + * Virtual destructor + */ + virtual ~ConnectionHTTPProxy(); + + // reimplemented from ConnectionBase + virtual ConnectionError connect(); + + // reimplemented from ConnectionBase + virtual ConnectionError recv( int timeout = -1 ); + + // reimplemented from ConnectionBase + virtual bool send( const std::string& data ); + + // reimplemented from ConnectionBase + virtual ConnectionError receive(); + + // reimplemented from ConnectionBase + virtual void disconnect(); + + // reimplemented from ConnectionBase + virtual void cleanup(); + + // reimplemented from ConnectionBase + virtual void getStatistics( long int &totalIn, long int &totalOut ); + + // reimplemented from ConnectionDataHandler + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleConnect( const ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + + // reimplemented from ConnectionDataHandler + virtual ConnectionBase* newInstance() const; + + /** + * Sets the XMPP server to proxy to. + * @param host The XMPP server hostname (IP address). + * @param port The XMPP server port. The default of -1 means that SRV records will be used + * to find out about the actual host:port. + */ + void setServer( const std::string& host, int port = -1 ) + { m_server = host; m_port = port; } + + /** + * Sets proxy authorization credentials. + * @param user The user name to use for proxy authorization. + * @param password The password to use for proxy authorization. + */ + void setProxyAuth( const std::string& user, const std::string& password ) + { m_proxyUser = user; m_proxyPwd = password; } + + /** + * Sets the underlying transport connection. A possibly existing connection will be deleted. + * @param connection The ConnectionBase to replace the current connection, if any. + */ + void setConnectionImpl( ConnectionBase* connection ); + + /** + * Switches usage of HTTP/1.1 on or off. + * @param http11 Set this to @b true to connect through a HTTP/1.1-only proxy, or @b false + * to use HTTP/1.0. Defaults to HTTP/1.0 which should work with 99.9% of proxies. + */ + void setHTTP11( bool http11 ) { m_http11 = http11; } + + private: + ConnectionHTTPProxy &operator=( const ConnectionHTTPProxy& ); + + ConnectionBase* m_connection; + const LogSink& m_logInstance; + + std::string m_proxyUser; + std::string m_proxyPwd; + std::string m_proxyHandshakeBuffer; + + bool m_http11; + + }; + +} + +#endif // CONNECTIONHTTPPROXY_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectionlistener.h b/smack/smack/src/main/cpp/gloox/src/connectionlistener.h new file mode 100644 index 00000000..fe945e5a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionlistener.h @@ -0,0 +1,106 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CONNECTIONLISTENER_H__ +#define CONNECTIONLISTENER_H__ + +#include "gloox.h" + +namespace gloox +{ + + class Error; + + /** + * @brief Derived classes can be registered as ConnectionListeners with the Client. + * + * This interface is mandatory to implement if a connection is to be made TLS-encrypted. + * In onTLSConnect(), the server's certificate information needs to be checked, and @b true + * returned if the certificate is to be accepted. + * + * @author Jakob Schröter + */ + class GLOOX_API ConnectionListener + { + public: + /** + * Virtual Destructor. + */ + virtual ~ConnectionListener() {} + + /** + * This function notifies about successful connections. It will be called either after all + * authentication is finished if username/password were supplied, or after a connection has + * been established if no credentials were supplied. Depending on the setting of AutoPresence, + * a presence stanza is sent or not. + */ + virtual void onConnect() = 0; + + /** + * This function notifies about disconnection and its reason. + * If @b e indicates a stream error, you can use @ref ClientBase::streamError() to find out + * what exactly went wrong, and @ref ClientBase::streamErrorText() to retrieve any explaining text + * sent along with the error. + * If @b e indicates an authentication error, you can use @ref ClientBase::authError() + * to get a finer grained reason. + * @param e The reason for the disconnection. + */ + virtual void onDisconnect( ConnectionError e ) = 0; + + /** + * This function will be called when a resource has been bound to the stream. It + * will be called for any bound resource, including the main one. + * @note The bound resource may be different from the one requested. The server + * has the authority to change/overwrite the requested resource. + * @param resource The resource string. + * @since 1.0 + */ + virtual void onResourceBind( const std::string& resource ) { (void)resource; } + + /** + * This function is called (by a Client object) if an error occurs while trying to bind a resource. + * @param error A pointer to an Error object that contains more + * information. May be 0. + */ + virtual void onResourceBindError( const Error* error ) { (void) (error); } + + /** + * This function is called (by a Client object) if an error occurs while trying to establish + * a session. + * @param error A pointer to an Error object that contains more + * information. May be 0. + */ + virtual void onSessionCreateError( const Error* error ) { (void) (error); } + + /** + * This function is called when the connection was TLS/SSL secured. + * @param info Comprehensive info on the certificate. + * @return @b True if cert credentials are accepted, @b false otherwise. If @b false is returned + * the connection is terminated. + */ + virtual bool onTLSConnect( const CertInfo& info ) = 0; + + /** + * This function is called for certain stream events. Notifications are purely informational + * and implementation is optional. Not all StreamEvents will necessarily be emitted for + * a given connection. + * @param event A stream event. + * @since 0.9 + */ + virtual void onStreamEvent( StreamEvent event ) { (void) (event); } + + }; + +} + +#endif // CONNECTIONLISTENER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.cpp b/smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.cpp new file mode 100644 index 00000000..d77d0784 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.cpp @@ -0,0 +1,377 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "config.h" + +#include "gloox.h" + +#include "connectionsocks5proxy.h" +#include "dns.h" +#include "logsink.h" +#include "prep.h" +#include "base64.h" +#include "util.h" + +#include +#include + +#include + +#if ( !defined( _WIN32 ) && !defined( _WIN32_WCE ) ) || defined( __SYMBIAN32__ ) +# include +#endif + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# include +#elif defined( _WIN32_WCE ) +# include +#endif + +namespace gloox +{ + + ConnectionSOCKS5Proxy::ConnectionSOCKS5Proxy( ConnectionBase* connection, + const LogSink& logInstance, + const std::string& server, + int port, bool ip ) + : ConnectionBase( 0 ), m_connection( connection ), + m_logInstance( logInstance ), m_s5state( S5StateDisconnected ), m_ip( ip ) + { +// FIXME check return value? + prep::idna( server, m_server ); + m_port = port; + + if( m_connection ) + m_connection->registerConnectionDataHandler( this ); + } + + ConnectionSOCKS5Proxy::ConnectionSOCKS5Proxy( ConnectionDataHandler* cdh, + ConnectionBase* connection, + const LogSink& logInstance, + const std::string& server, + int port, bool ip ) + : ConnectionBase( cdh ), m_connection( connection ), + m_logInstance( logInstance ), m_s5state( S5StateDisconnected ), m_ip( ip ) + { +// FIXME check return value? + prep::idna( server, m_server ); + m_port = port; + + if( m_connection ) + m_connection->registerConnectionDataHandler( this ); + } + + ConnectionSOCKS5Proxy::~ConnectionSOCKS5Proxy() + { + if( m_connection ) + delete m_connection; + } + + ConnectionBase* ConnectionSOCKS5Proxy::newInstance() const + { + ConnectionBase* conn = m_connection ? m_connection->newInstance() : 0; + return new ConnectionSOCKS5Proxy( m_handler, conn, m_logInstance, m_server, m_port, m_ip ); + } + + void ConnectionSOCKS5Proxy::setConnectionImpl( ConnectionBase* connection ) + { + if( m_connection ) + delete m_connection; + + m_connection = connection; + } + + ConnectionError ConnectionSOCKS5Proxy::connect() + { +// FIXME CHECKME + if( m_connection && m_connection->state() == StateConnected && m_handler ) + { + m_state = StateConnected; + m_s5state = S5StateConnected; + return ConnNoError; + } + + if( m_connection && m_handler ) + { + m_state = StateConnecting; + m_s5state = S5StateConnecting; + return m_connection->connect(); + } + + return ConnNotConnected; + } + + void ConnectionSOCKS5Proxy::disconnect() + { + if( m_connection ) + m_connection->disconnect(); + cleanup(); + } + + ConnectionError ConnectionSOCKS5Proxy::recv( int timeout ) + { + if( m_connection ) + return m_connection->recv( timeout ); + else + return ConnNotConnected; + } + + ConnectionError ConnectionSOCKS5Proxy::receive() + { + if( m_connection ) + return m_connection->receive(); + else + return ConnNotConnected; + } + + bool ConnectionSOCKS5Proxy::send( const std::string& data ) + { +// if( m_s5state != S5StateConnected ) +// { +// printf( "p data sent: " ); +// const char* x = data.c_str(); +// for( unsigned int i = 0; i < data.length(); ++i ) +// printf( "%02X ", (const char)x[i] ); +// printf( "\n" ); +// } + + if( m_connection ) + return m_connection->send( data ); + + return false; + } + + void ConnectionSOCKS5Proxy::cleanup() + { + m_state = StateDisconnected; + m_s5state = S5StateDisconnected; + + if( m_connection ) + m_connection->cleanup(); + } + + void ConnectionSOCKS5Proxy::getStatistics( long int &totalIn, long int &totalOut ) + { + if( m_connection ) + m_connection->getStatistics( totalIn, totalOut ); + else + { + totalIn = 0; + totalOut = 0; + } + } + + void ConnectionSOCKS5Proxy::handleReceivedData( const ConnectionBase* /*connection*/, + const std::string& data ) + { +// if( m_s5state != S5StateConnected ) +// { +// printf( "data recv: " ); +// const char* x = data.c_str(); +// for( unsigned int i = 0; i < data.length(); ++i ) +// printf( "%02X ", (const char)x[i] ); +// printf( "\n" ); +// } + + if( !m_connection || !m_handler ) + return; + + ConnectionError connError = ConnNoError; + + switch( m_s5state ) + { + case S5StateConnecting: + if( data.length() != 2 || data[0] != 0x05 ) + connError = ConnIoError; + + if( data[1] == 0x00 ) // no auth + { + negotiate(); + } + else if( data[1] == 0x02 && !m_proxyUser.empty() && !m_proxyPwd.empty() ) // user/password auth + { + m_logInstance.dbg( LogAreaClassConnectionSOCKS5Proxy, + "authenticating to socks5 proxy as user " + m_proxyUser ); + m_s5state = S5StateAuthenticating; + char* d = new char[3 + m_proxyUser.length() + m_proxyPwd.length()]; + size_t pos = 0; + d[pos++] = 0x01; + d[pos++] = (char)m_proxyUser.length(); + strncpy( d + pos, m_proxyUser.c_str(), m_proxyUser.length() ); + pos += m_proxyUser.length(); + d[pos++] = (char)m_proxyPwd.length(); + strncpy( d + pos, m_proxyPwd.c_str(), m_proxyPwd.length() ); + pos += m_proxyPwd.length(); + + if( !send( std::string( d, pos ) ) ) + { + cleanup(); + m_handler->handleDisconnect( this, ConnIoError ); + } + delete[] d; + } + else + { + if( data[1] == (char)(unsigned char)0xFF && !m_proxyUser.empty() && !m_proxyPwd.empty() ) + connError = ConnProxyNoSupportedAuth; + else + connError = ConnProxyAuthRequired; + } + break; + case S5StateNegotiating: + if( data.length() >= 6 && data[0] == 0x05 ) + { + if( data[1] == 0x00 ) + { + m_state = StateConnected; + m_s5state = S5StateConnected; + m_handler->handleConnect( this ); + } + else // connection refused + connError = ConnConnectionRefused; + } + else + connError = ConnIoError; + break; + case S5StateAuthenticating: + if( data.length() == 2 && data[0] == 0x01 && data[1] == 0x00 ) + negotiate(); + else + connError = ConnProxyAuthFailed; + break; + case S5StateConnected: + m_handler->handleReceivedData( this, data ); + break; + default: + break; + } + + if( connError != ConnNoError ) + { + m_connection->disconnect(); + m_handler->handleDisconnect( this, connError ); + } + + } + + void ConnectionSOCKS5Proxy::negotiate() + { + m_s5state = S5StateNegotiating; + char* d = new char[m_ip ? 10 : 6 + m_server.length() + 1]; + size_t pos = 0; + d[pos++] = 0x05; // SOCKS version 5 + d[pos++] = 0x01; // command CONNECT + d[pos++] = 0x00; // reserved + int port = m_port; + std::string server = m_server; + if( m_ip ) // IP address + { + d[pos++] = 0x01; // IPv4 address + std::string s; + const size_t j = server.length(); + size_t l = 0; + for( size_t k = 0; k < j && l < 4; ++k ) + { + if( server[k] != '.' ) + s += server[k]; + + if( server[k] == '.' || k == j-1 ) + { + d[pos++] = static_cast( atoi( s.c_str() ) & 0xFF ); + s = EmptyString; + ++l; + } + } + } + else // hostname + { + if( port == -1 ) + { + const DNS::HostMap& servers = DNS::resolve( m_server, m_logInstance ); + if( servers.size() ) + { + const std::pair< std::string, int >& host = *servers.begin(); + server = host.first; + port = host.second; + } + } + d[pos++] = 0x03; // hostname + d[pos++] = (char)m_server.length(); + strncpy( d + pos, m_server.c_str(), m_server.length() ); + pos += m_server.length(); + } + int nport = htons( port ); + d[pos++] = static_cast( nport ); + d[pos++] = static_cast( nport >> 8 ); + + std::string message = "Requesting socks5 proxy connection to " + server + ":" + + util::int2string( port ); + m_logInstance.dbg( LogAreaClassConnectionSOCKS5Proxy, message ); + + if( !send( std::string( d, pos ) ) ) + { + cleanup(); + m_handler->handleDisconnect( this, ConnIoError ); + } + delete[] d; + } + + void ConnectionSOCKS5Proxy::handleConnect( const ConnectionBase* /*connection*/ ) + { + if( m_connection ) + { + std::string server = m_server; + int port = m_port; + if( port == -1 ) + { + const DNS::HostMap& servers = DNS::resolve( m_server, m_logInstance ); + if( !servers.empty() ) + { + const std::pair< std::string, int >& host = *servers.begin(); + server = host.first; + port = host.second; + } + } + m_logInstance.dbg( LogAreaClassConnectionSOCKS5Proxy, + "Attempting to negotiate socks5 proxy connection" ); + + const bool auth = !m_proxyUser.empty() && !m_proxyPwd.empty(); + const char d[4] = { + 0x05, // SOCKS version 5 + static_cast( auth ? 0x02 // two methods + : 0x01 ), // one method + 0x00, // method: no auth + 0x02 // method: username/password auth + }; + + if( !send( std::string( d, auth ? 4 : 3 ) ) ) + { + cleanup(); + if( m_handler ) + m_handler->handleDisconnect( this, ConnIoError ); + } + } + } + + void ConnectionSOCKS5Proxy::handleDisconnect( const ConnectionBase* /*connection*/, + ConnectionError reason ) + { + cleanup(); + m_logInstance.dbg( LogAreaClassConnectionSOCKS5Proxy, "socks5 proxy connection closed" ); + + if( m_handler ) + m_handler->handleDisconnect( this, reason ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.h b/smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.h new file mode 100644 index 00000000..68dc9803 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectionsocks5proxy.h @@ -0,0 +1,178 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CONNECTIONSOCKS5PROXY_H__ +#define CONNECTIONSOCKS5PROXY_H__ + +#include "gloox.h" +#include "connectionbase.h" +#include "logsink.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an implementation of a simple SOCKS5 Proxying connection (RFC 1928 + RFC 1929). + * + * To use with a SOCKS5 proxy: + * + * @code + * Client* c = new Client( ... ); + * c->setConnectionImpl( new ConnectionSOCKS5Proxy( c, + * new ConnectionTCPClient( c->logInstance(), proxyHost, proxyPort ), + * c->logInstance(), xmppHost, xmppPort ) ); + * @endcode + * + * Make sure to pass the proxy host/port to the transport connection (ConnectionTCPClient in this case), + * and the XMPP host/port to the proxy connection. + * + * The reason why ConnectionSOCKS5Proxy doesn't manage its own ConnectionTCPClient is that it allows it + * to be used with other transports (like IPv6 or chained HTTP/SOCKS5 proxies). + * + * @note This class is also used by the SOCKS5 bytestreams implementation (with slightly different + * semantics). + * + * @note Simple @b plain-text username/password authentication is supported. GSSAPI authentication + * is not supported. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionSOCKS5Proxy : public ConnectionBase, public ConnectionDataHandler + { + public: + /** + * Constructs a new ConnectionSOCKS5Proxy object. + * @param connection A transport connection. It should be configured to connect to + * the proxy host and port, @b not to the (XMPP) host. ConnectionSOCKS5Proxy will own the + * transport connection and delete it in its destructor. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. This is the XMPP server's address, @b not the proxy. + * @param port The proxy's port to connect to. This is the (XMPP) server's port, @b not the proxy's. + * The default of -1 means that SRV records will be used to find out about the actual host:port. + * @param ip Indicates whether @c server is an IP address (true) or a host name (false). + * @note To properly use this object, you have to set a ConnectionDataHandler using + * registerConnectionDataHandler(). This is not necessary if this object is + * part of a 'connection chain', e.g. with ConnectionHTTPProxy. + */ + ConnectionSOCKS5Proxy( ConnectionBase* connection, const LogSink& logInstance, + const std::string& server, int port = -1, bool ip = false ); + + /** + * Constructs a new ConnectionSOCKS5Proxy object. + * @param cdh A ConnectionDataHandler-derived object that will handle incoming data. + * @param connection A transport connection. It should be configured to connect to + * the proxy host and port, @b not to the (XMPP) host. ConnectionSOCKS5Proxy will own the + * transport connection and delete it in its destructor. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. This is the XMPP server's address, @b not the proxy. + * @param port The proxy's port to connect to. This is the (XMPP) server's port, @b not the proxy's. + * The default of -1 means that SRV records will be used to find out about the actual host:port. + * @param ip Indicates whether @c server is an IP address (true) or a host name (false). + */ + ConnectionSOCKS5Proxy( ConnectionDataHandler* cdh, ConnectionBase* connection, + const LogSink& logInstance, + const std::string& server, int port = -1, bool ip = false ); + + /** + * Virtual destructor + */ + virtual ~ConnectionSOCKS5Proxy(); + + // reimplemented from ConnectionBase + virtual ConnectionError connect(); + + // reimplemented from ConnectionBase + virtual ConnectionError recv( int timeout = -1 ); + + // reimplemented from ConnectionBase + virtual bool send( const std::string& data ); + + // reimplemented from ConnectionBase + virtual ConnectionError receive(); + + // reimplemented from ConnectionBase + virtual void disconnect(); + + // reimplemented from ConnectionBase + virtual void cleanup(); + + // reimplemented from ConnectionBase + virtual void getStatistics( long int &totalIn, long int &totalOut ); + + // reimplemented from ConnectionDataHandler + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleConnect( const ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + + // reimplemented from ConnectionDataHandler + virtual ConnectionBase* newInstance() const; + + /** + * Sets the server to proxy to. + * @param host The server hostname (IP address). + * @param port The server port. The default of -1 means that SRV records will be used + * to find out about the actual host:port. + * @param ip Indicates whether @c host is an IP address (true) or a host name (false). + */ + void setServer( const std::string& host, int port = -1, bool ip = false ) + { m_server = host; m_port = port; m_ip = ip; } + + /** + * Sets proxy authorization credentials. + * @param user The user name to use for proxy authorization. + * @param password The password to use for proxy authorization. + */ + void setProxyAuth( const std::string& user, const std::string& password ) + { m_proxyUser = user; m_proxyPwd = password; } + + /** + * Sets the underlying transport connection. A possibly existing connection will be deleted. + * @param connection The ConnectionBase to replace the current connection, if any. + */ + void setConnectionImpl( ConnectionBase* connection ); + + private: + enum Socks5State + { + S5StateDisconnected, + S5StateConnecting, + S5StateNegotiating, + S5StateAuthenticating, + S5StateConnected + }; + + ConnectionSOCKS5Proxy &operator=( const ConnectionSOCKS5Proxy& ); + void negotiate(); + + ConnectionBase* m_connection; + const LogSink& m_logInstance; + + Socks5State m_s5state; + + std::string m_proxyUser; + std::string m_proxyPwd; + std::string m_proxyHandshakeBuffer; + bool m_ip; + + }; + +} + +#endif // CONNECTIONSOCKS5PROXY_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontcpbase.cpp b/smack/smack/src/main/cpp/gloox/src/connectiontcpbase.cpp new file mode 100644 index 00000000..bceb0258 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontcpbase.cpp @@ -0,0 +1,214 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "gloox.h" + +#include "connectiontcpbase.h" +#include "dns.h" +#include "logsink.h" +#include "prep.h" +#include "mutexguard.h" +#include "util.h" + +#ifdef __MINGW32__ +# include +#endif + +#if ( !defined( _WIN32 ) && !defined( _WIN32_WCE ) ) || defined( __SYMBIAN32__ ) +# include +# include +# include +# include +# include +# include +# include +# include +#elif ( defined( _WIN32 ) || defined( _WIN32_WCE ) ) && !defined( __SYMBIAN32__ ) +# include +typedef int socklen_t; +#endif + +#include + +#include +#include + +namespace gloox +{ + + ConnectionTCPBase::ConnectionTCPBase( const LogSink& logInstance, + const std::string& server, int port ) + : ConnectionBase( 0 ), + m_logInstance( logInstance ), m_buf( 0 ), m_socket( -1 ), m_totalBytesIn( 0 ), + m_totalBytesOut( 0 ), m_bufsize( 8192 ), m_cancel( true ) + { + init( server, port ); + } + + ConnectionTCPBase::ConnectionTCPBase( ConnectionDataHandler* cdh, const LogSink& logInstance, + const std::string& server, int port ) + : ConnectionBase( cdh ), + m_logInstance( logInstance ), m_buf( 0 ), m_socket( -1 ), m_totalBytesIn( 0 ), + m_totalBytesOut( 0 ), m_bufsize( 8192 ), m_cancel( true ) + { + init( server, port ); + } + + void ConnectionTCPBase::init( const std::string& server, int port ) + { +// FIXME check return value? + prep::idna( server, m_server ); + m_port = port; + m_buf = (char*)calloc( m_bufsize + 1, sizeof( char ) ); + } + + ConnectionTCPBase::~ConnectionTCPBase() + { + cleanup(); + free( m_buf ); + m_buf = 0; + } + + void ConnectionTCPBase::disconnect() + { + util::MutexGuard rm( m_recvMutex ); + m_cancel = true; + } + + bool ConnectionTCPBase::dataAvailable( int timeout ) + { + if( m_socket < 0 ) + return true; // let recv() catch the closed fd + + fd_set fds; + struct timeval tv; + + FD_ZERO( &fds ); + // the following causes a C4127 warning in VC++ Express 2008 and possibly other versions. + // however, the reason for the warning can't be fixed in gloox. + FD_SET( m_socket, &fds ); + + tv.tv_sec = timeout / 1000000; + tv.tv_usec = timeout % 1000000; + + return ( ( select( m_socket + 1, &fds, 0, 0, timeout == -1 ? 0 : &tv ) > 0 ) + && FD_ISSET( m_socket, &fds ) != 0 ); + } + + ConnectionError ConnectionTCPBase::receive() + { + if( m_socket < 0 ) + return ConnNotConnected; + + ConnectionError err = ConnNoError; + while( !m_cancel && ( err = recv( 1000000 ) ) == ConnNoError ) + ; + return err == ConnNoError ? ConnNotConnected : err; + } + + bool ConnectionTCPBase::send( const std::string& data ) + { + m_sendMutex.lock(); + + if( data.empty() || ( m_socket < 0 ) ) + { + m_sendMutex.unlock(); + return false; + } + + int sent = 0; + for( size_t num = 0, len = data.length(); sent != -1 && num < len; num += sent ) + { + sent = static_cast( ::send( m_socket, (data.c_str()+num), (int)(len - num), 0 ) ); + } + + m_totalBytesOut += (int)data.length(); + + m_sendMutex.unlock(); + + if( sent == -1 ) + { + // send() failed for an unexpected reason + std::string message = "send() failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ) + ": " + strerror( errno ); +#endif + m_logInstance.err( LogAreaClassConnectionTCPBase, message ); + + if( m_handler ) + m_handler->handleDisconnect( this, ConnIoError ); + } + + return sent != -1; + } + + void ConnectionTCPBase::getStatistics( long int &totalIn, long int &totalOut ) + { + totalIn = m_totalBytesIn; + totalOut = m_totalBytesOut; + } + + void ConnectionTCPBase::cleanup() + { + if( !m_sendMutex.trylock() ) + return; + + if( !m_recvMutex.trylock() ) + { + m_sendMutex.unlock(); + return; + } + + if( m_socket >= 0 ) + { + DNS::closeSocket( m_socket, m_logInstance ); + m_socket = -1; + } + + m_state = StateDisconnected; + m_cancel = true; + m_totalBytesIn = 0; + m_totalBytesOut = 0; + + m_recvMutex.unlock(), + m_sendMutex.unlock(); + } + + int ConnectionTCPBase::localPort() const + { + struct sockaddr local; + socklen_t len = (socklen_t)sizeof( local ); + if( getsockname ( m_socket, &local, &len ) < 0 ) + return -1; + else + return ntohs( ((struct sockaddr_in *)&local)->sin_port ); + } + + const std::string ConnectionTCPBase::localInterface() const + { + struct sockaddr_in local; + socklen_t len = (socklen_t)sizeof( local ); + if( getsockname ( m_socket, (reinterpret_cast( &local )), &len ) < 0 ) + return EmptyString; + else + { +// char addr[INET_ADDRSTRLEN]; +// return inet_ntop( AF_INET, &(local.sin_addr), addr, sizeof( addr ) ); //FIXME is this portable? + return inet_ntoa( local.sin_addr ); + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontcpbase.h b/smack/smack/src/main/cpp/gloox/src/connectiontcpbase.h new file mode 100644 index 00000000..a247afb4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontcpbase.h @@ -0,0 +1,134 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CONNECTIONTCPBASE_H__ +#define CONNECTIONTCPBASE_H__ + +#include "gloox.h" +#include "connectionbase.h" +#include "logsink.h" +#include "mutex.h" + +#include + +namespace gloox +{ + + namespace util + { + class Mutex; + } + + /** + * @brief This is a base class for a simple TCP connection. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionTCPBase : public ConnectionBase + { + public: + /** + * Constructs a new ConnectionTCPBase object. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. + * @param port The port to connect to. The default of -1 means that XMPP SRV records + * will be used to find out about the actual host:port. + * @note To properly use this object, you have to set a ConnectionDataHandler using + * registerConnectionDataHandler(). This is not necessary if this object is + * part of a 'connection chain', e.g. with ConnectionHTTPProxy. + */ + ConnectionTCPBase( const LogSink& logInstance, const std::string& server, int port = -1 ); + + /** + * Constructs a new ConnectionTCPBase object. + * @param cdh An ConnectionDataHandler-derived object that will handle incoming data. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. + * @param port The port to connect to. The default of -1 means that SRV records will be used + * to find out about the actual host:port. + */ + ConnectionTCPBase( ConnectionDataHandler* cdh, const LogSink& logInstance, + const std::string& server, int port = -1 ); + + /** + * Virtual destructor + */ + virtual ~ConnectionTCPBase(); + + // reimplemented from ConnectionBase + virtual bool send( const std::string& data ); + + // reimplemented from ConnectionBase + virtual ConnectionError receive(); + + // reimplemented from ConnectionBase + virtual void disconnect(); + + // reimplemented from ConnectionBase + virtual void cleanup(); + + // reimplemented from ConnectionBase + virtual void getStatistics( long int &totalIn, long int &totalOut ); + + /** + * Gives access to the raw socket of this connection. Use it wisely. You can + * select()/poll() it and use ConnectionTCPBase::recv( -1 ) to fetch the data. + * @return The socket of the active connection, or -1 if no connection is established. + */ + int socket() const { return m_socket; } + + /** + * This function allows to set an existing socket with an established + * connection to use in this connection. You will still need to call connect() in order to + * negotiate the XMPP stream. You should not set a new socket after having called connect(). + * @param socket The existing socket. + */ + void setSocket( int socket ) { m_cancel = false; m_state = StateConnected; m_socket = socket; } + + /** + * Returns the local port. + * @return The local port. + */ + virtual int localPort() const; + + /** + * Returns the locally bound IP address. + * @return The locally bound IP address. + */ + virtual const std::string localInterface() const; + + protected: + ConnectionTCPBase& operator=( const ConnectionTCPBase& ); + void init( const std::string& server, int port ); + bool dataAvailable( int timeout = -1 ); + void cancel(); + + const LogSink& m_logInstance; + util::Mutex m_sendMutex; + util::Mutex m_recvMutex; + + char* m_buf; + int m_socket; + long int m_totalBytesIn; + long int m_totalBytesOut; + const int m_bufsize; + bool m_cancel; + + }; + +} + +#endif // CONNECTIONTCPBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontcpclient.cpp b/smack/smack/src/main/cpp/gloox/src/connectiontcpclient.cpp new file mode 100644 index 00000000..ab52bd30 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontcpclient.cpp @@ -0,0 +1,174 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "gloox.h" + +#include "connectiontcpclient.h" +#include "dns.h" +#include "logsink.h" +#include "mutexguard.h" +#include "util.h" + +#ifdef __MINGW32__ +# include +#endif + +#if ( !defined( _WIN32 ) && !defined( _WIN32_WCE ) ) || defined( __SYMBIAN32__ ) +# include +# include +# include +# include +# include +# include +#elif ( defined( _WIN32 ) || defined( _WIN32_WCE ) ) && !defined( __SYMBIAN32__ ) +# include +#endif + +#include +#include + +namespace gloox +{ + + ConnectionTCPClient::ConnectionTCPClient( const LogSink& logInstance, + const std::string& server, int port ) + : ConnectionTCPBase( logInstance, server, port ) + { + } + + ConnectionTCPClient::ConnectionTCPClient( ConnectionDataHandler* cdh, const LogSink& logInstance, + const std::string& server, int port ) + : ConnectionTCPBase( cdh, logInstance, server, port ) + { + } + + + ConnectionTCPClient::~ConnectionTCPClient() + { + } + + ConnectionBase* ConnectionTCPClient::newInstance() const + { + return new ConnectionTCPClient( m_handler, m_logInstance, m_server, m_port ); + } + + ConnectionError ConnectionTCPClient::connect() + { + m_sendMutex.lock(); +// FIXME CHECKME + if( !m_handler ) + { + m_sendMutex.unlock(); + return ConnNotConnected; + } + + if( m_socket >= 0 && m_state > StateDisconnected ) + { + m_sendMutex.unlock(); + return ConnNoError; + } + + m_state = StateConnecting; + + if( m_socket < 0 ) + { + if( m_port == -1 ) + m_socket = DNS::connect( m_server, m_logInstance ); + else + m_socket = DNS::connect( m_server, m_port, m_logInstance ); + } + + m_sendMutex.unlock(); + + if( m_socket < 0 ) + { + switch( m_socket ) + { + case -ConnConnectionRefused: + m_logInstance.err( LogAreaClassConnectionTCPClient, + m_server + ": connection refused" ); + break; + case -ConnDnsError: + m_logInstance.err( LogAreaClassConnectionTCPClient, + m_server + ": host not found" ); + break; + default: + m_logInstance.err( LogAreaClassConnectionTCPClient, + "Unknown error condition" ); + break; + } + m_handler->handleDisconnect( this, (ConnectionError)-m_socket ); + return (ConnectionError)-m_socket; + } + else + { + m_state = StateConnected; + } + + m_cancel = false; + m_handler->handleConnect( this ); + return ConnNoError; + } + + ConnectionError ConnectionTCPClient::recv( int timeout ) + { + m_recvMutex.lock(); + + if( m_cancel || m_socket < 0 ) + { + m_recvMutex.unlock(); + return ConnNotConnected; + } + + if( !dataAvailable( timeout ) ) + { + m_recvMutex.unlock(); + return ConnNoError; + } + + int size = static_cast( ::recv( m_socket, m_buf, m_bufsize, 0 ) ); + if( size > 0 ) + m_totalBytesIn += size; + + m_recvMutex.unlock(); + + if( size <= 0 ) + { + if( size == -1 ) + { + // recv() failed for an unexpected reason + std::string message = "recv() failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ) + ": " + strerror( errno ); +#endif + m_logInstance.err( LogAreaClassConnectionTCPClient, message ); + } + + ConnectionError error = ( size ? ConnIoError : ConnStreamClosed ); + if( m_handler ) + m_handler->handleDisconnect( this, error ); + return error; + } + + m_buf[size] = '\0'; + + if( m_handler ) + m_handler->handleReceivedData( this, std::string( m_buf, size ) ); + + return ConnNoError; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontcpclient.h b/smack/smack/src/main/cpp/gloox/src/connectiontcpclient.h new file mode 100644 index 00000000..4213b7df --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontcpclient.h @@ -0,0 +1,83 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CONNECTIONTCPCLIENT_H__ +#define CONNECTIONTCPCLIENT_H__ + +#include "gloox.h" +#include "connectiontcpbase.h" +#include "logsink.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an implementation of a simple TCP connection. + * + * You should only need to use this class directly if you need access to some special feature, like + * the raw socket(), or if you need HTTP proxy support (see @ref gloox::ConnectionHTTPProxy for more + * information). + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionTCPClient : public ConnectionTCPBase + { + public: + /** + * Constructs a new ConnectionTCPClient object. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. + * @param port The port to connect to. The default of -1 means that XMPP SRV records + * will be used to find out about the actual host:port. + * @note To properly use this object, you have to set a ConnectionDataHandler using + * registerConnectionDataHandler(). This is not necessary if this object is + * part of a 'connection chain', e.g. with ConnectionHTTPProxy. + */ + ConnectionTCPClient( const LogSink& logInstance, const std::string& server, int port = -1 ); + + /** + * Constructs a new ConnectionTCPClient object. + * @param cdh An ConnectionDataHandler-derived object that will handle incoming data. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param server A server to connect to. + * @param port The port to connect to. The default of -1 means that SRV records will be used + * to find out about the actual host:port. + */ + ConnectionTCPClient( ConnectionDataHandler* cdh, const LogSink& logInstance, + const std::string& server, int port = -1 ); + + /** + * Virtual destructor + */ + virtual ~ConnectionTCPClient(); + + // reimplemented from ConnectionBase + virtual ConnectionError recv( int timeout = -1 ); + + // reimplemented from ConnectionBase + virtual ConnectionError connect(); + + // reimplemented from ConnectionBase + virtual ConnectionBase* newInstance() const; + + private: + ConnectionTCPClient &operator=( const ConnectionTCPClient & ); + + }; + +} + +#endif // CONNECTIONTCPCLIENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontcpserver.cpp b/smack/smack/src/main/cpp/gloox/src/connectiontcpserver.cpp new file mode 100644 index 00000000..a342cbcc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontcpserver.cpp @@ -0,0 +1,180 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "gloox.h" + +#include "config.h" + +#include "connectiontcpserver.h" +#include "connectiontcpclient.h" +#include "connectionhandler.h" +#include "dns.h" +#include "logsink.h" +#include "mutex.h" +#include "mutexguard.h" +#include "util.h" + +#ifdef __MINGW32__ +# include +#endif + +#if ( !defined( _WIN32 ) && !defined( _WIN32_WCE ) ) || defined( __SYMBIAN32__ ) +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# include +#elif defined( _WIN32_WCE ) +# include +#endif + +#include +#include + +#ifndef _WIN32_WCE +# include +#endif + +namespace gloox +{ + + ConnectionTCPServer::ConnectionTCPServer( ConnectionHandler* ch, const LogSink& logInstance, + const std::string& ip, int port ) + : ConnectionTCPBase( 0, logInstance, ip, port ), + m_connectionHandler( ch ) + { + } + + ConnectionTCPServer::~ConnectionTCPServer() + { + } + + ConnectionBase* ConnectionTCPServer::newInstance() const + { + return new ConnectionTCPServer( m_connectionHandler, m_logInstance, m_server, m_port ); + } + + ConnectionError ConnectionTCPServer::connect() + { + util::MutexGuard mg( &m_sendMutex ); + + if( m_socket >= 0 || m_state > StateDisconnected ) + return ConnNoError; + + m_state = StateConnecting; + + if( m_socket < 0 ) + m_socket = DNS::getSocket( m_logInstance ); + + if( m_socket < 0 ) + return ConnIoError; + +#ifdef HAVE_SETSOCKOPT + int buf = 0; +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + int bufbytes = sizeof( int ); +#else + socklen_t bufbytes = sizeof( int ); +#endif + if( ( getsockopt( m_socket, SOL_SOCKET, SO_RCVBUF, (char*)&buf, &bufbytes ) != -1 ) && + ( m_bufsize > buf ) ) + setsockopt( m_socket, SOL_SOCKET, SO_RCVBUF, (char*)&m_bufsize, sizeof( m_bufsize ) ); + + if( ( getsockopt( m_socket, SOL_SOCKET, SO_SNDBUF, (char*)&buf, &bufbytes ) != -1 ) && + ( m_bufsize > buf ) ) + setsockopt( m_socket, SOL_SOCKET, SO_SNDBUF, (char*)&m_bufsize, sizeof( m_bufsize ) ); +#endif + + struct sockaddr_in local; + local.sin_family = AF_INET; + local.sin_port = static_cast( htons( m_port ) ); + local.sin_addr.s_addr = m_server.empty() ? INADDR_ANY : inet_addr( m_server.c_str() ); + memset( local.sin_zero, '\0', 8 ); + + if( bind( m_socket, (struct sockaddr*)&local, sizeof( struct sockaddr ) ) < 0 ) + { + std::string message = "bind() to " + ( m_server.empty() ? std::string( "*" ) : m_server ) + + " (" + inet_ntoa( local.sin_addr ) + ":" + util::int2string( m_port ) + ") failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ); +#endif + m_logInstance.dbg( LogAreaClassConnectionTCPServer, message ); + + return ConnIoError; + } + + if( listen( m_socket, 10 ) < 0 ) + { + std::string message = "listen on " + ( m_server.empty() ? std::string( "*" ) : m_server ) + + " (" + inet_ntoa( local.sin_addr ) + ":" + util::int2string( m_port ) + ") failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ); +#endif + m_logInstance.dbg( LogAreaClassConnectionTCPServer, message ); + + return ConnIoError; + } + + m_cancel = false; + return ConnNoError; + } + + ConnectionError ConnectionTCPServer::recv( int timeout ) + { + m_recvMutex.lock(); + + if( m_cancel || m_socket < 0 || !m_connectionHandler ) + { + m_recvMutex.unlock(); + return ConnNotConnected; + } + + if( !dataAvailable( timeout ) ) + { + m_recvMutex.unlock(); + return ConnNoError; + } + + struct sockaddr_in they; + int sin_size = sizeof( struct sockaddr_in ); +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + int newfd = static_cast( accept( static_cast( m_socket ), (struct sockaddr*)&they, &sin_size ) ); +#else + int newfd = accept( m_socket, (struct sockaddr*)&they, (socklen_t*)&sin_size ); +#endif + + m_recvMutex.unlock(); + + ConnectionTCPClient* conn = new ConnectionTCPClient( m_logInstance, inet_ntoa( they.sin_addr ), + ntohs( they.sin_port ) ); + conn->setSocket( newfd ); + m_connectionHandler->handleIncomingConnection( this, conn ); + + return ConnNoError; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontcpserver.h b/smack/smack/src/main/cpp/gloox/src/connectiontcpserver.h new file mode 100644 index 00000000..3d0e899e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontcpserver.h @@ -0,0 +1,77 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef CONNECTIONTCPSERVER_H__ +#define CONNECTIONTCPSERVER_H__ + +#include "gloox.h" +#include "connectiontcpbase.h" +#include "logsink.h" + +#include + +namespace gloox +{ + + class ConnectionHandler; + + /** + * @brief This is an implementation of a simple listening TCP connection. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API ConnectionTCPServer : public ConnectionTCPBase + { + public: + /** + * Constructs a new ConnectionTCPServer object. + * @param ch A ConnectionHandler-derived object that will handle incoming connections. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + * @param ip The local IP address to listen on. This must @b not be a hostname. + * Leave this empty to listen on all local interfaces. + * @param port The port to listen on. + */ + ConnectionTCPServer( ConnectionHandler* ch, const LogSink& logInstance, + const std::string& ip, int port ); + + /** + * Virtual destructor + */ + virtual ~ConnectionTCPServer(); + + // reimplemented from ConnectionBase + virtual ConnectionError recv( int timeout = -1 ); + + /** + * This function actually starts @c listening on the port given in the + * constructor. + */ + // reimplemented from ConnectionBase + virtual ConnectionError connect(); + + // reimplemented from ConnectionBase + virtual ConnectionBase* newInstance() const; + + private: + ConnectionTCPServer &operator=( const ConnectionTCPServer & ); + + ConnectionHandler* m_connectionHandler; + + }; + +} + +#endif // CONNECTIONTCPSERVER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontls.cpp b/smack/smack/src/main/cpp/gloox/src/connectiontls.cpp new file mode 100644 index 00000000..8f3cfd0d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontls.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + + +#include "connectiontls.h" +#include "tlsdefault.h" + +#include + +namespace gloox +{ + + ConnectionTLS::ConnectionTLS( ConnectionDataHandler* cdh, ConnectionBase* conn, const LogSink& log ) + : ConnectionBase( cdh ), + m_connection( conn ), m_tls( 0 ), m_tlsHandler( 0 ), + m_log( log ) + { + if( m_connection ) + m_connection->registerConnectionDataHandler( this ); + } + + ConnectionTLS::ConnectionTLS( ConnectionBase* conn, const LogSink& log ) + : ConnectionBase( 0 ), + m_connection( conn ), m_tls( 0 ), m_tlsHandler( 0 ), m_log( log ) + { + if( m_connection ) + m_connection->registerConnectionDataHandler( this ); + } + + ConnectionTLS::~ConnectionTLS() + { + delete m_connection; + delete m_tls; + } + + void ConnectionTLS::setConnectionImpl( ConnectionBase* connection ) + { + if( m_connection ) + m_connection->registerConnectionDataHandler( 0 ); + + m_connection = connection; + + if( m_connection ) + m_connection->registerConnectionDataHandler( this ); + } + + ConnectionError ConnectionTLS::connect() + { + if( !m_connection ) + return ConnNotConnected; + + if( m_state == StateConnected ) + return ConnNoError; + + if( !m_tls ) + m_tls = getTLSBase( this, m_connection->server() ); + + if( !m_tls ) + return ConnTlsNotAvailable; + + if( !m_tls->init( m_clientKey, m_clientCerts, m_cacerts ) ) + return ConnTlsFailed; + +// m_tls->setCACerts( m_cacerts ); +// m_tls->setClientCert( m_clientKey, m_clientCerts ); + + m_state = StateConnecting; + + if( m_connection->state() != StateConnected ) + return m_connection->connect(); + + if( m_tls->handshake() ) + return ConnNoError; + else + return ConnTlsFailed; + } + + ConnectionError ConnectionTLS::recv( int timeout ) + { + return m_connection ? m_connection->recv( timeout ) : ConnNotConnected; + } + + bool ConnectionTLS::send( const std::string& data ) + { + if( m_state != StateConnected ) + return false; + + m_tls->encrypt( data ); + return true; + } + + ConnectionError ConnectionTLS::receive() + { + if( m_connection ) + return m_connection->receive(); + else + return ConnNotConnected; + } + + void ConnectionTLS::disconnect() + { + if( m_connection ) + m_connection->disconnect(); + + cleanup(); + } + + void ConnectionTLS::cleanup() + { + if( m_connection ) + m_connection->cleanup(); + if( m_tls ) + m_tls->cleanup(); + + m_state = StateDisconnected; + } + + void ConnectionTLS::getStatistics( long int& totalIn, long int& totalOut ) + { + if( m_connection ) + m_connection->getStatistics( totalIn, totalOut ); + } + + ConnectionBase* ConnectionTLS::newInstance() const + { + ConnectionBase* newConn = 0; + if( m_connection ) + newConn = m_connection->newInstance(); + return new ConnectionTLS( m_handler, newConn, m_log ); + } + + void ConnectionTLS::handleReceivedData( const ConnectionBase* /*connection*/, const std::string& data ) + { + if( m_tls ) + m_tls->decrypt( data ); + } + + void ConnectionTLS::handleConnect( const ConnectionBase* /*connection*/ ) + { + if( m_tls ) + m_tls->handshake(); + } + + void ConnectionTLS::handleDisconnect( const ConnectionBase* /*connection*/, ConnectionError reason ) + { + if( m_handler ) + m_handler->handleDisconnect( this, reason ); + + cleanup(); + } + + void ConnectionTLS::handleEncryptedData( const TLSBase* /*tls*/, const std::string& data ) + { + if( m_connection ) + m_connection->send( data ); + } + + void ConnectionTLS::handleDecryptedData( const TLSBase* /*tls*/, const std::string& data ) + { + if( m_handler ) + m_handler->handleReceivedData( this, data ); + else + { + m_log.log( LogLevelDebug, LogAreaClassConnectionTLS, "Data received and decrypted but no handler" ); + } + } + + void ConnectionTLS::handleHandshakeResult( const TLSBase* tls, bool success, CertInfo& certinfo ) + { + if( success ) + { + m_state = StateConnected; + m_log.log( LogLevelDebug, LogAreaClassConnectionTLS, "TLS handshake succeeded" ); + if( m_tlsHandler ) + m_tlsHandler->handleHandshakeResult( tls, success, certinfo ); + if( m_handler ) + m_handler->handleConnect( this ); + } + else + { + m_state = StateDisconnected; + m_log.log( LogLevelWarning, LogAreaClassConnectionTLS, "TLS handshake failed" ); + if( m_tlsHandler ) + m_tlsHandler->handleHandshakeResult( tls, success, certinfo ); + cleanup(); + if( m_handler ) + m_handler->handleDisconnect( this, ConnTlsFailed ); + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontls.h b/smack/smack/src/main/cpp/gloox/src/connectiontls.h new file mode 100644 index 00000000..d508ee1b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontls.h @@ -0,0 +1,199 @@ +/* + * Copyright (c) 2007-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#ifndef CONNECTIONTLS_H__ +#define CONNECTIONTLS_H__ + +#include "gloox.h" +#include "logsink.h" +#include "connectionbase.h" +#include "tlsdefault.h" +#include "connectiondatahandler.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an implementation of a TLS/SSL connection. + * + * You should not need to use this function directly. However, + * you can use it to connect to the legacy Jabber SSL port, + * 5223. + * + * Usage: + * @code + * Client *c = new Client( ... ); + * c->setConnectionImpl( new ConnectionTLS( c, + * new ConnectionTCPClient( c->logInstance(), server, 5223 ), + * c->logInstance()) ); + * @endcode + * + * Due to the need for handshaking data to be sent/received before the connection is fully + * established, be sure not to use the connection until ConnectionDataHandler::handleConnect() + * of the specified ConnectionDataHandler is called. + * + * @author Jakob Schröter + * @author Matthew Wild + * @since 1.0 + */ + + class GLOOX_API ConnectionTLS : public TLSHandler, public ConnectionBase, public ConnectionDataHandler + { + public: + /** + * Constructs a new ConnectionTLS object. + * @param cdh The ConnectionDataHandler that will be notified of events from this connection + * @param conn A transport connection. It should be configured to connect to + * the server and port you wish to make the encrypted connection to. + * ConnectionTLS will own the transport connection and delete it in its destructor. + * @param log The log target. Obtain it from ClientBase::logInstance(). + */ + ConnectionTLS( ConnectionDataHandler* cdh, ConnectionBase* conn, const LogSink& log ); + + /** + * Constructs a new ConnectionTLS object. + * @param conn A transport connection. It should be configured to connect to + * the server and port you wish to make the encrypted connection to. + * ConnectionTLS will own the transport connection and delete it in its destructor. + * @param log The log target. Obtain it from ClientBase::logInstance(). + */ + ConnectionTLS( ConnectionBase* conn, const LogSink& log ); + + /** + * Virtual Destructor. + */ + virtual ~ConnectionTLS(); + + /** + * Use this function to set a number of trusted root CA certificates which shall be + * used to verify a servers certificate. + * @param cacerts A list of absolute paths to CA root certificate files in PEM format. + * @note This function is a wrapper for TLSBase::setCACerts(). + */ + void setCACerts( const StringList& cacerts ) + { + m_cacerts = cacerts; + } + + /** + * This function is used to retrieve certificate and connection info of a encrypted connection. + * @return Certificate information. + * @note This funcztion is a wrapper around TLSBase::fetchTLSInfo(). + */ + const CertInfo& fetchTLSInfo() const { return m_certInfo; } + + /** + * Use this function to set the user's certificate and private key. The certificate will + * be presented to the server upon request and can be used for SASL EXTERNAL authentication. + * The user's certificate file should be a bundle of more than one certificate in PEM format. + * The first one in the file should be the user's certificate, each cert following that one + * should have signed the previous one. + * @note These certificates are not necessarily the same as those used to verify the server's + * certificate. + * @param clientKey The absolute path to the user's private key in PEM format. + * @param clientCerts A path to a certificate bundle in PEM format. + * @note This function is a wrapper around TLSBase::setClientCert(). + */ + void setClientCert( const std::string& clientKey, const std::string& clientCerts ) + { + m_clientKey = clientKey; + m_clientCerts = clientCerts; + } + + /** + * Sets the transport connection. + * @param connection The transport connection to use. + */ + void setConnectionImpl( ConnectionBase* connection ); + + /** + * Registers an TLSHandler derived object. Only the handleHandshakeResult() + * function will be used after a handshake took place. + * You can review certificate info there. + * @param th The TLSHandler to register. + * @note If no handler is set, ConnectionTLS will accept + * any certificate and continue with the connection. + */ + void registerTLSHandler( TLSHandler* th ) { m_tlsHandler = th; } + + // reimplemented from ConnectionBase + virtual ConnectionError connect(); + + // reimplemented from ConnectionBase + virtual ConnectionError recv( int timeout = -1 ); + + // reimplemented from ConnectionBase + virtual bool send( const std::string& data ); + + // reimplemented from ConnectionBase + virtual ConnectionError receive(); + + // reimplemented from ConnectionBase + virtual void disconnect(); + + // reimplemented from ConnectionBase + virtual void cleanup(); + + // reimplemented from ConnectionBase + virtual void getStatistics( long int& totalIn, long int& totalOut ); + + // reimplemented from ConnectionDataHandler + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleConnect( const ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + + // reimplemented from ConnectionDataHandler + virtual ConnectionBase* newInstance() const; + + // reimplemented from TLSHandler + virtual void handleEncryptedData( const TLSBase*, const std::string& data ); + + // reimplemented from TLSHandler + virtual void handleDecryptedData( const TLSBase*, const std::string& data ); + + // reimplemented from TLSHandler + virtual void handleHandshakeResult( const TLSBase* base, bool success, CertInfo& certinfo ); + + protected: + /** + * Returns a TLS object (client). Reimplement to change the + * type of the object. + * @return A TLS object. + */ + virtual TLSBase* getTLSBase( TLSHandler* th, const std::string server ) + { + return new TLSDefault( th, server, TLSDefault::VerifyingClient ); + } + + ConnectionBase* m_connection; + TLSBase* m_tls; + TLSHandler* m_tlsHandler; + CertInfo m_certInfo; + const LogSink& m_log; + StringList m_cacerts; + std::string m_clientCerts; + std::string m_clientKey; + + private: + ConnectionTLS& operator=( const ConnectionTLS& ); + + }; + +} + +#endif // CONNECTIONTLS_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontlsserver.cpp b/smack/smack/src/main/cpp/gloox/src/connectiontlsserver.cpp new file mode 100644 index 00000000..0b9c6630 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontlsserver.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2009-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "connectiontlsserver.h" + +namespace gloox +{ + + ConnectionTLSServer::ConnectionTLSServer( ConnectionDataHandler* cdh, ConnectionBase* conn, + const LogSink& log ) + : ConnectionTLS( cdh, conn, log ) + { + } + + ConnectionTLSServer::ConnectionTLSServer( ConnectionBase* conn, const LogSink& log ) + : ConnectionTLS( conn, log ) + { + } + + ConnectionTLSServer::~ConnectionTLSServer() + { + } + + TLSBase* ConnectionTLSServer::getTLSBase( TLSHandler* th, const std::string server ) + { + return new TLSDefault( th, server, TLSDefault::VerifyingServer ); + } + + ConnectionBase* ConnectionTLSServer::newInstance() const + { + ConnectionBase* newConn = 0; + if( m_connection ) + newConn = m_connection->newInstance(); + return new ConnectionTLSServer( m_handler, newConn, m_log ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/connectiontlsserver.h b/smack/smack/src/main/cpp/gloox/src/connectiontlsserver.h new file mode 100644 index 00000000..68d822c3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/connectiontlsserver.h @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2009-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#ifndef CONNECTIONTLSSERVER_H__ +#define CONNECTIONTLSSERVER_H__ + +#include "macros.h" +#include "logsink.h" +#include "connectionbase.h" +#include "connectiontls.h" +#include "tlsdefault.h" +#include "tlshandler.h" + +#include + +namespace gloox +{ + + class ConnectionDataHandler; + + /** + * @brief This is an implementation of the server-side of a TLS/SSL connection. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API ConnectionTLSServer : public ConnectionTLS + { + public: + /** + * Constructs a new ConnectionTLSServer object. + * @param cdh The ConnectionDataHandler that will be notified of events from this connection + * @param conn A transport connection. It should be an established connection from + * a client that is about to perform a TLS handshake. + * ConnectionTLSServer will own the transport connection and delete it in its destructor. + * @param log The log target. Obtain it from ClientBase::logInstance(). + */ + ConnectionTLSServer( ConnectionDataHandler* cdh, ConnectionBase* conn, const LogSink& log ); + + /** + * Constructs a new ConnectionTLSServer object. + * @param conn A transport connection. It should be an established connection from + * a client that is about to perform a TLS handshake. + * ConnectionTLSServer will own the transport connection and delete it in its destructor. + * @param log The log target. Obtain it from ClientBase::logInstance(). + */ + ConnectionTLSServer( ConnectionBase* conn, const LogSink& log ); + + /** + * Virtual Destructor. + */ + virtual ~ConnectionTLSServer(); + + /** + * Returns a TLS server. + * @return A TLS server. + */ + virtual TLSBase* getTLSBase( TLSHandler* th, const std::string server ); + + // reimplemented from ConnectionTLS + virtual ConnectionBase* newInstance() const; + + private: + ConnectionTLSServer& operator=( const ConnectionTLSServer& ); + + }; + +} + +#endif // CONNECTIONTLSSERVER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/dataform.cpp b/smack/smack/src/main/cpp/gloox/src/dataform.cpp new file mode 100644 index 00000000..e4fc2ad7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataform.cpp @@ -0,0 +1,137 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "dataform.h" +#include "dataformfield.h" +#include "dataformitem.h" +#include "dataformreported.h" +#include "util.h" +#include "tag.h" + +namespace gloox +{ + + DataForm::DataForm( FormType type, const StringList& instructions, const std::string& title ) + : AdhocPlugin( ExtDataForm ), + m_type( type ), m_instructions( instructions ), m_title( title ), m_reported( 0 ) + { + } + + DataForm::DataForm( FormType type, const std::string& title ) + : AdhocPlugin( ExtDataForm ), + m_type( type ), m_title( title ), m_reported( 0 ) + { + } + + DataForm::DataForm( const Tag* tag ) + : AdhocPlugin( ExtDataForm ), + m_type( TypeInvalid ), m_reported( 0 ) + { + parse( tag ); + } + + DataForm::DataForm( const DataForm& form ) + : AdhocPlugin( ExtDataForm ), DataFormFieldContainer( form ), + m_type( form.m_type ), m_instructions( form.m_instructions ), + m_title( form.m_title ), m_reported( form.m_reported ? new DataFormReported( form.m_reported->tag() ) : 0 ) + { + } + + DataForm::~DataForm() + { + util::clearList( m_items ); + delete m_reported; + m_reported = NULL; + } + + static const char* dfTypeValues[] = + { + "form", "submit", "cancel", "result" + }; + + bool DataForm::parse( const Tag* tag ) + { + if( !tag || tag->xmlns() != XMLNS_X_DATA || tag->name() != "x" ) + return false; + + const std::string& type = tag->findAttribute( TYPE ); + if( type.empty() ) + m_type = TypeForm; + else + { + m_type = (FormType)util::lookup( type, dfTypeValues ); + if( m_type == TypeInvalid ) + return false; + } + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "title" ) + m_title = (*it)->cdata(); + else if( (*it)->name() == "instructions" ) + m_instructions.push_back( (*it)->cdata() ); + else if( (*it)->name() == "field" ) + m_fields.push_back( new DataFormField( (*it) ) ); + else if( (*it)->name() == "reported" ) + { + if( m_reported == NULL ) + m_reported = new DataFormReported( (*it) ); + // else - Invalid data form - only one "reported" is allowed + } + else if( (*it)->name() == "item" ) + m_items.push_back( new DataFormItem( (*it) ) ); + } + + return true; + } + + const std::string& DataForm::filterString() const + { + static const std::string filter = "/message/x[@xmlns='" + XMLNS_X_DATA + "']"; + return filter; + } + + Tag* DataForm::tag() const + { + if( m_type == TypeInvalid ) + return 0; + + Tag* x = new Tag( "x" ); + x->setXmlns( XMLNS_X_DATA ); + x->addAttribute( TYPE, util::lookup( m_type, dfTypeValues ) ); + if( !m_title.empty() ) + new Tag( x, "title", m_title ); + + StringList::const_iterator it_i = m_instructions.begin(); + for( ; it_i != m_instructions.end(); ++it_i ) + new Tag( x, "instructions", (*it_i) ); + + FieldList::const_iterator it = m_fields.begin(); + for( ; it != m_fields.end(); ++it ) + x->addChild( (*it)->tag() ); + + if( m_reported != NULL ) + { + x->addChild( m_reported->tag() ); + } + + ItemList::const_iterator iti = m_items.begin(); + for( ; iti != m_items.end(); ++iti ) + x->addChild( (*iti)->tag() ); + + return x; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/dataform.h b/smack/smack/src/main/cpp/gloox/src/dataform.h new file mode 100644 index 00000000..23ca0864 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataform.h @@ -0,0 +1,197 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DATAFORM_H__ +#define DATAFORM_H__ + +#include "dataformfieldcontainer.h" +#include "adhocplugin.h" + +#include +#include + +namespace gloox +{ + + class Tag; + class DataFormItem; + class DataFormReported; + + /** + * Describes the possible Form Types. + */ + enum FormType + { + TypeForm, /**< The forms-processing entity is asking the forms-submitting + * entity to complete a form. */ + TypeSubmit, /**< The forms-submitting entity is submitting data to the + * forms-processing entity. */ + TypeCancel, /**< The forms-submitting entity has cancelled submission of data + * to the forms-processing entity. */ + TypeResult, /**< The forms-processing entity is returning data (e.g., search + * results) to the forms-submitting entity, or the data is a + * generic data set. */ + TypeInvalid /**< The form is invalid. Only possible if the form was created + * from an Tag which doesn't correctly describe a Data Form. */ + }; + + /** + * @brief An abstraction of a @xep{0004} Data Form. + * + * + * + * @author Jakob Schröter + * @since 0.7 + */ + class GLOOX_API DataForm : public AdhocPlugin, public DataFormFieldContainer + { + public: + /** + * A list of DataFormItems. + */ + typedef std::list ItemList; + + /** + * Constructs a new, empty form. + * @param type The form type. + * @param instructions Natural-language instructions for filling out the form. Should not contain + * newlines (\\n, \\r). + * @param title The natural-language title of the form. Should not contain newlines (\\n, \\r). + */ + DataForm( FormType type, const StringList& instructions, const std::string& title = EmptyString ); + + /** + * Constructs a new, empty form without any instructions or title set. Probably best suited for + * result forms. + * @param type The form type. + * @param title The natural-language title of the form. Should not contain newlines (\\n, \\r). + * @since 0.9 + */ + DataForm( FormType type, const std::string& title = EmptyString ); + + /** + * Constructs a new DataForm from an existing Tag/XML representation. + * @param tag The existing form to parse. + */ + DataForm( const Tag* tag ); + + /** + * Creates a new DataForm, copying the given one. + * @param form The form to copy. + */ + DataForm( const DataForm& form ); + + /** + * Virtual destructor. + */ + virtual ~DataForm(); + + /** + * Use this function to retrieve the title of the form. + * @return The title of the form. + */ + const std::string& title() const { return m_title; } + + /** + * Use this function to set the title of the form. + * @param title The new title of the form. + * @note The title should not contain newlines (\\n, \\r). + */ + void setTitle( const std::string& title ) { m_title = title; } + + /** + * Retrieves the natural-language instructions for the form. + * @return The fill-in instructions for the form. + */ + const StringList& instructions() const { return m_instructions; } + + /** + * Use this function to set natural-language instructions for the form. + * @param instructions The instructions for the form. + * @note The instructions should not contain newlines (\\n, \\r). Instead, every line should be an + * element of the StringMap. This allows for platform dependent newline handling on the target + * platform. + */ + void setInstructions( const StringList& instructions ) { m_instructions = instructions; } + + /** + * Returns the reported field list in a DataForm. + * @return The reported section, containing 0..n fields. + */ + const DataFormReported* reported() const { return m_reported; } + + /** + * Returns a list of items in a DataForm. + * @return A list of items. + */ + const ItemList& items() const { return m_items; } + + /** + * Returns the form's type. + * @return The form's type. + * @since 0.9 + */ + FormType type() const { return m_type; } + + /** + * Sets the form's type. + * @param type The form's new type. + */ + void setType( FormType type ) { m_type = type; } + + /** + * Parses the given Tag and creates an appropriate DataForm representation. + * @param tag The Tag to parse. + * @return @b True on success, @b false otherwise. + * @since 0.9 + */ + bool parse( const Tag* tag ); + + /** + * Converts to @b true if the DataForm is valid, @b false otherwise. + */ + operator bool() const { return m_type != TypeInvalid; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new DataForm( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new DataForm( *this ); + } + + protected: + FormType m_type; + + private: + StringList m_instructions; + + std::string m_title; + DataFormReported* m_reported; + ItemList m_items; + + }; + +} + +#endif // DATAFORM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/dataformfield.cpp b/smack/smack/src/main/cpp/gloox/src/dataformfield.cpp new file mode 100644 index 00000000..6b46a0ed --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformfield.cpp @@ -0,0 +1,134 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "dataformfield.h" +#include "util.h" +#include "tag.h" + +namespace gloox +{ + + static const char* fieldTypeValues[] = + { + "boolean", "fixed", "hidden", "jid-multi", "jid-single", + "list-multi", "list-single", "text-multi", "text-private", "text-single", "" + }; + + DataFormField::DataFormField( FieldType type ) + : m_type( type ), m_required( false ) + { + } + + DataFormField::DataFormField( const std::string& name, const std::string& value, + const std::string& label, FieldType type ) + : m_type( type ), m_name( name ), m_label( label ), m_required( false ) + { + m_values.push_back( value ); + } + + DataFormField::DataFormField( const Tag* tag ) + : m_type( TypeInvalid ), m_required( false ) + { + if( !tag ) + return; + + const std::string& type = tag->findAttribute( TYPE ); + if( type.empty() ) + { + if( !tag->name().empty() ) + m_type = TypeNone; + } + else + m_type = (FieldType)util::lookup( type, fieldTypeValues ); + + if( tag->hasAttribute( "var" ) ) + m_name = tag->findAttribute( "var" ); + + if( tag->hasAttribute( "label" ) ) + m_label = tag->findAttribute( "label" ); + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "desc" ) + m_desc = (*it)->cdata(); + else if( (*it)->name() == "required" ) + m_required = true; + else if( (*it)->name() == "value" ) + { + if( m_type == TypeTextMulti || m_type == TypeListMulti || m_type == TypeJidMulti ) + addValue( (*it)->cdata() ); + else + setValue( (*it)->cdata() ); + } + else if( (*it)->name() == "option" ) + { + Tag* v = (*it)->findChild( "value" ); + if( v ) + m_options.insert( std::make_pair( (*it)->findAttribute( "label" ), v->cdata() ) ); + } + } + + } + + DataFormField::~DataFormField() + { + } + + Tag* DataFormField::tag() const + { + if( m_type == TypeInvalid ) + return 0; + + Tag* field = new Tag( "field" ); + field->addAttribute( TYPE, util::lookup( m_type, fieldTypeValues ) ); + field->addAttribute( "var", m_name ); + field->addAttribute( "label", m_label ); + if( m_required ) + new Tag( field, "required" ); + + if( !m_desc.empty() ) + new Tag( field, "desc", m_desc ); + + if( m_type == TypeListSingle || m_type == TypeListMulti ) + { + StringMultiMap::const_iterator it = m_options.begin(); + for( ; it != m_options.end(); ++it ) + { + Tag* option = new Tag( field, "option", "label", (*it).first ); + new Tag( option, "value", (*it).second ); + } + } + else if( m_type == TypeBoolean ) + { + if( m_values.size() == 0 || m_values.front() == "false" || m_values.front() == "0" ) + new Tag( field, "value", "0" ); + else + new Tag( field, "value", "1" ); + } + + if( m_type == TypeTextMulti || m_type == TypeListMulti || m_type == TypeJidMulti ) + { + StringList::const_iterator it = m_values.begin(); + for( ; it != m_values.end() ; ++it ) + new Tag( field, "value", (*it) ); + } + + if( m_values.size() && !( m_type == TypeTextMulti || m_type == TypeListMulti + || m_type == TypeBoolean || m_type == TypeJidMulti ) ) + new Tag( field, "value", m_values.front() ); + + return field; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/dataformfield.h b/smack/smack/src/main/cpp/gloox/src/dataformfield.h new file mode 100644 index 00000000..a75e9d06 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformfield.h @@ -0,0 +1,242 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DATAFORMFIELD_H__ +#define DATAFORMFIELD_H__ + +#include "gloox.h" + +#include +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief An abstraction of a single field in a @xep{0004} Data Form. + * + * @author Jakob Schröter + * @since 0.7 + */ + class GLOOX_API DataFormField + { + + public: + /** + * Describes the possible types of a Data Form Field. + */ + enum FieldType + { + TypeBoolean, /**< The field enables an entity to gather or provide an either-or + * choice between two options. The default value is "false". */ + TypeFixed, /**< The field is intended for data description (e.g., + * human-readable text such as "section" headers) rather than data + * gathering or provision. The <value/> child SHOULD NOT contain + * newlines (the \\n and \\r characters); instead an application SHOULD + * generate multiple fixed fields, each with one <value/> child. */ + TypeHidden, /**< The field is not shown to the entity providing information, but + * instead is returned with the form. */ + TypeJidMulti, /**< The field enables an entity to gather or provide multiple Jabber + * IDs.*/ + TypeJidSingle, /**< The field enables an entity to gather or provide a single Jabber + * ID.*/ + TypeListMulti, /**< The field enables an entity to gather or provide one or more options + * from among many. */ + TypeListSingle, /**< The field enables an entity to gather or provide one option from + * among many. */ + TypeTextMulti, /**< The field enables an entity to gather or provide multiple lines of + * text. */ + TypeTextPrivate, /**< The field enables an entity to gather or provide a single line or + * word of text, which shall be obscured in an interface + * (e.g., *****). */ + TypeTextSingle, /**< The field enables an entity to gather or provide a single line or + * word of text, which may be shown in an interface. This field type is + * the default and MUST be assumed if an entity receives a field type it + * does not understand.*/ + TypeNone, /**< The field is child of either a <reported> or <item> + * element or has no type attribute. */ + TypeInvalid /**< The field is invalid. Only possible if the field was created from + * a Tag not correctly describing a Data Form Field. */ + }; + + public: + + /** + * Constructs a new DataForm field. + * @param type The type of the field. Default: text-single. + */ + DataFormField( FieldType type = TypeTextSingle ); + + /** + * Constructs a new DataForm field and fills it with the given values. + * @param name The field's name (the value of the 'var' attribute). + * @param value The field's value. + * @param label The field's label. + * @param type The field's type. + * @since 0.9 + */ + DataFormField( const std::string& name, const std::string& value = EmptyString, + const std::string& label = EmptyString, FieldType type = TypeTextSingle ); + + /** + * Constructs a new Data Form Field from an existing tag that describes a field. + * @param tag The tag to parse. + */ + DataFormField( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~DataFormField(); + + /** + * Use this function to retrieve the optional values of a field. + * @return The options of a field. + */ + const StringMultiMap& options() const { return m_options; } + + /** + * Use this function to create a Tag representation of the form field. This is usually called by + * DataForm. + * @return A Tag hierarchically describing the form field, or NULL if the field is invalid (i.e. + * created from a Tag not correctly describing a Data Form Field). + */ + virtual Tag* tag() const; + + /** + * Use this function to retrieve the name of the field (the content of the 'var' attribute). + * @return The name of the field. + */ + const std::string& name() const { return m_name; } + + /** + * Sets the name (the content of the 'var' attribute) of the field. The name identifies the + * field uniquely in the form. + * @param name The new name of the field. + * @note Fields of type other than 'fixed' MUST have a name, if it is 'fixed', it MAY. + */ + void setName( const std::string& name ) { m_name = name; } + + /** + * Use this function to set the optional values of the field. The key of the map + * will be used as the label of the option, while the value will be used as ... the + * value. ;) + * @param options The optional values of a list* or *multi type of field. + */ + void setOptions( const StringMultiMap& options ) { m_options = options; } + + /** + * Adds a single option to the list of options. + * @param label The label of the option. + * @param value The value of the option. + * @since 0.9.4 + */ + void addOption( const std::string& label, const std::string& value ) + { m_options.insert( std::make_pair( label, value ) ); } + + /** + * Use this function to determine whether or not this field is required. + * @return Whether or not this field is required. + */ + bool required() const { return m_required; } + + /** + * Use this field to set this field to be required. + * @param required Whether or not this field is required. + */ + void setRequired( bool required ) { m_required = required; } + + /** + * Use this function to retrieve the describing label of this field. + * @return The describing label of this field. + */ + const std::string& label() const { return m_label; } + + /** + * Use this function to set the describing label of this field. + * @param label The describing label of this field. + */ + void setLabel( const std::string& label ) { m_label = label; } + + /** + * Use this function to retrieve the description of this field. + * @return The description of this field + */ + const std::string& description() const { return m_desc; } + + /** + * Use this function to set the description of this field. + * @param desc The description of this field. + */ + void setDescription( const std::string& desc ) { m_desc = desc; } + + /** + * Use this function to retrieve the value of this field. + * @return The value of this field. + */ + const std::string& value() const { return ( m_values.size() > 0 ) ? m_values.front() : EmptyString; } + + /** + * Use this function to set the value of this field. + * @param value The new value of this field. + */ + void setValue( const std::string& value ) { m_values.clear(); addValue( value ); } + + /** + * Use this function to retrieve the values of this field, if its of type 'text-multi'. + * @return The value of this field. + */ + const StringList& values() const { return m_values; } + + /** + * Use this function to set multiple values of this field, if it is of type 'text-multi'. If its not, + * use @ref setValue() instead. + * @param values The new values of this field. + */ + void setValues( const StringList& values ) { m_values = values; } + + /** + * Adds a single value to the list of values. + * @param value The value to add. + */ + void addValue( const std::string& value ) { m_values.push_back( value ); } + + /** + * Use this function to retrieve the type of this field. + * @return The type of this field. + */ + FieldType type() const { return m_type; } + + /** + * Converts to @b true if the FormBase is valid, @b false otherwise. + */ + operator bool() const { return m_type != TypeInvalid; } + + private: + FieldType m_type; + + StringMultiMap m_options; + StringList m_values; + + std::string m_name; + std::string m_desc; + std::string m_label; + + bool m_required; + }; + +} + +#endif // DATAFORMFIELD_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.cpp b/smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.cpp new file mode 100644 index 00000000..6638cd1c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.cpp @@ -0,0 +1,47 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "dataformfieldcontainer.h" +#include "util.h" + + +namespace gloox +{ + + DataFormFieldContainer::DataFormFieldContainer() + { + } + + DataFormFieldContainer::DataFormFieldContainer( const DataFormFieldContainer& dffc ) + { + FieldList::const_iterator it = dffc.m_fields.begin(); + for( ; it != dffc.m_fields.end(); ++it ) + { + m_fields.push_back( new DataFormField( *(*it) ) ); + } + } + + DataFormFieldContainer::~DataFormFieldContainer() + { + util::clearList( m_fields ); + } + + DataFormField* DataFormFieldContainer::field( const std::string& field ) const + { + FieldList::const_iterator it = m_fields.begin(); + for( ; it != m_fields.end() && (*it)->name() != field; ++it ) + ; + return it != m_fields.end() ? (*it) : 0; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.h b/smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.h new file mode 100644 index 00000000..7e053380 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformfieldcontainer.h @@ -0,0 +1,125 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DATAFORMFIELDCONTAINER_H__ +#define DATAFORMFIELDCONTAINER_H__ + +#include "dataformfield.h" + +#include +#include + +namespace gloox +{ + + class DataFormField; + + /** + * @brief An abstract base class for a @xep{0004} Data Form. + * + * You shouldn't need to use this class directly. Use DataForm instead. + * + * @author Jakob Schröter + * @since 0.7 + */ + class GLOOX_API DataFormFieldContainer + { + public: + /** + * Creates a new FieldContainer. + */ + DataFormFieldContainer(); + + /** + * Creates a new FieldContainer, copying all fields from the given FieldContainer. + * @param dffc The FieldContainer to copy. + */ + DataFormFieldContainer( const DataFormFieldContainer& dffc ); + + /** + * Virtual destructor. + */ + virtual ~DataFormFieldContainer(); + + /** + * A list of @xep{0004} Data Form Fields. + */ + typedef std::list FieldList; + + /** + * Use this function to check whether this form contains a field with the given name. + * @param field The name of the field (the content of the 'var' attribute). + * @return Whether or not the form contains the named field. + */ + bool hasField( const std::string& field ) const + { return DataFormFieldContainer::field( field ) != 0; } + + /** + * Use this function to fetch a pointer to a field of the form. If no such field exists, + * 0 is returned. + * @param field The name of the field (the content of the 'var' attribute). + * @return A copy of the field with the given name if it exists, 0 otherwise. + */ + DataFormField* field( const std::string& field ) const; + + /** + * Use this function to retrieve the list of fields of a form. + * @return The list of fields the form contains. + */ + FieldList& fields() { return m_fields; } + + /** + * Use this function to retrieve the const list of fields of a form. + * @return The const list of fields the form contains. + */ + const FieldList& fields() const { return m_fields; } + + /** + * Use this function to set the fields the form contains. + * @param fields The list of fields. + * @note Any previously set fields will be deleted. Always set all fields, not a delta. + */ + virtual void setFields( FieldList& fields ) { m_fields = fields; } + + /** + * Use this function to add a single field to the list of existing fields. + * @param field The field to add. + * @since 0.9 + */ + virtual void addField( DataFormField* field ) { m_fields.push_back( field ); } + + /** + * Adds a single new Field and returns a pointer to that field. + * @param type The field's type. + * @param name The field's name (the value of the 'var' attribute). + * @param value The field's value. + * @param label The field's label. + * @since 0.9.4 + */ + DataFormField* addField( DataFormField::FieldType type, const std::string& name, + const std::string& value = EmptyString, + const std::string& label = EmptyString ) + { + DataFormField* field = new DataFormField( name, value, label, type ); + m_fields.push_back( field ); + return field; + } + + protected: + FieldList m_fields; + + }; + +} + +#endif // DATAFORMFIELDCONTAINER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/dataformitem.cpp b/smack/smack/src/main/cpp/gloox/src/dataformitem.cpp new file mode 100644 index 00000000..63c7ac8e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformitem.cpp @@ -0,0 +1,54 @@ + /* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "dataformitem.h" + +#include "tag.h" + +namespace gloox +{ + + DataFormItem::DataFormItem() + { + } + + DataFormItem::DataFormItem( const Tag* tag ) + { + if( tag->name() != "item" ) + return; + + const TagList &l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + DataFormField* f = new DataFormField( (*it) ); + m_fields.push_back( f ); + } + } + + DataFormItem::~DataFormItem() + { + } + + Tag* DataFormItem::tag() const + { + Tag* i = new Tag ( "item" ); + DataFormFieldContainer::FieldList::const_iterator it = m_fields.begin(); + for( ; it != m_fields.end(); ++it ) + { + i->addChild( (*it)->tag() ); + } + return i; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/dataformitem.h b/smack/smack/src/main/cpp/gloox/src/dataformitem.h new file mode 100644 index 00000000..27e28244 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformitem.h @@ -0,0 +1,62 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DATAFORMITEM_H__ +#define DATAFORMITEM_H__ + +#include "dataformfieldcontainer.h" + +namespace gloox +{ + + /** + * @brief An abstraction of an <item> element in a @xep{0004} Data Form of type result. + * + * There are some constraints regarding usage of this element you should be aware of. Check @xep{0004} + * section 3.4. This class does not enforce correct usage at this point. + * + * @author Jakob Schröter + * @since 0.7 + */ + class GLOOX_API DataFormItem : public DataFormFieldContainer + { + public: + /** + * Creates an empty 'item' element you can add fields to. + */ + DataFormItem(); + + /** + * Creates a 'item' element and fills it with the 'field' elements contained in the given Tag. + * The Tag's root element must be a 'item' element. Its child element should be 'field' elements. + * @param tag The tag to read the 'field' elements from. + * @since 0.8.5 + */ + DataFormItem( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~DataFormItem(); + + /** + * Creates and returns a Tag representation of the current object. + * @return A Tag representation of the current object. + */ + virtual Tag* tag() const; + + }; + +} + +#endif // DATAFORMITEM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/dataformreported.cpp b/smack/smack/src/main/cpp/gloox/src/dataformreported.cpp new file mode 100644 index 00000000..1fd46e75 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformreported.cpp @@ -0,0 +1,54 @@ + /* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "dataformreported.h" + +#include "tag.h" + +namespace gloox +{ + + DataFormReported::DataFormReported() + { + } + + DataFormReported::DataFormReported( Tag* tag ) + { + if( tag->name() != "reported" ) + return; + + const TagList &l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + DataFormField* f = new DataFormField( (*it) ); + m_fields.push_back( f ); + } + } + + DataFormReported::~DataFormReported() + { + } + + Tag* DataFormReported::tag() const + { + Tag* r = new Tag ( "reported" ); + DataFormFieldContainer::FieldList::const_iterator it = m_fields.begin(); + for( ; it != m_fields.end(); ++it ) + { + r->addChild( (*it)->tag() ); + } + return r; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/dataformreported.h b/smack/smack/src/main/cpp/gloox/src/dataformreported.h new file mode 100644 index 00000000..057a9159 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dataformreported.h @@ -0,0 +1,64 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DATAFORMREPORTED_H__ +#define DATAFORMREPORTED_H__ + +#include "dataformfieldcontainer.h" + +namespace gloox +{ + + class Tag; + + /** + * @brief An abstraction of a <reported> element in a @xep{0004} Data Form of type result. + * + * There are some constraints regarding usage of this element you should be aware of. Check @xep{0004} + * section 3.4. This class does not enforce correct usage at this point. + * + * @author Jakob Schröter + * @since 0.7 + */ + class GLOOX_API DataFormReported : public DataFormFieldContainer + { + public: + /** + * Creates an empty 'reported' element you can add fields to. + */ + DataFormReported(); + + /** + * Creates a 'reported' element and fills it with the 'field' elements contained in the given Tag. + * The Tag's root element must be a 'reported' element. Its child element should be 'field' elements. + * @param tag The tag to read the 'field' elements from. + * @since 0.8.5 + */ + DataFormReported( Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~DataFormReported(); + + /** + * Creates and returns a Tag representation of the current object. + * @return A Tag representation of the current object. + */ + virtual Tag* tag() const; + + }; + +} + +#endif // DATAFORMREPORTED_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/delayeddelivery.cpp b/smack/smack/src/main/cpp/gloox/src/delayeddelivery.cpp new file mode 100644 index 00000000..0c7181d1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/delayeddelivery.cpp @@ -0,0 +1,75 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "delayeddelivery.h" + +#include "tag.h" + +namespace gloox +{ + + DelayedDelivery::DelayedDelivery( const JID& from, const std::string stamp, const std::string& reason ) + : StanzaExtension( ExtDelay ), m_from( from ), m_stamp( stamp ), m_reason( reason ), m_valid( false ) + { + if( !m_stamp.empty() ) + m_valid = true; + } + + + DelayedDelivery::DelayedDelivery( const Tag* tag ) + : StanzaExtension( ExtDelay ), m_valid( false ) + { + if( !tag || !tag->hasAttribute( "stamp" ) ) + return; + + if( !( tag->name() == "x" && tag->hasAttribute( XMLNS, XMLNS_X_DELAY ) ) ) + if( !( tag->name() == "delay" && tag->hasAttribute( XMLNS, XMLNS_DELAY ) ) ) + return; + + m_reason = tag->cdata(); + m_stamp = tag->findAttribute( "stamp" ); + m_from = tag->findAttribute( "from" ); + m_valid = true; + } + + DelayedDelivery::~DelayedDelivery() + { + } + + const std::string& DelayedDelivery::filterString() const + { + static const std::string filter = + "/presence/delay[@xmlns='" + XMLNS_DELAY + "']" + "|/message/delay[@xmlns='" + XMLNS_DELAY + "']" + "|/presence/x[@xmlns='" + XMLNS_X_DELAY + "']" + "|/message/x[@xmlns='" + XMLNS_X_DELAY + "']"; + return filter; + } + + Tag* DelayedDelivery::tag() const + { + if( !m_valid ) + return 0; + + Tag* t = new Tag( "delay" ); + t->addAttribute( XMLNS, XMLNS_DELAY ); + if( m_from ) + t->addAttribute( "from", m_from.full() ); + if( !m_stamp.empty() ) + t->addAttribute( "stamp", m_stamp ); + if( !m_reason.empty() ) + t->setCData( m_reason ); + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/delayeddelivery.h b/smack/smack/src/main/cpp/gloox/src/delayeddelivery.h new file mode 100644 index 00000000..c06fb900 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/delayeddelivery.h @@ -0,0 +1,130 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DELAYEDDELIVERY_H__ +#define DELAYEDDELIVERY_H__ + +#include "gloox.h" +#include "jid.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an implementation of @xep{0203} (Delayed Delivery). + * + * The class also implements the deprecated @xep{0091} (Delayed Delivery) in a read-only fashion. + * It understands both XEP formats for input, but any output will conform to @xep{0203}. + * + * XEP Version: 0.1 + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API DelayedDelivery : public StanzaExtension + { + + public: + /** + * Constructs a new object and fills it according to the parameters. + * @param from The JID of the original sender or the entity that delayed the sending. + * @param stamp The datetime stamp of the original send. + * @param reason An optional natural language reason for the delay. + */ + DelayedDelivery( const JID& from, const std::string stamp, + const std::string& reason = "" ); + + /** + * Constructs a new object from the given Tag. + * @param tag The Tag to parse. + */ + DelayedDelivery( const Tag* tag = 0 ); + + /** + * Virtual Destructor. + */ + virtual ~DelayedDelivery(); + + /** + * Returns the datetime when the stanza was originally sent. + * The format MUST adhere to the dateTime format specified in @xep{0082} and MUST + * be expressed in UTC. + * @return The original datetime. + */ + const std::string& stamp() const { return m_stamp; } + + /** + * Sets the original datetime. + * @param stamp The original datetime. + */ + void setStamp( const std::string& stamp ) { m_stamp = stamp; } + + /** + * Returns the JID of the original sender of the stanza or the entity that + * delayed the sending. + * The format MUST adhere to the dateTime format specified in @xep{0082} and MUST + * be expressed in UTC. + * @return The JID. + */ + const JID& from() const { return m_from; } + + /** + * Sets the JID of the origianl sender or the entity that delayed the sending. + * @param from The JID. + */ + void setFrom( const JID& from ) { m_from = from; } + + /** + * Returns a natural language reason for the delay. + * @return A natural language reason for the delay. + */ + const std::string& reason() const { return m_reason; } + + /** + * Sets the reason for the delay. + * @param reason The reason for the delay. + */ + void setReason( const std::string& reason ) { m_reason = reason; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new DelayedDelivery( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new DelayedDelivery( *this ); + } + + private: + JID m_from; + std::string m_stamp; + std::string m_reason; + bool m_valid; + }; + +} + +#endif // DELAYEDDELIVERY_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/disco.cpp b/smack/smack/src/main/cpp/gloox/src/disco.cpp new file mode 100644 index 00000000..31d36e04 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/disco.cpp @@ -0,0 +1,535 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "disco.h" +#include "discohandler.h" +#include "dataform.h" +#include "error.h" +#include "clientbase.h" +#include "disconodehandler.h" +#include "softwareversion.h" +#include "util.h" + + +namespace gloox +{ + + // ---- Disco::Identity ---- + Disco::Identity::Identity( const std::string& category, + const std::string& type, + const std::string& name ) + : m_category( category ), m_type( type ), m_name( name ) + { + } + + Disco::Identity::Identity( const Tag* tag ) + { + if( !tag || tag->name() != "identity" ) + return; + + m_category = tag->findAttribute( "category" ); + m_type = tag->findAttribute( "type" ); + m_name = tag->findAttribute( "name" ); + } + + Disco::Identity::Identity( const Identity& id ) + : m_category( id.m_category ), m_type( id.m_type ), m_name( id.m_name ) + { + } + + Disco::Identity::~Identity() + { + } + + Tag* Disco::Identity::tag() const + { + if( m_category.empty() || m_type.empty() ) + return 0; + + Tag* i = new Tag( "identity" ); + i->addAttribute( "category", m_category ); + i->addAttribute( "type", m_type ); + + if( !m_name.empty() ) + i->addAttribute( "name", m_name ); + + return i; + } + // ---- ~Disco::Identity ---- + + // ---- Disco::Info ---- + Disco::Info::Info( const std::string& node, bool defaultFeatures ) + : StanzaExtension( ExtDiscoInfo ), m_node( node ), m_form( 0 ) + { + if( defaultFeatures ) + { + m_features.push_back( XMLNS_DISCO_INFO ); + m_features.push_back( XMLNS_DISCO_ITEMS ); + } + } + + Disco::Info::Info( const Tag* tag ) + : StanzaExtension( ExtDiscoInfo ), m_form( 0 ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_DISCO_INFO ) + return; + + m_node = tag->findAttribute( "node" ); + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + const std::string& name = (*it)->name(); + if( name == "identity" ) + m_identities.push_back( new Identity( (*it) ) ); + else if( name == "feature" && (*it)->hasAttribute( "var" ) ) + m_features.push_back( (*it)->findAttribute( "var" ) ); + else if( !m_form && name == "x" && (*it)->xmlns() == XMLNS_X_DATA ) + m_form = new DataForm( (*it) ); + } + } + + Disco::Info::Info( const Info& info ) + : StanzaExtension( ExtDiscoInfo ), m_node( info.m_node ), m_features( info.m_features ), + m_identities( info.m_identities ), m_form( info.m_form ? new DataForm( *(info.m_form) ) : 0 ) + { + } + + Disco::Info::~Info() + { + delete m_form; + util::clearList( m_identities ); + } + + void Disco::Info::setForm( DataForm* form ) + { + delete m_form; + m_form = form; + } + + bool Disco::Info::hasFeature( const std::string& feature ) const + { + StringList::const_iterator it = m_features.begin(); + for( ; it != m_features.end() && (*it) != feature; ++it ) + ; + return it != m_features.end(); + } + + const std::string& Disco::Info::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_DISCO_INFO + "']"; + return filter; + } + + Tag* Disco::Info::tag() const + { + Tag* t = new Tag( "query", XMLNS, XMLNS_DISCO_INFO ); + + if( !m_node.empty() ) + t->addAttribute( "node", m_node ); + + IdentityList::const_iterator it_i = m_identities.begin(); + for( ; it_i != m_identities.end(); ++it_i ) + t->addChild( (*it_i)->tag() ); + + StringList::const_iterator it_f = m_features.begin(); + for( ; it_f != m_features.end(); ++it_f ) + new Tag( t, "feature", "var", (*it_f) ); + + if( m_form ) + t->addChild( m_form->tag() ); + + return t; + } + // ---- ~Disco::Info ---- + + // ---- Disco::Item ---- + Disco::Item::Item( const Tag* tag ) + { + if( !tag || tag->name() != "item" ) + return; + + m_jid = tag->findAttribute( "jid" ); + m_node = tag->findAttribute( "node" ); + m_name = tag->findAttribute( "name" ); + } + + Tag* Disco::Item::tag() const + { + if( !m_jid ) + return 0; + + Tag* i = new Tag( "item" ); + i->addAttribute( "jid", m_jid.full() ); + + if( !m_node.empty() ) + i->addAttribute( "node", m_node ); + if( !m_name.empty() ) + i->addAttribute( "name", m_name ); + + return i; + } + // ---- ~Disco::Item ---- + + // ---- Disco::Items ---- + Disco::Items::Items( const std::string& node ) + : StanzaExtension( ExtDiscoItems ), m_node( node ) + { + } + + Disco::Items::Items( const Tag* tag ) + : StanzaExtension( ExtDiscoItems ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_DISCO_ITEMS ) + return; + + m_node = tag->findAttribute( "node" ); + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + const std::string& name = (*it)->name(); + if( name == "item" ) + m_items.push_back( new Item( (*it) ) ); + } + } + + Disco::Items::~Items() + { + util::clearList( m_items ); + } + + void Disco::Items::setItems( const ItemList& items ) + { + util::clearList( m_items ); + m_items = items; + } + + + const std::string& Disco::Items::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_DISCO_ITEMS + "']"; + return filter; + } + + Tag* Disco::Items::tag() const + { + Tag* t = new Tag( "query", XMLNS, XMLNS_DISCO_ITEMS ); + + if( !m_node.empty() ) + t->addAttribute( "node", m_node ); + + ItemList::const_iterator it_i = m_items.begin(); + for( ; it_i != m_items.end(); ++it_i ) + t->addChild( (*it_i)->tag() ); + + return t; + } + // ---- ~Disco::Items ---- + + // ---- Disco ---- + Disco::Disco( ClientBase* parent ) + : m_parent( parent ), m_form( 0 ) + { + addFeature( XMLNS_VERSION ); +// addFeature( XMLNS_DISCO_INFO ); //handled by Disco::Info now +// addFeature( XMLNS_DISCO_ITEMS ); //handled by Disco::Info now + if( m_parent ) + { + m_parent->registerIqHandler( this, ExtDiscoInfo ); + m_parent->registerIqHandler( this, ExtDiscoItems ); + m_parent->registerIqHandler( this, ExtVersion ); + m_parent->registerStanzaExtension( new Disco::Info() ); + m_parent->registerStanzaExtension( new Disco::Items() ); + m_parent->registerStanzaExtension( new SoftwareVersion() ); + } + } + + Disco::~Disco() + { + util::clearList( m_identities ); + delete m_form; + + if( m_parent ) + { + m_parent->removeIqHandler( this, ExtDiscoInfo ); + m_parent->removeIqHandler( this, ExtDiscoItems ); + m_parent->removeIqHandler( this, ExtVersion ); + m_parent->removeStanzaExtension( ExtDiscoInfo ); + m_parent->removeStanzaExtension( ExtDiscoItems ); + m_parent->removeStanzaExtension( ExtVersion ); + m_parent->removeIDHandler( this ); + } + } + + void Disco::setForm( DataForm* form ) + { + delete m_form; + m_form = form; + } + + bool Disco::handleIq( const IQ& iq ) + { + switch( iq.subtype() ) + { + case IQ::Get: + { + IQ re( IQ::Result, iq.from(), iq.id() ); + re.setFrom( iq.to() ); + + const SoftwareVersion* sv = iq.findExtension( ExtVersion ); + if( sv ) + { + re.addExtension( new SoftwareVersion( m_versionName, m_versionVersion, m_versionOs ) ); + m_parent->send( re ); + return true; + } + + const Info *info = iq.findExtension( ExtDiscoInfo ); + if( info ) + { + Info *i = new Info( EmptyString, true ); + if( !info->node().empty() ) + { + i->setNode( info->node() ); + IdentityList identities; + StringList features; + DiscoNodeHandlerMap::const_iterator it = m_nodeHandlers.find( info->node() ); + if( it == m_nodeHandlers.end() ) + { + delete i; + IQ re( IQ::Error, iq.from(), iq.id() ); + re.addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorItemNotFound ) ); + m_parent->send( re ); + return true; + } + else + { + DiscoNodeHandlerList::const_iterator in = (*it).second.begin(); + for( ; in != (*it).second.end(); ++in ) + { + IdentityList il = (*in)->handleDiscoNodeIdentities( iq.from(), info->node() ); + il.sort(); // needed on win32 + identities.merge( il ); + StringList fl = (*in)->handleDiscoNodeFeatures( iq.from(), info->node() ); + fl.sort(); // needed on win32 + features.merge( fl ); + } + } + i->setIdentities( identities ); + i->setFeatures( features ); + } + else + { + IdentityList il; + IdentityList::const_iterator it = m_identities.begin(); + for( ; it != m_identities.end(); ++it ) + { + il.push_back( new Identity( *(*it) ) ); + } + i->setIdentities( il ); + i->setFeatures( m_features ); + if( m_form ) + i->setForm( new DataForm( *m_form ) ); + } + + re.addExtension( i ); + m_parent->send( re ); + return true; + } + + const Items *items = iq.findExtension( ExtDiscoItems ); + if( items ) + { + Items *i = new Items( items->node() ); + if( !items->node().empty() ) + { + DiscoNodeHandlerMap::const_iterator it = m_nodeHandlers.find( items->node() ); + if( it == m_nodeHandlers.end() ) + { + delete i; + IQ re( IQ::Error, iq.from(), iq.id() ); + re.addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorItemNotFound ) ); + m_parent->send( re ); + return true; + } + else + { + ItemList itemlist; + DiscoNodeHandlerList::const_iterator in = (*it).second.begin(); + for( ; in != (*it).second.end(); ++in ) + { + ItemList il = (*in)->handleDiscoNodeItems( iq.from(), iq.to(), items->node() ); + il.sort(); // needed on win32 + itemlist.merge( il ); + } + i->setItems( itemlist ); + } + } + + re.addExtension( i ); + m_parent->send( re ); + return true; + } + break; + } + + case IQ::Set: + { + bool res = false; + DiscoHandlerList::const_iterator it = m_discoHandlers.begin(); + for( ; it != m_discoHandlers.end(); ++it ) + { + if( (*it)->handleDiscoSet( iq ) ) + res = true; + } + return res; + break; + } + + default: + break; + } + return false; + } + + void Disco::handleIqID( const IQ& iq, int context ) + { + DiscoHandlerMap::iterator it = m_track.find( iq.id() ); + if( it != m_track.end() && (*it).second.dh ) + { + switch( iq.subtype() ) + { + case IQ::Result: + switch( context ) + { + case GetDiscoInfo: + { + const Info* di = iq.findExtension( ExtDiscoInfo ); + if( di ) + (*it).second.dh->handleDiscoInfo( iq.from(), *di, (*it).second.context ); + break; + } + case GetDiscoItems: + { + const Items* di = iq.findExtension( ExtDiscoItems ); + if( di ) + (*it).second.dh->handleDiscoItems( iq.from(), *di, (*it).second.context ); + break; + } + } + break; + + case IQ::Error: + { + (*it).second.dh->handleDiscoError( iq.from(), iq.error(), (*it).second.context ); + break; + } + + default: + break; + } + + m_track.erase( it ); + } + } + + void Disco::getDisco( const JID& to, const std::string& node, DiscoHandler* dh, int context, + IdType idType, const std::string& tid ) + { + const std::string& id = tid.empty() ? m_parent->getID() : tid; + + IQ iq( IQ::Get, to, id ); + if( idType == GetDiscoInfo ) + iq.addExtension( new Info( node ) ); + else + iq.addExtension( new Items( node ) ); + + DiscoHandlerContext ct; + ct.dh = dh; + ct.context = context; + m_track[id] = ct; + m_parent->send( iq, this, idType ); + } + + void Disco::setVersion( const std::string& name, const std::string& version, const std::string& os ) + { + m_versionName = name; + m_versionVersion = version; + m_versionOs = os; + } + + void Disco::setIdentity( const std::string& category, const std::string& type, + const std::string& name ) + { + util::clearList( m_identities ); + addIdentity( category, type, name ); + } + + void Disco::removeDiscoHandler( DiscoHandler* dh ) + { + m_discoHandlers.remove( dh ); + DiscoHandlerMap::iterator t; + DiscoHandlerMap::iterator it = m_track.begin(); + while( it != m_track.end() ) + { + t = it; + ++it; + if( dh == (*t).second.dh ) + { + m_track.erase( t ); + } + } + } + + void Disco::registerNodeHandler( DiscoNodeHandler* nh, const std::string& node ) + { + m_nodeHandlers[node].push_back( nh ); + } + + void Disco::removeNodeHandler( DiscoNodeHandler* nh, const std::string& node ) + { + DiscoNodeHandlerMap::iterator it = m_nodeHandlers.find( node ); + if( it != m_nodeHandlers.end() ) + { + (*it).second.remove( nh ); + if( (*it).second.empty() ) + m_nodeHandlers.erase( it ); + } + } + + void Disco::removeNodeHandlers( DiscoNodeHandler* nh ) + { + DiscoNodeHandlerMap::iterator it = m_nodeHandlers.begin(); + DiscoNodeHandlerMap::iterator it2; + while( it != m_nodeHandlers.end() ) + { + it2 = it++; + removeNodeHandler( nh, (*it2).first ); + } + } + + const StringList Disco::features( bool defaultFeatures ) const + { + StringList f = m_features; + if( defaultFeatures ) + { + f.push_back( XMLNS_DISCO_INFO ); + f.push_back( XMLNS_DISCO_ITEMS ); + } + return f; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/disco.h b/smack/smack/src/main/cpp/gloox/src/disco.h new file mode 100644 index 00000000..9eee26bf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/disco.h @@ -0,0 +1,636 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef DISCO_H__ +#define DISCO_H__ + +#include "gloox.h" + +#include "iqhandler.h" +#include "jid.h" + +#include +#include +#include + +namespace gloox +{ + + class ClientBase; + class DataForm; + class DiscoHandler; + class DiscoNodeHandler; + class IQ; + + /** + * @brief This class implements @xep{0030} (Service Discovery) and @xep{0092} (Software Version). + * + * ClientBase will automatically instantiate a Disco object. It can be used to + * announce special features of your client, or its version, or... + * + * XEP version: 2.2 + * @author Jakob Schröter + */ + class GLOOX_API Disco : public IqHandler + { + friend class ClientBase; + + public: + + class Identity; // declared below class Info + + /** + * A list of pointers to Identity objects. Used with Disco::Info. + */ + typedef std::list IdentityList; + + /** + * @brief An abstraction of a Disco Info element (from Service Discovery, @xep{0030}) + * as a StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Info : public StanzaExtension + { + friend class Disco; + + public: + /** + * Returns the queried node identifier, if any. + * @return The node identifier. May be empty. + */ + const std::string& node() const { return m_node; } + + /** + * Returns the entity's supported features. + * @return A list of supported features/namespaces. + */ + const StringList& features() const { return m_features; } + + /** + * Use this function to check if the entity the Info came from supports agiven feature. + * @param feature The feature to check for. + * @return @b True if the entity announces support for the feature, @b false otherwise. + */ + bool hasFeature( const std::string& feature ) const; + + /** + * Returns the entity's identities. + * @return A list of pointers to Identity objects. + */ + const IdentityList& identities() const { return m_identities; } + + /** + * Returns an optionally included data form. This is used by e.g. MUC (@xep{0045}). + * @return An optional data form included in the disco#info. May be 0. + */ + const DataForm* form() const { return m_form; } + + /** + * Adds an optional DataForm, e.g. for @xep{0232}. Only one form can be added + * at this point. + * @param form An optional DataForm to include in the Info reply. + * The form will be owned by and deleted on destruction of the Info object. + * @note If called more than once the previously set form will be deleted. + */ + void setForm( DataForm* form ); + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Info( tag ); + } + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Info( *this ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + private: +#ifdef DISCO_INFO_TEST + public: +#endif + /** + * Creates a empty Info object, suitable for making disco#info requests. + * @param node The node identifier to query (optional). + * @param defaultFeatures Indicates whether or not the default features should be + * included in the Info. Should be @b false for requests, @b true for replies. + * Defaults to @b false. + */ + Info( const std::string& node = EmptyString, bool defaultFeatures = false ); + + /** + * Creates an Info object from the given Tag. + * @param tag A <query> tag in the disco#info namespace, (possibly) containing + * a disco#info reply. + */ + Info( const Tag* tag ); + + /** + * Copy constructor. + * @param info An Info object to copy. + */ + Info( const Info& info ); + + /** + * Virtual destructor. + */ + virtual ~Info(); + + /** + * Sets the current info node. + * @param node The info node. + */ + void setNode( const std::string& node ) { m_node = node; } + + /** + * This function can be used to set the entity's features. + * @param features A list of supported features/namespaces. + */ + void setFeatures( const StringList& features ) + { + StringList fl( features ); + fl.sort(); // needed on win32 + m_features.merge( fl ); + } + + /** + * This function can be used to set the entity's identities. + * @param identities A list of pointers to the entity's identities. + * @note The Identity objects pointed to will be owned by the Info object. The + * list should neither be used again nor should the Identity objects be deleted. + */ + void setIdentities( const IdentityList& identities ) { m_identities = identities; } + + std::string m_node; + StringList m_features; + IdentityList m_identities; + DataForm* m_form; + }; + + /** + * @brief An abstraction of a Disco identity (Service Discovery, @xep{0030}). + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Identity + { + friend class Info; + friend class Disco; + + public: + /** + * Constructs a Disco Identity from a category, type and name. + * See http://www.xmpp.org/registrar/disco-categories.html for more info. + * @param category The identity's category. + * @param type The identity's type. + * @param name The identity's name. + */ + Identity( const std::string& category, + const std::string& type, + const std::string& name ); + + /** + * Copy Contructor. + * @param id An Identity to create a new Identity object from. + */ + Identity( const Identity& id ); + + /** + * Destructor. + */ + ~Identity(); + + /** + * Returns the identity's category. + * @return The identity's category. + */ + const std::string& category() const { return m_category; } + + /** + * Returns the identity's type. + * @return The identity's type. + */ + const std::string& type() const { return m_type; } + + /** + * Returns the identity's name. + * @return The identity's name. + */ + const std::string& name() const { return m_name; } + + /** + * Creates and returns a Tag representation of this identity. + * @return A Tag, or 0. + */ + Tag* tag() const; + + private: + /** + * Creates a Disco Identity from the given Tag. + * @param tag A Tag representation of a disco identity. + */ + Identity( const Tag* tag ); + + std::string m_category; /**< The identity's category. */ + std::string m_type; /**< The identity's type. */ + std::string m_name; /**< The identity's name. */ + + }; + + class Item; // declared below class Items + + /** + * A list of pointers to Item objects. Used with Disco::Items. + */ + typedef std::list ItemList; + + /** + * @brief An abstraction of a Disco query element (from Service Discovery, @xep{0030}) + * in the disco#items namespace, implemented as a StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Items : public StanzaExtension + { + friend class Disco; + + public: + // This needs to be public so one can proactively send a list of adhoc commands + // see @xep{0050} + /** + * Creates an empty Items object, suitable for making disco#items requests. + * @param node The node identifier to query (optional). + */ + Items( const std::string& node = EmptyString ); + + /** + * Virtual destructor. + */ + virtual ~Items(); + + /** + * This function can be used to set the entity's/node's items. + * @param items A list of pointers to the entity's/node's items. + * @note The Item objects pointed to will be owned by the Items object. The + * list should neither be used again nor should the Item objects be deleted. + */ + void setItems( const ItemList& items ); + + /** + * Returns the queried node identifier, if any. + * @return The node identifier. May be empty. + */ + const std::string& node() const { return m_node; } + + /** + * Returns the entity's/node's items. + * @return A list of pointers to Item objects. + */ + const ItemList& items() const { return m_items; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Items( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Items( *this ); + } + + private: +#ifdef DISCO_ITEMS_TEST + public: +#endif + /** + * Creates an Items object from the given Tag. + * @param tag A <query> tag in the disco#items namespace, (possibly) containing + * a disco#items reply. + */ + Items( const Tag* tag ); + + std::string m_node; + ItemList m_items; + }; + + /** + * @brief An abstraction of a Disco item (Service Discovery, @xep{0030}). + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Item + { + friend class Items; + + public: + /** + * Constructs a Disco Item from a JID, node and name. + * @param jid The item's JID. + * @param node The item's type. + * @param name The item's name. + */ + Item( const JID& jid, + const std::string& node, + const std::string& name ) + : m_jid( jid ), m_node( node ), m_name( name ) {} + + /** + * Destructor. + */ + ~Item() {} + + /** + * Returns the item's JID. + * @return The item's JID. + */ + const JID& jid() const { return m_jid; } + + /** + * Returns the item's node. + * @return The item's node. + */ + const std::string& node() const { return m_node; } + + /** + * Returns the item's name. + * @return The item's name. + */ + const std::string& name() const { return m_name; } + + /** + * Creates and returns a Tag representation of this item. + * @return A Tag, or 0. + */ + Tag* tag() const; + + private: + /** + * Creates a Disco Item from the given Tag. + * @param tag A Tag representation of a Disco item. + */ + Item( const Tag* tag ); + + JID m_jid; /**< The item's jid. */ + std::string m_node; /**< The item's type. */ + std::string m_name; /**< The item's name. */ + + }; + + /** + * Adds a feature to the list of supported Jabber features. + * The list will be posted as an answer to IQ queries in the + * "http://jabber.org/protocol/disco#info" namespace. + * These IQ packets will also be forwarded to the + * application's IqHandler, if it listens to the @c disco\#info namespace. + * By default, disco(very) queries are handled by the library. + * By default, all supported, not disabled features are announced. + * @param feature A feature (namespace) the host app supports. + * @note Use this function for non-queryable features. For nodes that shall + * answer to @c disco\#info queries, use registerNodeHandler(). + */ + void addFeature( const std::string& feature ) + { m_features.push_back( feature ); } + + /** + * Removes the given feature from the list of advertised client features. + * @param feature The feature to remove. + * @since 0.9 + */ + void removeFeature( const std::string& feature ) + { m_features.remove( feature ); } + + /** + * Lets you retrieve the features this Disco instance supports. + * @param defaultFeatures Include default features. Defaults to @b false. + * @return A list of supported features/namespaces. + */ + const StringList features( bool defaultFeatures = false ) const; + + /** + * Queries the given JID for general infomation according to + * @xep{0030} (Service Discovery). + * To receive the results inherit from DiscoHandler and register with the Disco object. + * @param to The destination-JID of the query. + * @param node An optional node to query. Not inserted if empty. + * @param dh The DiscoHandler to notify about results. + * @param context A context identifier. + * @param tid An optional id that is going to be used as the IQ request's id. Only + * necessary if you need to know the request's id. + */ + void getDiscoInfo( const JID& to, const std::string& node, DiscoHandler* dh, int context, + const std::string& tid = EmptyString ) + { getDisco( to, node, dh, context, GetDiscoInfo, tid ); } + + /** + * Queries the given JID for its items according to + * @xep{0030} (Service Discovery). + * To receive the results inherit from DiscoHandler and register with the Disco object. + * @param to The destination-JID of the query. + * @param node An optional node to query. Not inserted if empty. + * @param dh The DiscoHandler to notify about results. + * @param context A context identifier. + * @param tid An optional id that is going to be used as the IQ request's id. Only + * necessary if you need to know the request's id. + */ + void getDiscoItems( const JID& to, const std::string& node, DiscoHandler* dh, int context, + const std::string& tid = EmptyString ) + { getDisco( to, node, dh, context, GetDiscoItems, tid ); } + + /** + * Sets the version of the host application using this library. + * The library takes care of jabber:iq:version requests. These + * IQ packets will not be forwarded to the IqHandlers. + * @param name The name to be returned to inquiring clients. + * @param version The version to be returned to inquiring clients. + * @param os The operating system to announce. Default: don't include. + */ + void setVersion( const std::string& name, const std::string& version, + const std::string& os = EmptyString ); + + /** + * Returns the application's advertised name. + * @return The application's advertised name. + */ + const std::string& name() const { return m_versionName; } + + /** + * Returns the application's advertised version. + * @return The application's advertised version. + */ + const std::string& version() const { return m_versionVersion; } + + /** + * Returns the application's advertised operating system. + * @return The application's advertised operating system. + */ + const std::string& os() const { return m_versionOs; } + + /** + * Sets the identity of this entity. + * The library uses this information to answer disco#info requests + * with a correct identity. + * @xep{0030} requires an entity to have at least one identity. See @xep{0030} + * for more information on categories and types. + * @param category The entity category of this client. Default: client. May not be empty. + * @param type The type of this entity. Default: bot. May not be empty. + * @param name The name of the entity. Default: empty. + * @note An entity can have more than one identity. You cann add more identities + * using addIdentity(). A call to setIdentity() will clear the list of identities + * and, after that, add the new identity given by the arguments to setIdentity(). + */ + void setIdentity( const std::string& category, const std::string& type, + const std::string& name = EmptyString ); + + /** + * Adds another identity to the list of identities. + * @param category The entity category of this client. Default: client. May not be empty. + * @param type The type of this entity. Default: bot. May not be empty. + * @param name The name of the entity. Default: empty. + */ + void addIdentity( const std::string& category, const std::string& type, + const std::string& name = EmptyString ) + { m_identities.push_back( new Identity( category, type, name ) ); } + + /** + * Returns the entity's identities. + * @return The entity's identities. + */ + const IdentityList& identities() const { return m_identities; } + + /** + * Adds an optional DataForm to Disco:Info replies, e.g. for @xep{0232}. + * Only one form can be added at this point. + * @param form An optional DataForm to include in the Info reply. + * The form will be owned by and deleted on destruction of the Disco object. + * @note If called more than once the previously set form will be deleted. + */ + void setForm( DataForm* form ); + + /** + * Returns the DataForm set by setForm(). Used by Capabilities. + * @return The DataForm, or 0. + */ + const DataForm* form() const { return m_form; } + + /** + * Use this function to register an @ref DiscoHandler with the Disco + * object. This is only necessary if you want to receive Disco-set requests. Else + * a one-time registration happens when calling getDiscoInfo() and getDiscoItems(), respectively. + * @param dh The DiscoHandler-derived object to register. + */ + void registerDiscoHandler( DiscoHandler* dh ) + { m_discoHandlers.push_back( dh ); } + + /** + * Unregisters the given DiscoHandler. + * @param dh The DiscoHandler to unregister. + */ + void removeDiscoHandler( DiscoHandler* dh ); + + /** + * Use this function to register a @ref DiscoNodeHandler with the Disco + * object. The DiscoNodeHandler will receive disco#items queries which are + * directed to the corresponding node registered for the handler. + * @param nh The NodeHandler-derived object to register. + * @param node The node name to associate with this handler. Use an empty string to + * register for the root node. + */ + void registerNodeHandler( DiscoNodeHandler* nh, const std::string& node ); + + /** + * Removes the node handler for the given node. + * @param nh The NodeHandler to unregister. + * @param node The node for which the handler shall be removed. Use an empty string to + * remove the root node's handler. + */ + void removeNodeHandler( DiscoNodeHandler* nh, const std::string& node ); + + /** + * Removes all registered nodes of the given node handler. + * @param nh The NodeHandler to unregister. + */ + void removeNodeHandlers( DiscoNodeHandler* nh ); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef DISCO_TEST + public: +#endif + Disco( ClientBase* parent ); + virtual ~Disco(); + + enum IdType + { + GetDiscoInfo, + GetDiscoItems + }; + + void getDisco( const JID& to, const std::string& node, DiscoHandler* dh, + int context, IdType idType, const std::string& tid ); + + struct DiscoHandlerContext + { + DiscoHandler* dh; + int context; + }; + + ClientBase* m_parent; + + typedef std::list DiscoHandlerList; + typedef std::list DiscoNodeHandlerList; + typedef std::map DiscoNodeHandlerMap; + typedef std::map DiscoHandlerMap; + + DiscoHandlerList m_discoHandlers; + DiscoNodeHandlerMap m_nodeHandlers; + DiscoHandlerMap m_track; + IdentityList m_identities; + StringList m_features; + StringMap m_queryIDs; + DataForm* m_form; + + std::string m_versionName; + std::string m_versionVersion; + std::string m_versionOs; + + }; + +} + +#endif // DISCO_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/discohandler.h b/smack/smack/src/main/cpp/gloox/src/discohandler.h new file mode 100644 index 00000000..ca694303 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/discohandler.h @@ -0,0 +1,83 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DISCOHANDLER_H__ +#define DISCOHANDLER_H__ + +#include "macros.h" +#include "disco.h" + +#include + +namespace gloox +{ + + class IQ; + + /** + * @brief A virtual interface that enables objects to receive Service Discovery (@xep{0030}) events. + * + * A class implementing this interface can receive the results of sent disco queries. + * + * @author Jakob Schröter + */ + class GLOOX_API DiscoHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~DiscoHandler() {} + + /** + * Reimplement this function if you want to be notified about the result + * of an disco#info query. + * @param from The sender of the disco#info result. + * @param info The Info. + * @param context A context identifier. + * @since 1.0 + */ + virtual void handleDiscoInfo( const JID& from, const Disco::Info& info, int context ) = 0; + + /** + * Reimplement this function if you want to be notified about the result + * of a disco#items query. + * @param from The sender of the disco#items result. + * @param items The Items. + * @param context A context identifier. + * @since 1.0 + */ + virtual void handleDiscoItems( const JID& from, const Disco::Items& items, int context ) = 0; + + /** + * Reimplement this function to receive disco error notifications. + * @param from The sender of the error result. + * @param error The Error. May be 0. + * @param context A context identifier. + * @since 1.0 + */ + virtual void handleDiscoError( const JID& from, const Error* error, int context ) = 0; + + /** + * Reimplement this function to receive notifications about incoming IQ + * stanzas of type 'set' in the disco namespace. + * @param iq The full IQ. + * @return Returns @b true if the stanza was handled and answered, @b false otherwise. + */ + virtual bool handleDiscoSet( const IQ& iq ) { (void)iq; return false; } + + }; + +} + +#endif // DISCOHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/disconodehandler.h b/smack/smack/src/main/cpp/gloox/src/disconodehandler.h new file mode 100644 index 00000000..db4f58f6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/disconodehandler.h @@ -0,0 +1,81 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef DISCONODEHANDLER_H__ +#define DISCONODEHANDLER_H__ + +#include "gloox.h" +#include "disco.h" + +#include +#include +#include + +namespace gloox +{ + + /** + * @brief Derived classes can be registered as NodeHandlers for certain nodes with the Disco object. + * + * Incoming disco#info and disco#items queries are delegated to their respective handlers. + * + * @author Jakob Schröter + */ + class GLOOX_API DiscoNodeHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~DiscoNodeHandler() {} + + /** + * In addition to @c handleDiscoNodeIdentities, this function is used to gather + * more information on a specific node. It is called when a disco#info query + * arrives with a node attribute that matches the one registered for this handler. + * @param from The sender of the request. + * @param node The node this handler is supposed to handle. + * @return A list of features supported by this node. + */ + virtual StringList handleDiscoNodeFeatures( const JID& from, const std::string& node ) = 0; + + /** + * In addition to @c handleDiscoNodeFeatures, this function is used to gather + * more information on a specific node. It is called when a disco#info query + * arrives with a node attribute that matches the one registered for this handler. + * @param from The sender of the request. + * @param node The node this handler is supposed to handle. + * @return A list of identities for the given node. The caller will own the identities. + */ + virtual Disco::IdentityList handleDiscoNodeIdentities( const JID& from, + const std::string& node ) = 0; + + /** + * This function is used to gather more information on a specific node. + * It is called when a disco#items query arrives with a node attribute that + * matches the one registered for this handler. If node is empty, items for the + * root node (no node) shall be returned. + * @param from The sender of the request. + * @param to The receiving JID (useful for transports). + * @param node The node this handler is supposed to handle. + * @return A list of items supported by this node. + */ + virtual Disco::ItemList handleDiscoNodeItems( const JID& from, const JID& to, + const std::string& node = EmptyString ) = 0; + + }; + +} + +#endif // DISCONODEHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/dns.cpp b/smack/smack/src/main/cpp/gloox/src/dns.cpp new file mode 100644 index 00000000..35135247 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dns.cpp @@ -0,0 +1,494 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "config.h" + +#include "gloox.h" +#include "dns.h" +#include "util.h" + +#ifndef _WIN32_WCE +# include +#endif + +#include + +#if ( !defined( _WIN32 ) && !defined( _WIN32_WCE ) ) || defined( __SYMBIAN32__ ) +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# include +#elif defined( _WIN32_WCE ) +# include +#endif + +#ifdef HAVE_WINDNS_H +# include +#endif + +#define SRV_COST (RRFIXEDSZ+0) +#define SRV_WEIGHT (RRFIXEDSZ+2) +#define SRV_PORT (RRFIXEDSZ+4) +#define SRV_SERVER (RRFIXEDSZ+6) +#define SRV_FIXEDSZ (RRFIXEDSZ+6) + +#ifndef T_SRV +# define T_SRV 33 +#endif + +// mingw +#ifndef DNS_TYPE_SRV +# define DNS_TYPE_SRV 33 +#endif + +#ifndef NS_CMPRSFLGS +# define NS_CMPRSFLGS 0xc0 +#endif + +#ifndef C_IN +# define C_IN 1 +#endif + +#ifndef INVALID_SOCKET +# define INVALID_SOCKET -1 +#endif + +#define XMPP_PORT 5222 + +namespace gloox +{ + +#if defined( HAVE_RES_QUERYDOMAIN ) && defined( HAVE_DN_SKIPNAME ) && defined( HAVE_RES_QUERY ) + DNS::HostMap DNS::resolve( const std::string& service, const std::string& proto, + const std::string& domain, const LogSink& logInstance ) + { + buffer srvbuf; + bool error = false; + + const std::string dname = "_" + service + "._" + proto; + + if( !domain.empty() ) + srvbuf.len = res_querydomain( dname.c_str(), const_cast( domain.c_str() ), + C_IN, T_SRV, srvbuf.buf, NS_PACKETSZ ); + else + srvbuf.len = res_query( dname.c_str(), C_IN, T_SRV, srvbuf.buf, NS_PACKETSZ ); + + if( srvbuf.len < 0 ) + return defaultHostMap( domain, logInstance ); + + HEADER* hdr = (HEADER*)srvbuf.buf; + unsigned char* here = srvbuf.buf + NS_HFIXEDSZ; + + if( srvbuf.len < NS_HFIXEDSZ ) + error = true; + + if( hdr->rcode >= 1 && hdr->rcode <= 5 ) + error = true; + + if( ntohs( hdr->ancount ) == 0 ) + error = true; + + if( ntohs( hdr->ancount ) > NS_PACKETSZ ) + error = true; + + int cnt; + for( cnt = ntohs( hdr->qdcount ); cnt > 0; --cnt ) + { + int strlen = dn_skipname( here, srvbuf.buf + srvbuf.len ); + here += strlen + NS_QFIXEDSZ; + } + + unsigned char* srv[NS_PACKETSZ]; + int srvnum = 0; + for( cnt = ntohs( hdr->ancount ); cnt > 0; --cnt ) + { + int strlen = dn_skipname( here, srvbuf.buf + srvbuf.len ); + here += strlen; + srv[srvnum++] = here; + here += SRV_FIXEDSZ; + here += dn_skipname( here, srvbuf.buf + srvbuf.len ); + } + + if( error ) + { + return defaultHostMap( domain, logInstance ); + } + + // (q)sort here + + HostMap servers; + for( cnt = 0; cnt < srvnum; ++cnt ) + { + char srvname[NS_MAXDNAME]; + srvname[0] = '\0'; + + if( dn_expand( srvbuf.buf, srvbuf.buf + NS_PACKETSZ, + srv[cnt] + SRV_SERVER, srvname, NS_MAXDNAME ) < 0 + || !(*srvname) ) + continue; + + unsigned char* c = srv[cnt] + SRV_PORT; + servers.insert( std::make_pair( (char*)srvname, ntohs( c[1] << 8 | c[0] ) ) ); + } + + if( !servers.size() ) + return defaultHostMap( domain, logInstance ); + + return servers; + } + +#elif defined( _WIN32 ) && defined( HAVE_WINDNS_H ) && !defined( __MINGW32__ ) + DNS::HostMap DNS::resolve( const std::string& service, const std::string& proto, + const std::string& domain, const LogSink& logInstance ) + { + const std::string dname = "_" + service + "._" + proto + "." + domain; + bool error = false; + + DNS::HostMap servers; + DNS_RECORD* pRecord = NULL; + DNS_STATUS status = DnsQuery_UTF8( dname.c_str(), DNS_TYPE_SRV, DNS_QUERY_STANDARD, NULL, &pRecord, NULL ); + if( status == ERROR_SUCCESS ) + { + // NOTE: DnsQuery_UTF8 and DnsQuery_A really should have been defined with + // PDNS_RECORDA instead of PDNS_RECORD, since that's what it is (even with _UNICODE defined). + // We'll correct for that mistake with a cast. + DNS_RECORDA* pRec = (DNS_RECORDA*)pRecord; + do + { + if( pRec->wType == DNS_TYPE_SRV ) + { + servers[pRec->Data.SRV.pNameTarget] = pRec->Data.SRV.wPort; + } + pRec = pRec->pNext; + } + while( pRec != NULL ); + DnsRecordListFree( pRecord, DnsFreeRecordList ); + } + else + { + logInstance.warn( LogAreaClassDns, "DnsQuery_UTF8() failed: " + util::int2string( status ) ); + error = true; + } + + if( error || !servers.size() ) + { + servers = defaultHostMap( domain, logInstance ); + } + + return servers; + } + +#else + DNS::HostMap DNS::resolve( const std::string& /*service*/, const std::string& /*proto*/, + const std::string& domain, const LogSink& logInstance ) + { + logInstance.warn( LogAreaClassDns, "Notice: gloox does not support SRV " + "records on this platform. Using A records instead." ); + return defaultHostMap( domain, logInstance ); + } +#endif + + DNS::HostMap DNS::defaultHostMap( const std::string& domain, const LogSink& logInstance ) + { + HostMap server; + + logInstance.warn( LogAreaClassDns, "Notice: no SRV record found for " + + domain + ", using default port." ); + + if( !domain.empty() ) + server[domain] = XMPP_PORT; + + return server; + } + +#ifdef HAVE_GETADDRINFO + void DNS::resolve( struct addrinfo** res, const std::string& service, const std::string& proto, + const std::string& domain, const LogSink& logInstance ) + { + logInstance.dbg( LogAreaClassDns, "Resolving: _" + service + "._" + proto + "." + domain ); + struct addrinfo hints; + if( proto == "tcp" ) + hints.ai_socktype = SOCK_STREAM; + else if( proto == "udp" ) + hints.ai_socktype = SOCK_DGRAM; + else + { + logInstance.err( LogAreaClassDns, "Unknown/Invalid protocol: " + proto ); + } + memset( &hints, '\0', sizeof( hints ) ); + hints.ai_flags = AI_ADDRCONFIG | AI_CANONNAME; + hints.ai_socktype = SOCK_STREAM; + int e = getaddrinfo( domain.c_str(), service.c_str(), &hints, res ); + if( e ) + logInstance.err( LogAreaClassDns, "getaddrinfo() failed" ); + } + + int DNS::connect( const std::string& host, const LogSink& logInstance ) + { + struct addrinfo* results = 0; + + resolve( &results, host, logInstance ); + if( !results ) + { + logInstance.err( LogAreaClassDns, "host not found: " + host ); + return -ConnDnsError; + } + + struct addrinfo* runp = results; + while( runp ) + { + int fd = DNS::connect( runp, logInstance ); + if( fd >= 0 ) + return fd; + + runp = runp->ai_next; + } + + freeaddrinfo( results ); + + return -ConnConnectionRefused; + } + + int DNS::connect( struct addrinfo* res, const LogSink& logInstance ) + { + if( !res ) + return -1; + + int fd = getSocket( res->ai_family, res->ai_socktype, res->ai_protocol, logInstance ); + if( fd < 0 ) + return fd; + + if( ::connect( fd, res->ai_addr, res->ai_addrlen ) == 0 ) + { + char ip[NI_MAXHOST]; + char port[NI_MAXSERV]; + + if( getnameinfo( res->ai_addr, sizeof( sockaddr ), + ip, sizeof( ip ), + port, sizeof( port ), + NI_NUMERICHOST | NI_NUMERICSERV ) ) + { + //FIXME do we need to handle this? How? Can it actually happen at all? +// printf( "could not get numeric hostname"); + } + + if( res->ai_canonname ) + logInstance.dbg( LogAreaClassDns, std::string( "Connecting to " ).append( res->ai_canonname ).append( " (" ).append( ip ).append( "), port " ).append( port ) ); + else + logInstance.dbg( LogAreaClassDns, std::string( "Connecting to " ).append( ip ).append( ":" ).append( port ) ); + + return fd; + } + + std::string message = "connect() failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ) + ": " + strerror( errno ); +#endif + logInstance.dbg( LogAreaClassDns, message ); + + closeSocket( fd, logInstance ); + return -ConnConnectionRefused; + } + +#else + + int DNS::connect( const std::string& host, const LogSink& logInstance ) + { + HostMap hosts = resolve( host, logInstance ); + if( hosts.size() == 0 ) + return -ConnDnsError; + + HostMap::const_iterator it = hosts.begin(); + for( ; it != hosts.end(); ++it ) + { + int fd = DNS::connect( (*it).first, (*it).second, logInstance ); + if( fd >= 0 ) + return fd; + } + + return -ConnConnectionRefused; + } +#endif + + int DNS::getSocket( const LogSink& logInstance ) + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + WSADATA wsaData; + if( WSAStartup( MAKEWORD( 1, 1 ), &wsaData ) != 0 ) + { + logInstance.dbg( LogAreaClassDns, "WSAStartup() failed. WSAGetLastError: " + + util::int2string( ::WSAGetLastError() ) ); + return -ConnDnsError; + } +#endif + + int protocol = IPPROTO_TCP; +#if !defined( __APPLE__ ) // Sandboxing on Apple doesn't like you to use getprotobyname + struct protoent* prot; + if( ( prot = getprotobyname( "tcp" ) ) != 0 ) + { + protocol = prot->p_proto; + } + else + { + std::string message = "getprotobyname( \"tcp\" ) failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ) +#else + "errno: " + util::int2string( errno ) + ": " + strerror( errno ); +#endif + + ". Falling back to IPPROTO_TCP: " + util::int2string( IPPROTO_TCP ); + logInstance.dbg( LogAreaClassDns, message ); + + // Do not return an error. We'll fall back to IPPROTO_TCP. + } +#endif // !defined( __APPLE__ ) + + return getSocket( PF_INET, SOCK_STREAM, protocol, logInstance ); + } + + int DNS::getSocket( int af, int socktype, int proto, const LogSink& logInstance ) + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + SOCKET fd; +#else + int fd; +#endif + if( ( fd = socket( af, socktype, proto ) ) == INVALID_SOCKET ) + { + std::string message = "getSocket( " + + util::int2string( af ) + ", " + + util::int2string( socktype ) + ", " + + util::int2string( proto ) + + " ) failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ) + ": " + strerror( errno ); +#endif + logInstance.dbg( LogAreaClassDns, message ); + + cleanup( logInstance ); + return -ConnConnectionRefused; + } + +#ifdef HAVE_SETSOCKOPT + int timeout = 5000; + int reuseaddr = 1; + setsockopt( fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof( timeout ) ); + setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, (char*)&reuseaddr, sizeof( reuseaddr ) ); +#endif + + return (int)fd; + } + + int DNS::connect( const std::string& host, int port, const LogSink& logInstance ) + { + int fd = getSocket( logInstance ); + if( fd < 0 ) + return fd; + + struct hostent* h; + if( ( h = gethostbyname( host.c_str() ) ) == 0 ) + { + logInstance.dbg( LogAreaClassDns, "gethostbyname() failed for " + host + "." ); + cleanup( logInstance ); + closeSocket( fd, logInstance ); + return -ConnDnsError; + } + + struct sockaddr_in target; + target.sin_family = AF_INET; + target.sin_port = htons( static_cast( port ) ); + + if( h->h_length != sizeof( struct in_addr ) ) + { + logInstance.dbg( LogAreaClassDns, "gethostbyname() returned unexpected structure." ); + cleanup( logInstance ); + closeSocket( fd, logInstance ); + return -ConnDnsError; + } + else + { + memcpy( &target.sin_addr, h->h_addr, sizeof( struct in_addr ) ); + } + + logInstance.dbg( LogAreaClassDns, "Connecting to " + host + + " (" + inet_ntoa( target.sin_addr ) + ":" + util::int2string( port ) + ")" ); + + memset( target.sin_zero, '\0', 8 ); + if( ::connect( fd, (struct sockaddr *)&target, sizeof( struct sockaddr ) ) == 0 ) + { + logInstance.dbg( LogAreaClassDns, "Connected to " + host + " (" + + inet_ntoa( target.sin_addr ) + ":" + util::int2string( port ) + ")" ); + return fd; + } + + std::string message = "Connection to " + host + " (" + + inet_ntoa( target.sin_addr ) + ":" + util::int2string( port ) + ") failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ) + ": " + strerror( errno ); +#endif + logInstance.dbg( LogAreaClassDns, message ); + + closeSocket( fd, logInstance ); + return -ConnConnectionRefused; + } + + void DNS::closeSocket( int fd, const LogSink& logInstance ) + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + int result = closesocket( fd ); +#else + int result = close( fd ); +#endif + + if( result != 0 ) + { + std::string message = "closeSocket() failed. " +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + "WSAGetLastError: " + util::int2string( ::WSAGetLastError() ); +#else + "errno: " + util::int2string( errno ) + ": " + strerror( errno ); +#endif + logInstance.dbg( LogAreaClassDns, message ); + } + } + + void DNS::cleanup( const LogSink& logInstance ) + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + if( WSACleanup() != 0 ) + { + logInstance.dbg( LogAreaClassDns, "WSACleanup() failed. WSAGetLastError: " + + util::int2string( ::WSAGetLastError() ) ); + } +#else + (void)logInstance; +#endif + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/dns.h b/smack/smack/src/main/cpp/gloox/src/dns.h new file mode 100644 index 00000000..37ac547d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/dns.h @@ -0,0 +1,179 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef DNS_H__ +#define DNS_H__ + +#include "macros.h" +#include "logsink.h" + +#ifdef __MINGW32__ +# include +# include +#endif + +#ifdef HAVE_ARPA_NAMESER_H +# include +#endif + +#ifdef __APPLE__ +# include +#endif + +#ifndef NS_MAXDNAME +# define NS_MAXDNAME 1025 +#endif + +#ifndef NS_PACKETSZ +# define NS_PACKETSZ 512 +#endif + +#ifdef HAVE_GETADDRINFO +# include +# include +# include +#endif + +#include +#include + +namespace gloox +{ + + /** + * @brief This class holds a number of static functions used for DNS related stuff. + * + * You should not need to use these functions directly. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API DNS + { + public: + + /** + * A list of strings (used for server addresses) and ints (used for port numbers). + */ + typedef std::map HostMap; + + /** + * This function resolves a service/protocol/domain tuple. + * @param service The SRV service type. + * @param proto The SRV protocol. + * @param domain The domain to search for SRV records. + * @param logInstance A LogSink to use for logging. + * @return A list of weighted hostname/port pairs from SRV records, or A records if no SRV + * records where found. + */ + static HostMap resolve( const std::string& service, const std::string& proto, + const std::string& domain, const LogSink& logInstance ); + + /** + * This is a convenience funtion which uses @ref resolve() to resolve SRV records + * for a given domain, using a service of @b xmpp-client and a proto of @b tcp. + * @param domain The domain to resolve SRV records for. + * @param logInstance A LogSink to use for logging. + * @return A list of weighted hostname/port pairs from SRV records, or A records if no SRV + * records where found. + */ + static HostMap resolve( const std::string& domain, const LogSink& logInstance ) + { return resolve( "xmpp-client", "tcp", domain, logInstance ); } + + /** + * This is a convenience function which uses @ref resolve() to get a list of hosts + * and connects to one of them. + * @param host The host to resolve SRV records for. + * @param logInstance A LogSink to use for logging. + * @return A file descriptor for the established connection. + */ + static int connect( const std::string& host, const LogSink& logInstance ); + + /** + * This is a convenience function which connects to the given host and port. No SRV + * records are resolved. Use this function for special setups. + * @param host The host/IP address to connect to. + * @param port A custom port to connect to. + * @param logInstance A LogSink to use for logging. + * @return A file descriptor for the established connection. + */ + static int connect( const std::string& host, int port, const LogSink& logInstance ); + + /** + * A convenience function that prepares and returnes a simple, unconnected TCP socket. + * @param logInstance A LogSink to use for logging. + * @return A TCP socket. + */ + static int getSocket( const LogSink& logInstance ); + + /** + * Closes the given socket. + * @param fd The socket to close. + * @param logInstance A LogSink to use for logging. + */ + static void closeSocket( int fd, const LogSink& logInstance ); + + private: +#ifdef HAVE_GETADDRINFO + /** + * Resolves the given service for the given domain and protocol, using the IPv6-ready + * getaddrinfo(). The result is put into the first parameter. + * @param res A pointer to a pointer holding the query results. + * @param service A service string to query for, e.g. xmpp-client. + * @param proto A protocol name. + * @param domain The domain to query for. + * @param logInstance A LogSink to use for logging. + */ + static void resolve( struct addrinfo** res, const std::string& service, const std::string& proto, + const std::string& domain, const LogSink& logInstance ); + + /** + * This is a convenience funtion which uses @ref resolve() to resolve SRV records + * for a given domain, using a service of @b xmpp-client and a proto of @b tcp. + * @param res A pointer to a pointer holding the query results. + * @param domain The domain to resolve SRV records for. + * @param logInstance A LogSink to use for logging. + */ + static void resolve( struct addrinfo** res, const std::string& domain, const LogSink& logInstance ) + { resolve( res, "xmpp-client", "tcp", domain, logInstance ); } + + /** + * Tries to connect to the host/address contained in the addrinfo structure. + * @param res The connection parameters. + * @param logInstance A LogSink to use for logging. + * @return A file descriptor for the established connection. + */ + static int connect( struct addrinfo* res, const LogSink& logInstance ); +#endif + + /** + * This function prepares and returns a socket with the given parameters. + * @param af The address family. E.g. PF_INET. + * @param socktype The socket type. E.g. SOCK_STREAM. + * @param proto The protocol number. E.g. 6 (TCP). + */ + static int getSocket( int af, int socktype, int proto, const LogSink& logInstance ); + + static HostMap defaultHostMap( const std::string& domain, const LogSink& logInstance ); + static void cleanup( const LogSink& logInstance ); + + struct buffer + { + unsigned char buf[NS_PACKETSZ]; + int len; + }; + }; + +} + +#endif // DNS_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/error.cpp b/smack/smack/src/main/cpp/gloox/src/error.cpp new file mode 100644 index 00000000..8a80f3a5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/error.cpp @@ -0,0 +1,138 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "error.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + /* Error type values */ + static const char* errValues [] = { + "auth", + "cancel", + "continue", + "modify", + "wait" + }; + + /* Stanza error values */ + static const char* stanzaErrValues [] = { + "bad-request", + "conflict", + "feature-not-implemented", + "forbidden", + "gone", + "internal-server-error", + "item-not-found", + "jid-malformed", + "not-acceptable", + "not-allowed", + "not-authorized", + "not-modified", + "payment-required", + "recipient-unavailable", + "redirect", + "registration-required", + "remote-server-not-found", + "remote-server-timeout", + "resource-constraint", + "service-unavailable", + "subscription-required", + "undefined-condition", + "unexpected-request", + "unknown-sender" + }; + + static inline StanzaErrorType stanzaErrorType( const std::string& type ) + { + return (StanzaErrorType)util::lookup( type, errValues ); + } + + static inline StanzaError stanzaError( const std::string& type ) + { + return (StanzaError)util::lookup( type, stanzaErrValues ); + } + + Error::Error( const Tag* tag ) + : StanzaExtension( ExtError ), + m_error( StanzaErrorUndefined ), m_appError( 0 ) + { + if( !tag || tag->name() != "error" ) + return; + + m_type = stanzaErrorType( tag->findAttribute( TYPE ) ); + + TagList::const_iterator it = tag->children().begin(); + for( ; it != tag->children().end(); ++it ) + { + StanzaError srt = gloox::stanzaError( (*it)->name() ); + if( srt != StanzaErrorUndefined ) + m_error = srt; + else if( (*it)->name() == "text" ) + m_text[(*it)->findAttribute("xml:lang")] = (*it)->cdata(); + else + m_appError = (*it)->clone(); + } + } + + Error::Error( const Error& error ) + : StanzaExtension( ExtError ), m_type( error.m_type ), + m_error( error.m_error ), m_appError( error.m_appError ? m_appError->clone() : 0 ) + {} + + Error::~Error() + { + delete m_appError; + } + + const std::string& Error::filterString() const + { + static const std::string filter = "/iq/error" + "|/message/error" + "|/presence/error" + "|/subscription/error"; + return filter; + } + + + Tag* Error::tag() const + { + if( m_type == StanzaErrorTypeUndefined || m_error == StanzaErrorUndefined ) + return 0; + + Tag* error = new Tag( "error", TYPE, util::lookup( m_type, errValues ) ); + new Tag( error, util::lookup( m_error, stanzaErrValues ), XMLNS, XMLNS_XMPP_STANZAS ); + + StringMap::const_iterator it = m_text.begin(); + for( ; it != m_text.end(); ++it ) + { + Tag* txt = new Tag( error, "text" ); + txt->setXmlns( XMLNS_XMPP_STANZAS ); + txt->addAttribute( "xml:lang", (*it).first ); + txt->setCData( (*it).second ); + } + + if( m_appError ) + error->addChild( m_appError->clone() ); + + return error; + } + + const std::string& Error::text( const std::string& lang ) const + { + StringMap::const_iterator it = m_text.find( lang ); + return it != m_text.end() ? (*it).second : EmptyString; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/error.h b/smack/smack/src/main/cpp/gloox/src/error.h new file mode 100644 index 00000000..2541fcbf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/error.h @@ -0,0 +1,139 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef ERROR_H__ +#define ERROR_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief A stanza error abstraction implemented as a StanzaExtension. + * + * @author Vincent Thomasset + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Error : public StanzaExtension + { + public: + +// Error() +// : StanzaExtension( ExtError ), m_type( StanzaErrorTypeUndefined ), +// m_error( StanzaErrorUndefined ), m_appError( 0 ) +// {} + + /** + * Creates a new Error object from the given Tag. + * @param tag The Tag to parse. + */ + Error( const Tag* tag = 0 ); + + /** + * Creates a new Error object. + * @param type The error type. + * @param error The actual stanza error. + * @param appError An optional application-specific error. + */ + Error( StanzaErrorType type, StanzaError error, Tag* appError = 0 ) + : StanzaExtension( ExtError ), m_type( type ), + m_error( error ), m_appError( appError ) + {} + + /** + * Virtual destructor. + */ + virtual ~Error(); + + /** + * Returns the error type. + * @return The error type. + */ + StanzaErrorType type() const { return m_type; } + + /** + * Return the stanza error. + * @return The actual error. + */ + StanzaError error() const { return m_error; } + + /** + * This function can be used to retrieve the application-specific error + * condition of a stanza error. + * @return The application-specific error element of a stanza error. + * 0 if no respective element was found or no error occured. + */ + const Tag* appError() const { return m_appError; } + + /** + * Returns the text of a error stanza for the given language if available. + * If the requested language is not available, the default text (without + * a xml:lang attribute) will be returned. + * @param lang The language identifier for the desired language. It must + * conform to section 2.12 of the XML specification and RFC 3066. If + * empty, the default text will be returned, if any. + * @return The text of an error stanza. + */ + const std::string& text( const std::string& lang = EmptyString ) const; + + /** + * Sets the text of a error stanza for the given language. + * @param text The error text to set. + * @param lang The language identifier for the desired language. It must + * conform to section 2.12 of the XML specification and RFC 3066. If + * empty, the default text will be set. + */ + void setText( const std::string& text, const std::string& lang = EmptyString ) + { + m_text[lang] = text; + } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Error( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Error( *this ); + } + + private: + Error( const Error& error ); + + void setValues( const Tag* tag ); + + StanzaErrorType m_type; + StanzaError m_error; + Tag* m_appError; + StringMap m_text; + }; + +} + +#endif /* ERROR_H__ */ diff --git a/smack/smack/src/main/cpp/gloox/src/event.h b/smack/smack/src/main/cpp/gloox/src/event.h new file mode 100644 index 00000000..d96e9162 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/event.h @@ -0,0 +1,81 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef EVENT_H__ +#define EVENT_H__ + +namespace gloox +{ + + class Stanza; + + /** + * @brief A base class for events. + * + * @author Jakob Schröter + * @since 1.0 + */ + class Event + { + + public: + /** + * Event types. + */ + enum EventType + { + PingPing, /**< Incoming Ping (@xep{0199}). */ + PingPong, /**< Incoming Pong (@xep{0199}). */ + PingError /**< Incoming Error Pong (@xep{0199}). */ + }; + + /** + * Creates a new Event of the given type. + * @param type The Event type. + */ + Event( EventType type ) : m_eventType( type ), m_stanza( 0 ) {} + + /** + * Creates a new Event of the given type, referencing the given Stanza. + * @param type The Event type. + * @param stanza A Stanza to point at. No copy of the Stanza is taken, just its address. + */ + Event( EventType type, const Stanza& stanza ) : m_eventType( type ), m_stanza( &stanza ) {} + + /** + * Virtual Destructor. + */ + virtual ~Event() {} + + /** + * Returns the Event's type. + * @return The Event's type. + */ + EventType eventType() const { return m_eventType; } + + /** + * Returns a pointer to a Stanza-derived object. + * @return A pointer to a Stanza that caused the event. May be 0. + * @note You should @b not delete the Stanza object. + */ + const Stanza* stanza() const { return m_stanza; } + + protected: + EventType m_eventType; + const Stanza* m_stanza; + + }; + +} + +#endif // EVENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/eventdispatcher.cpp b/smack/smack/src/main/cpp/gloox/src/eventdispatcher.cpp new file mode 100644 index 00000000..c2cec64c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/eventdispatcher.cpp @@ -0,0 +1,73 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "eventdispatcher.h" +#include "eventhandler.h" + +namespace gloox +{ + + EventDispatcher::EventDispatcher() + { + } + + EventDispatcher::~EventDispatcher() + { + } + + void EventDispatcher::dispatch( const Event& event, const std::string& context, bool remove ) + { + typedef ContextHandlerMap::iterator Ei; + std::pair g = m_contextHandlers.equal_range( context ); + Ei it = g.first; + Ei it2; + while( it != g.second ) + { + it2 = it++; + (*it2).second->handleEvent( event ); + if( remove ) + m_contextHandlers.erase( it2 ); + } + } + + void EventDispatcher::dispatch( const Event& event ) + { + TypeHandlerMap::iterator it = m_typeHandlers.begin(); + for( ; it != m_typeHandlers.end(); ++it ) + { + if( (*it).first == event.eventType() ) + (*it).second->handleEvent( event ); + } + } + + void EventDispatcher::registerEventHandler( EventHandler* eh, const std::string& context ) + { + if( !eh || context.empty() ) + return; + + m_contextHandlers.insert( std::make_pair( context, eh ) ); + } + + void EventDispatcher::removeEventHandler( EventHandler* eh ) + { + ContextHandlerMap::iterator it = m_contextHandlers.begin(); + ContextHandlerMap::iterator it2; + while( it != m_contextHandlers.end() ) + { + it2 = it++; + if( (*it2).second == eh ) + m_contextHandlers.erase( it2 ); + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/eventdispatcher.h b/smack/smack/src/main/cpp/gloox/src/eventdispatcher.h new file mode 100644 index 00000000..12a1ca86 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/eventdispatcher.h @@ -0,0 +1,88 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef EVENTDISPATCHER_H__ +#define EVENTDISPATCHER_H__ + +#include "event.h" + +#include +#include + +namespace gloox +{ + + class EventHandler; + + /** + * @brief An Event dispatcher. + * + * @author Jakob Schröter + * @since 1.0 + */ + class EventDispatcher + { + + public: + /** + * Creates a new EventDispatcher object. You should not need to use this class directly. + */ + EventDispatcher(); + + /** + * Virtual Destructor. + */ + virtual ~EventDispatcher(); + + /** + * Looks for handlers for the given Event, and removes the handlers if requested. + * @param event The Event to dispatch. + * @param context An identifier that limits the EventHandlers that will get notified to + * those that are specifically interested in this context. + * @param remove Whether or not to remove the context from the list of known contexts. Useful for + * IQ IDs. + */ + void dispatch( const Event& event, const std::string& context, bool remove ); + + /** + * Looks for handlers for the given Event, identified by its type. + * @param event The event to dispatch. + */ + void dispatch( const Event& event ); + + /** + * Registers the given EventHandler to be notified about Events with the given context. + * The context will usually be an IQ ID. + * @param eh The EventHandler to register. + * @param context The context to register the EventHandler for. + */ + void registerEventHandler( EventHandler* eh, const std::string& context ); + + /** + * Removes the given EventHandler. + * @param eh The EventHandler to remove. + */ + void removeEventHandler( EventHandler* eh ); + + private: + typedef std::multimap ContextHandlerMap; + typedef std::multimap TypeHandlerMap; + + ContextHandlerMap m_contextHandlers; + TypeHandlerMap m_typeHandlers; + + }; + +} + +#endif // EVENTDISPATCHER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/eventhandler.h b/smack/smack/src/main/cpp/gloox/src/eventhandler.h new file mode 100644 index 00000000..ebdafa9d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/eventhandler.h @@ -0,0 +1,47 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef EVENTHANDLER_H__ +#define EVENTHANDLER_H__ + +namespace gloox +{ + + class Event; + + /** + * @brief An base class for event handlers. + * + * @author Jakob Schröter + * @since 1.0 + */ + class EventHandler + { + + public: + /** + * Virtual Destructor. + */ + virtual ~EventHandler() {} + + /** + * This function gets called for Events this handler was registered for. + * @param event The Event. + */ + virtual void handleEvent( const Event& event ) = 0; + + }; + +} + +#endif // EVENTHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/examples/Makefile.am b/smack/smack/src/main/cpp/gloox/src/examples/Makefile.am new file mode 100644 index 00000000..34038358 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/Makefile.am @@ -0,0 +1,100 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare \ + -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef \ + -Wcast-qual -Wno-long-long -DGLOOX_IMPORTS + +noinst_PROGRAMS = register_example disco_example adhoc_example roster_example privatexml_example component_example \ + bookmarkstorage_example annotations_example privacylist_example message_example flexoff_example \ + vcard_example reset_example muc_example e2ee_client e2ee_server ft_recv ft_send \ + pubsub_example bosh_example linklocal_example reconnect_example + +register_example_SOURCES = register_example.cpp +register_example_LDADD = ../libgloox.la $(LDFLAGS) +register_example_CFLAGS = $(CPPFLAGS) + +disco_example_SOURCES = disco_example.cpp +disco_example_LDADD = ../libgloox.la $(LDFLAGS) +disco_example_CFLAGS = $(CPPFLAGS) + +adhoc_example_SOURCES = adhoc_example.cpp +adhoc_example_LDADD = ../libgloox.la $(LDFLAGS) +adhoc_example_CFLAGS = $(CPPFLAGS) + +roster_example_SOURCES = roster_example.cpp +roster_example_LDADD = ../libgloox.la $(LDFLAGS) +roster_example_CFLAGS = $(CPPFLAGS) + +privatexml_example_SOURCES = privatexml_example.cpp +privatexml_example_LDADD = ../libgloox.la $(LDFLAGS) +privatexml_example_CFLAGS = $(CPPFLAGS) + +component_example_SOURCES = component_example.cpp +component_example_LDADD = ../libgloox.la $(LDFLAGS) +component_example_CFLAGS = $(CPPFLAGS) + +bookmarkstorage_example_SOURCES = bookmarkstorage_example.cpp +bookmarkstorage_example_LDADD = ../libgloox.la $(LDFLAGS) +bookmarkstorage_example_CFLAGS = $(CPPFLAGS) + +annotations_example_SOURCES = annotations_example.cpp +annotations_example_LDADD = ../libgloox.la $(LDFLAGS) +annotations_example_CFLAGS = $(CPPFLAGS) + +privacylist_example_SOURCES = privacylist_example.cpp +privacylist_example_LDADD = ../libgloox.la $(LDFLAGS) +privacylist_example_CFLAGS = $(CPPFLAGS) + +message_example_SOURCES = message_example.cpp +message_example_LDADD = ../libgloox.la $(LDFLAGS) +message_example_CFLAGS = $(CPPFLAGS) + +flexoff_example_SOURCES = flexoff_example.cpp +flexoff_example_LDADD = ../libgloox.la $(LDFLAGS) +flexoff_example_CFLAGS = $(CPPFLAGS) + +vcard_example_SOURCES = vcard_example.cpp +vcard_example_LDADD = ../libgloox.la $(LDFLAGS) +vcard_example_CFLAGS = $(CPPFLAGS) + +reset_example_SOURCES = reset_example.cpp +reset_example_LDADD = ../libgloox.la $(LDFLAGS) +reset_example_CFLAGS = $(CPPFLAGS) + +muc_example_SOURCES = muc_example.cpp +muc_example_LDADD = ../libgloox.la $(LDFLAGS) +muc_example_CFLAGS = $(CPPFLAGS) + +e2ee_client_SOURCES = e2ee_client.cpp +e2ee_client_LDADD = ../libgloox.la $(LDFLAGS) +e2ee_client_CFLAGS = $(CPPFLAGS) + +e2ee_server_SOURCES = e2ee_server.cpp +e2ee_server_LDADD = ../libgloox.la $(LDFLAGS) +e2ee_server_CFLAGS = $(CPPFLAGS) + +ft_recv_SOURCES = ft_recv.cpp +ft_recv_LDADD = ../libgloox.la $(LDFLAGS) +ft_recv_CFLAGS = $(CPPFLAGS) + +ft_send_SOURCES = ft_send.cpp +ft_send_LDADD = ../libgloox.la $(LDFLAGS) +ft_send_CFLAGS = $(CPPFLAGS) + +pubsub_example_SOURCES = pubsub_example.cpp +pubsub_example_LDADD = ../libgloox.la $(LDFLAGS) +pubsub_example_CFLAGS = $(CPPFLAGS) + +bosh_example_SOURCES = bosh_example.cpp +bosh_example_LDADD = ../libgloox.la $(LDFLAGS) +bosh_example_CFLAGS = $(CPPFLAGS) + +linklocal_example_SOURCES = linklocal_example.cpp +linklocal_example_LDADD = ../libgloox.la $(LDFLAGS) +linklocal_example_CFLAGS = $(CPPFLAGS) + +reconnect_example_SOURCES = reconnect_example.cpp +reconnect_example_LDADD = ../libgloox.la $(LDFLAGS) +reconnect_example_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/examples/Makefile.in b/smack/smack/src/main/cpp/gloox/src/examples/Makefile.in new file mode 100644 index 00000000..ecfdb057 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/Makefile.in @@ -0,0 +1,764 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = register_example$(EXEEXT) disco_example$(EXEEXT) \ + adhoc_example$(EXEEXT) roster_example$(EXEEXT) \ + privatexml_example$(EXEEXT) component_example$(EXEEXT) \ + bookmarkstorage_example$(EXEEXT) annotations_example$(EXEEXT) \ + privacylist_example$(EXEEXT) message_example$(EXEEXT) \ + flexoff_example$(EXEEXT) vcard_example$(EXEEXT) \ + reset_example$(EXEEXT) muc_example$(EXEEXT) \ + e2ee_client$(EXEEXT) e2ee_server$(EXEEXT) ft_recv$(EXEEXT) \ + ft_send$(EXEEXT) pubsub_example$(EXEEXT) bosh_example$(EXEEXT) \ + linklocal_example$(EXEEXT) reconnect_example$(EXEEXT) +subdir = src/examples +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_adhoc_example_OBJECTS = adhoc_example.$(OBJEXT) +adhoc_example_OBJECTS = $(am_adhoc_example_OBJECTS) +am__DEPENDENCIES_1 = +adhoc_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_annotations_example_OBJECTS = annotations_example.$(OBJEXT) +annotations_example_OBJECTS = $(am_annotations_example_OBJECTS) +annotations_example_DEPENDENCIES = ../libgloox.la \ + $(am__DEPENDENCIES_1) +am_bookmarkstorage_example_OBJECTS = \ + bookmarkstorage_example.$(OBJEXT) +bookmarkstorage_example_OBJECTS = \ + $(am_bookmarkstorage_example_OBJECTS) +bookmarkstorage_example_DEPENDENCIES = ../libgloox.la \ + $(am__DEPENDENCIES_1) +am_bosh_example_OBJECTS = bosh_example.$(OBJEXT) +bosh_example_OBJECTS = $(am_bosh_example_OBJECTS) +bosh_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_component_example_OBJECTS = component_example.$(OBJEXT) +component_example_OBJECTS = $(am_component_example_OBJECTS) +component_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_disco_example_OBJECTS = disco_example.$(OBJEXT) +disco_example_OBJECTS = $(am_disco_example_OBJECTS) +disco_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_e2ee_client_OBJECTS = e2ee_client.$(OBJEXT) +e2ee_client_OBJECTS = $(am_e2ee_client_OBJECTS) +e2ee_client_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_e2ee_server_OBJECTS = e2ee_server.$(OBJEXT) +e2ee_server_OBJECTS = $(am_e2ee_server_OBJECTS) +e2ee_server_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_flexoff_example_OBJECTS = flexoff_example.$(OBJEXT) +flexoff_example_OBJECTS = $(am_flexoff_example_OBJECTS) +flexoff_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_ft_recv_OBJECTS = ft_recv.$(OBJEXT) +ft_recv_OBJECTS = $(am_ft_recv_OBJECTS) +ft_recv_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_ft_send_OBJECTS = ft_send.$(OBJEXT) +ft_send_OBJECTS = $(am_ft_send_OBJECTS) +ft_send_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_linklocal_example_OBJECTS = linklocal_example.$(OBJEXT) +linklocal_example_OBJECTS = $(am_linklocal_example_OBJECTS) +linklocal_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_message_example_OBJECTS = message_example.$(OBJEXT) +message_example_OBJECTS = $(am_message_example_OBJECTS) +message_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_muc_example_OBJECTS = muc_example.$(OBJEXT) +muc_example_OBJECTS = $(am_muc_example_OBJECTS) +muc_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_privacylist_example_OBJECTS = privacylist_example.$(OBJEXT) +privacylist_example_OBJECTS = $(am_privacylist_example_OBJECTS) +privacylist_example_DEPENDENCIES = ../libgloox.la \ + $(am__DEPENDENCIES_1) +am_privatexml_example_OBJECTS = privatexml_example.$(OBJEXT) +privatexml_example_OBJECTS = $(am_privatexml_example_OBJECTS) +privatexml_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_pubsub_example_OBJECTS = pubsub_example.$(OBJEXT) +pubsub_example_OBJECTS = $(am_pubsub_example_OBJECTS) +pubsub_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_reconnect_example_OBJECTS = reconnect_example.$(OBJEXT) +reconnect_example_OBJECTS = $(am_reconnect_example_OBJECTS) +reconnect_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_register_example_OBJECTS = register_example.$(OBJEXT) +register_example_OBJECTS = $(am_register_example_OBJECTS) +register_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_reset_example_OBJECTS = reset_example.$(OBJEXT) +reset_example_OBJECTS = $(am_reset_example_OBJECTS) +reset_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_roster_example_OBJECTS = roster_example.$(OBJEXT) +roster_example_OBJECTS = $(am_roster_example_OBJECTS) +roster_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +am_vcard_example_OBJECTS = vcard_example.$(OBJEXT) +vcard_example_OBJECTS = $(am_vcard_example_OBJECTS) +vcard_example_DEPENDENCIES = ../libgloox.la $(am__DEPENDENCIES_1) +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(adhoc_example_SOURCES) $(annotations_example_SOURCES) \ + $(bookmarkstorage_example_SOURCES) $(bosh_example_SOURCES) \ + $(component_example_SOURCES) $(disco_example_SOURCES) \ + $(e2ee_client_SOURCES) $(e2ee_server_SOURCES) \ + $(flexoff_example_SOURCES) $(ft_recv_SOURCES) \ + $(ft_send_SOURCES) $(linklocal_example_SOURCES) \ + $(message_example_SOURCES) $(muc_example_SOURCES) \ + $(privacylist_example_SOURCES) $(privatexml_example_SOURCES) \ + $(pubsub_example_SOURCES) $(reconnect_example_SOURCES) \ + $(register_example_SOURCES) $(reset_example_SOURCES) \ + $(roster_example_SOURCES) $(vcard_example_SOURCES) +DIST_SOURCES = $(adhoc_example_SOURCES) $(annotations_example_SOURCES) \ + $(bookmarkstorage_example_SOURCES) $(bosh_example_SOURCES) \ + $(component_example_SOURCES) $(disco_example_SOURCES) \ + $(e2ee_client_SOURCES) $(e2ee_server_SOURCES) \ + $(flexoff_example_SOURCES) $(ft_recv_SOURCES) \ + $(ft_send_SOURCES) $(linklocal_example_SOURCES) \ + $(message_example_SOURCES) $(muc_example_SOURCES) \ + $(privacylist_example_SOURCES) $(privatexml_example_SOURCES) \ + $(pubsub_example_SOURCES) $(reconnect_example_SOURCES) \ + $(register_example_SOURCES) $(reset_example_SOURCES) \ + $(roster_example_SOURCES) $(vcard_example_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare \ + -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef \ + -Wcast-qual -Wno-long-long -DGLOOX_IMPORTS + +register_example_SOURCES = register_example.cpp +register_example_LDADD = ../libgloox.la $(LDFLAGS) +register_example_CFLAGS = $(CPPFLAGS) +disco_example_SOURCES = disco_example.cpp +disco_example_LDADD = ../libgloox.la $(LDFLAGS) +disco_example_CFLAGS = $(CPPFLAGS) +adhoc_example_SOURCES = adhoc_example.cpp +adhoc_example_LDADD = ../libgloox.la $(LDFLAGS) +adhoc_example_CFLAGS = $(CPPFLAGS) +roster_example_SOURCES = roster_example.cpp +roster_example_LDADD = ../libgloox.la $(LDFLAGS) +roster_example_CFLAGS = $(CPPFLAGS) +privatexml_example_SOURCES = privatexml_example.cpp +privatexml_example_LDADD = ../libgloox.la $(LDFLAGS) +privatexml_example_CFLAGS = $(CPPFLAGS) +component_example_SOURCES = component_example.cpp +component_example_LDADD = ../libgloox.la $(LDFLAGS) +component_example_CFLAGS = $(CPPFLAGS) +bookmarkstorage_example_SOURCES = bookmarkstorage_example.cpp +bookmarkstorage_example_LDADD = ../libgloox.la $(LDFLAGS) +bookmarkstorage_example_CFLAGS = $(CPPFLAGS) +annotations_example_SOURCES = annotations_example.cpp +annotations_example_LDADD = ../libgloox.la $(LDFLAGS) +annotations_example_CFLAGS = $(CPPFLAGS) +privacylist_example_SOURCES = privacylist_example.cpp +privacylist_example_LDADD = ../libgloox.la $(LDFLAGS) +privacylist_example_CFLAGS = $(CPPFLAGS) +message_example_SOURCES = message_example.cpp +message_example_LDADD = ../libgloox.la $(LDFLAGS) +message_example_CFLAGS = $(CPPFLAGS) +flexoff_example_SOURCES = flexoff_example.cpp +flexoff_example_LDADD = ../libgloox.la $(LDFLAGS) +flexoff_example_CFLAGS = $(CPPFLAGS) +vcard_example_SOURCES = vcard_example.cpp +vcard_example_LDADD = ../libgloox.la $(LDFLAGS) +vcard_example_CFLAGS = $(CPPFLAGS) +reset_example_SOURCES = reset_example.cpp +reset_example_LDADD = ../libgloox.la $(LDFLAGS) +reset_example_CFLAGS = $(CPPFLAGS) +muc_example_SOURCES = muc_example.cpp +muc_example_LDADD = ../libgloox.la $(LDFLAGS) +muc_example_CFLAGS = $(CPPFLAGS) +e2ee_client_SOURCES = e2ee_client.cpp +e2ee_client_LDADD = ../libgloox.la $(LDFLAGS) +e2ee_client_CFLAGS = $(CPPFLAGS) +e2ee_server_SOURCES = e2ee_server.cpp +e2ee_server_LDADD = ../libgloox.la $(LDFLAGS) +e2ee_server_CFLAGS = $(CPPFLAGS) +ft_recv_SOURCES = ft_recv.cpp +ft_recv_LDADD = ../libgloox.la $(LDFLAGS) +ft_recv_CFLAGS = $(CPPFLAGS) +ft_send_SOURCES = ft_send.cpp +ft_send_LDADD = ../libgloox.la $(LDFLAGS) +ft_send_CFLAGS = $(CPPFLAGS) +pubsub_example_SOURCES = pubsub_example.cpp +pubsub_example_LDADD = ../libgloox.la $(LDFLAGS) +pubsub_example_CFLAGS = $(CPPFLAGS) +bosh_example_SOURCES = bosh_example.cpp +bosh_example_LDADD = ../libgloox.la $(LDFLAGS) +bosh_example_CFLAGS = $(CPPFLAGS) +linklocal_example_SOURCES = linklocal_example.cpp +linklocal_example_LDADD = ../libgloox.la $(LDFLAGS) +linklocal_example_CFLAGS = $(CPPFLAGS) +reconnect_example_SOURCES = reconnect_example.cpp +reconnect_example_LDADD = ../libgloox.la $(LDFLAGS) +reconnect_example_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/examples/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/examples/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +adhoc_example$(EXEEXT): $(adhoc_example_OBJECTS) $(adhoc_example_DEPENDENCIES) $(EXTRA_adhoc_example_DEPENDENCIES) + @rm -f adhoc_example$(EXEEXT) + $(CXXLINK) $(adhoc_example_OBJECTS) $(adhoc_example_LDADD) $(LIBS) +annotations_example$(EXEEXT): $(annotations_example_OBJECTS) $(annotations_example_DEPENDENCIES) $(EXTRA_annotations_example_DEPENDENCIES) + @rm -f annotations_example$(EXEEXT) + $(CXXLINK) $(annotations_example_OBJECTS) $(annotations_example_LDADD) $(LIBS) +bookmarkstorage_example$(EXEEXT): $(bookmarkstorage_example_OBJECTS) $(bookmarkstorage_example_DEPENDENCIES) $(EXTRA_bookmarkstorage_example_DEPENDENCIES) + @rm -f bookmarkstorage_example$(EXEEXT) + $(CXXLINK) $(bookmarkstorage_example_OBJECTS) $(bookmarkstorage_example_LDADD) $(LIBS) +bosh_example$(EXEEXT): $(bosh_example_OBJECTS) $(bosh_example_DEPENDENCIES) $(EXTRA_bosh_example_DEPENDENCIES) + @rm -f bosh_example$(EXEEXT) + $(CXXLINK) $(bosh_example_OBJECTS) $(bosh_example_LDADD) $(LIBS) +component_example$(EXEEXT): $(component_example_OBJECTS) $(component_example_DEPENDENCIES) $(EXTRA_component_example_DEPENDENCIES) + @rm -f component_example$(EXEEXT) + $(CXXLINK) $(component_example_OBJECTS) $(component_example_LDADD) $(LIBS) +disco_example$(EXEEXT): $(disco_example_OBJECTS) $(disco_example_DEPENDENCIES) $(EXTRA_disco_example_DEPENDENCIES) + @rm -f disco_example$(EXEEXT) + $(CXXLINK) $(disco_example_OBJECTS) $(disco_example_LDADD) $(LIBS) +e2ee_client$(EXEEXT): $(e2ee_client_OBJECTS) $(e2ee_client_DEPENDENCIES) $(EXTRA_e2ee_client_DEPENDENCIES) + @rm -f e2ee_client$(EXEEXT) + $(CXXLINK) $(e2ee_client_OBJECTS) $(e2ee_client_LDADD) $(LIBS) +e2ee_server$(EXEEXT): $(e2ee_server_OBJECTS) $(e2ee_server_DEPENDENCIES) $(EXTRA_e2ee_server_DEPENDENCIES) + @rm -f e2ee_server$(EXEEXT) + $(CXXLINK) $(e2ee_server_OBJECTS) $(e2ee_server_LDADD) $(LIBS) +flexoff_example$(EXEEXT): $(flexoff_example_OBJECTS) $(flexoff_example_DEPENDENCIES) $(EXTRA_flexoff_example_DEPENDENCIES) + @rm -f flexoff_example$(EXEEXT) + $(CXXLINK) $(flexoff_example_OBJECTS) $(flexoff_example_LDADD) $(LIBS) +ft_recv$(EXEEXT): $(ft_recv_OBJECTS) $(ft_recv_DEPENDENCIES) $(EXTRA_ft_recv_DEPENDENCIES) + @rm -f ft_recv$(EXEEXT) + $(CXXLINK) $(ft_recv_OBJECTS) $(ft_recv_LDADD) $(LIBS) +ft_send$(EXEEXT): $(ft_send_OBJECTS) $(ft_send_DEPENDENCIES) $(EXTRA_ft_send_DEPENDENCIES) + @rm -f ft_send$(EXEEXT) + $(CXXLINK) $(ft_send_OBJECTS) $(ft_send_LDADD) $(LIBS) +linklocal_example$(EXEEXT): $(linklocal_example_OBJECTS) $(linklocal_example_DEPENDENCIES) $(EXTRA_linklocal_example_DEPENDENCIES) + @rm -f linklocal_example$(EXEEXT) + $(CXXLINK) $(linklocal_example_OBJECTS) $(linklocal_example_LDADD) $(LIBS) +message_example$(EXEEXT): $(message_example_OBJECTS) $(message_example_DEPENDENCIES) $(EXTRA_message_example_DEPENDENCIES) + @rm -f message_example$(EXEEXT) + $(CXXLINK) $(message_example_OBJECTS) $(message_example_LDADD) $(LIBS) +muc_example$(EXEEXT): $(muc_example_OBJECTS) $(muc_example_DEPENDENCIES) $(EXTRA_muc_example_DEPENDENCIES) + @rm -f muc_example$(EXEEXT) + $(CXXLINK) $(muc_example_OBJECTS) $(muc_example_LDADD) $(LIBS) +privacylist_example$(EXEEXT): $(privacylist_example_OBJECTS) $(privacylist_example_DEPENDENCIES) $(EXTRA_privacylist_example_DEPENDENCIES) + @rm -f privacylist_example$(EXEEXT) + $(CXXLINK) $(privacylist_example_OBJECTS) $(privacylist_example_LDADD) $(LIBS) +privatexml_example$(EXEEXT): $(privatexml_example_OBJECTS) $(privatexml_example_DEPENDENCIES) $(EXTRA_privatexml_example_DEPENDENCIES) + @rm -f privatexml_example$(EXEEXT) + $(CXXLINK) $(privatexml_example_OBJECTS) $(privatexml_example_LDADD) $(LIBS) +pubsub_example$(EXEEXT): $(pubsub_example_OBJECTS) $(pubsub_example_DEPENDENCIES) $(EXTRA_pubsub_example_DEPENDENCIES) + @rm -f pubsub_example$(EXEEXT) + $(CXXLINK) $(pubsub_example_OBJECTS) $(pubsub_example_LDADD) $(LIBS) +reconnect_example$(EXEEXT): $(reconnect_example_OBJECTS) $(reconnect_example_DEPENDENCIES) $(EXTRA_reconnect_example_DEPENDENCIES) + @rm -f reconnect_example$(EXEEXT) + $(CXXLINK) $(reconnect_example_OBJECTS) $(reconnect_example_LDADD) $(LIBS) +register_example$(EXEEXT): $(register_example_OBJECTS) $(register_example_DEPENDENCIES) $(EXTRA_register_example_DEPENDENCIES) + @rm -f register_example$(EXEEXT) + $(CXXLINK) $(register_example_OBJECTS) $(register_example_LDADD) $(LIBS) +reset_example$(EXEEXT): $(reset_example_OBJECTS) $(reset_example_DEPENDENCIES) $(EXTRA_reset_example_DEPENDENCIES) + @rm -f reset_example$(EXEEXT) + $(CXXLINK) $(reset_example_OBJECTS) $(reset_example_LDADD) $(LIBS) +roster_example$(EXEEXT): $(roster_example_OBJECTS) $(roster_example_DEPENDENCIES) $(EXTRA_roster_example_DEPENDENCIES) + @rm -f roster_example$(EXEEXT) + $(CXXLINK) $(roster_example_OBJECTS) $(roster_example_LDADD) $(LIBS) +vcard_example$(EXEEXT): $(vcard_example_OBJECTS) $(vcard_example_DEPENDENCIES) $(EXTRA_vcard_example_DEPENDENCIES) + @rm -f vcard_example$(EXEEXT) + $(CXXLINK) $(vcard_example_OBJECTS) $(vcard_example_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adhoc_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/annotations_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bookmarkstorage_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bosh_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/component_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disco_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e2ee_client.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e2ee_server.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flexoff_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ft_recv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ft_send.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/linklocal_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muc_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privacylist_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privatexml_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubsub_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reconnect_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/register_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reset_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/roster_example.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcard_example.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/examples/adhoc_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/adhoc_example.cpp new file mode 100644 index 00000000..036fe21c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/adhoc_example.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../adhoccommandprovider.h" +#include "../disco.h" +#include "../adhoc.h" +#include "../tag.h" +#include "../loghandler.h" +#include "../logsink.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + + +class AdhocTest : public ConnectionListener, AdhocCommandProvider, LogHandler +{ + public: + AdhocTest() {} + virtual ~AdhocTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->disableRoster(); + j->registerConnectionListener( this ); + j->disco()->setVersion( "adhocTest", GLOOX_VERSION ); + j->disco()->setIdentity( "client", "bot" ); + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + a = new Adhoc( j ); + a->registerAdhocCommandProvider( this, "helloworld", "Hello World!" ); + a->registerAdhocCommandProvider( this, "config", "Configuration" ); + a->registerAdhocCommandProvider( this, "shutdown", "Shutdown" ); + + j->connect(); + + delete( j ); + } + + virtual void handleAdhocCommand( const JID& from, const Adhoc::Command& command, + const std::string& /*sess*/ ) + { + if( command.node() == "helloworld" ) + printf( "Hello World!, by %s\n", from.full().c_str() ); + else if( command.node() == "config" ) + printf( "configuration command called by %s\n", from.full().c_str() ); + else if( command.node() == "shutdown" ) + { + printf( "shutting down, by %s\n", from.full().c_str() ); + } + } + + virtual void onConnect() + { + } + + virtual void onDisconnect( ConnectionError /*e*/ ) { printf( "disco_test: disconnected\n" ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Client *j; + Adhoc *a; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + AdhocTest *b = new AdhocTest(); + b->start(); + delete( b ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/annotations_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/annotations_example.cpp new file mode 100644 index 00000000..a5503a23 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/annotations_example.cpp @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../annotationshandler.h" +#include "../disco.h" +#include "../annotations.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class AnnotationsTest : public AnnotationsHandler, ConnectionListener +{ + public: + AnnotationsTest() {} + virtual ~AnnotationsTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + + j->registerConnectionListener(this ); + j->disco()->setVersion( "annotationsTest", GLOOX_VERSION ); + j->disco()->setIdentity( "client", "bot" ); + + a = new Annotations( j ); + a->registerAnnotationsHandler( this ); + + j->connect(); + + delete( a ); + delete( j ); + } + + virtual void onConnect() + { + a->requestAnnotations(); + } + + virtual void onDisconnect( ConnectionError /*e*/ ) { printf( "annotations_test: disconnected\n" ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleAnnotations( const AnnotationsList &aList ) + { + printf( "received notes...\n" ); + AnnotationsList::const_iterator it = aList.begin(); + for( ; it != aList.end(); it++ ) + { + printf( "jid: %s, note: %s, cdate: %s, mdate: %s\n", (*it).jid.c_str(), + (*it).note.c_str(), (*it).cdate.c_str(), (*it).mdate.c_str() ); + } + + AnnotationsList mybList; + + AnnotationsListItem bItem; + bItem.jid = "romeo@montague.org"; + bItem.note = "my lover & friend. 2 > 3"; + mybList.push_back( bItem ); + + bItem.jid = "juliet@capulet.com"; + bItem.note = "oh my sweetest love..."; + bItem.cdate = "20040924T15:23:21"; + bItem.mdate = "20040924T15:23:21"; + mybList.push_back( bItem ); + + a->storeAnnotations( mybList ); + } + + private: + Client *j; + Annotations *a; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + AnnotationsTest *t = new AnnotationsTest(); + t->start(); + delete( t ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/bookmarkstorage_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/bookmarkstorage_example.cpp new file mode 100644 index 00000000..ba4c64ce --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/bookmarkstorage_example.cpp @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../bookmarkhandler.h" +#include "../disco.h" +#include "../bookmarkstorage.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class BookmarkStorageTest : public BookmarkHandler, ConnectionListener +{ + public: + BookmarkStorageTest() {} + virtual ~BookmarkStorageTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + + j->registerConnectionListener(this ); + j->disco()->setVersion( "bookmarkTest", GLOOX_VERSION ); + j->disco()->setIdentity( "client", "bot" ); + + b = new BookmarkStorage( j ); + b->registerBookmarkHandler( this ); + + j->connect(); + + delete( b ); + delete( j ); + } + + virtual void onConnect() + { + b->requestBookmarks(); + } + + virtual void onDisconnect( ConnectionError /*e*/ ) { printf( "disco_test: disconnected\n" ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleBookmarks( const BookmarkList &bList, const ConferenceList &cList ) + { + printf( "received bookmarks...\n" ); + + BookmarkList::const_iterator it_b = bList.begin(); + for( ; it_b != bList.end(); it_b++ ) + { + printf( "url: %s, name: %s\n", (*it_b).url.c_str(), (*it_b).name.c_str() ); + } + ConferenceList::const_iterator it_c = cList.begin(); + for( ; it_c != cList.end(); it_c++ ) + { + printf( "jid: %s, name: %s, nick: %s, pwd: %s\n", (*it_c).jid.c_str(), (*it_c).name.c_str(), + (*it_c).nick.c_str(), (*it_c).password.c_str() ); + } + + BookmarkList mybList; + ConferenceList mycList; + + BookmarkListItem bItem; + bItem.url = "http://camaya.net/gloox"; + bItem.name = "gloox"; + mybList.push_back( bItem ); + + bItem.url = "http://jabber.cc"; + bItem.name = "public jabber services"; + mybList.push_back( bItem ); + + ConferenceListItem cItem; + cItem.jid = "jdev@conference.jabber.org"; + cItem.name = "jabber development"; + cItem.nick = "myNick"; + cItem.autojoin = false; + mycList.push_back( cItem ); + + cItem.jid = "jabberd@conference.jabber.org"; + cItem.name = "jabberd development"; + cItem.nick = "myOtherNick"; + cItem.password = "my password"; + cItem.autojoin = true; + mycList.push_back( cItem ); + + b->storeBookmarks( mybList, mycList ); + } + + private: + Client *j; + BookmarkStorage *b; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + BookmarkStorageTest *t = new BookmarkStorageTest(); + t->start(); + delete( t ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/bosh_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/bosh_example.cpp new file mode 100644 index 00000000..d32ba2d1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/bosh_example.cpp @@ -0,0 +1,203 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../messagesessionhandler.h" +#include "../messageeventhandler.h" +#include "../messageeventfilter.h" +#include "../chatstatehandler.h" +#include "../chatstatefilter.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../message.h" +#include "../gloox.h" +#include "../lastactivity.h" +#include "../loghandler.h" +#include "../logsink.h" +#include "../connectiontcpclient.h" +#include "../connectionsocks5proxy.h" +#include "../messagehandler.h" +#include "../connectionbosh.h" +#include "../connectionhttpproxy.h" + +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +#if defined( WIN32 ) || defined( _WIN32 ) +# include +#endif + +class MessageTest : public MessageSessionHandler, ConnectionListener, LogHandler, + MessageEventHandler, MessageHandler, ChatStateHandler +{ + public: + MessageTest() : m_session( 0 ), m_messageEventFilter( 0 ), m_chatStateFilter( 0 ) {} + + virtual ~MessageTest() {} + + void start() + { + + JID jid( "js@example.net/bosh" ); + j = new Client( jid, "test" ); + j->registerConnectionListener( this ); + j->registerMessageSessionHandler( this, 0 ); + j->disco()->setIdentity( "client", "bot" ); + j->disco()->addFeature( XMLNS_CHAT_STATES ); + j->setCompression(false); + //StringList ca; + //ca.push_back( "/path/to/cacert.crt" ); + //j->setCACerts( ca ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + +/* + ConnectionTCPClient* conn0 = new ConnectionTCPClient( j->logInstance(), "example.net", 8081 ); + ConnectionHTTPProxy* conn1 = new ConnectionHTTPProxy( conn0, j->logInstance(), "foo", 8080 ); + ConnectionBOSH* conn2 = new ConnectionBOSH( j, conn1, j->logInstance(), "camaya.net", "camaya.net" ); + conn2->setMode( ConnectionBOSH::ModeLegacyHTTP ); +// conn2->setMode( ConnectionBOSH::ModePersistentHTTP ); + j->setConnectionImpl( conn2 ); +*/ + + // this code connects to a jabber server through a BOSH connection... + ConnectionTCPClient* conn0 = new ConnectionTCPClient( j->logInstance(), "example.net", 8080 ); + ConnectionBOSH* conn1 = new ConnectionBOSH( j, conn0, j->logInstance(), "example.net", "example.net" ); +// conn1->setMode( ConnectionBOSH::ModeLegacyHTTP ); +// conn1->setMode( ConnectionBOSH::ModePersistentHTTP ); + j->setConnectionImpl( conn1 ); + + j->setForceNonSasl( true ); + + + + + if( j->connect( false ) ) + { + ConnectionError ce = ConnNoError; + while( ce == ConnNoError ) + { + ce = j->recv(); + } + printf( "ce: %d\n", ce ); + } + + delete( j ); + } + + virtual void onConnect() + { + printf( "connected!!!\n" ); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + virtual void handleMessage( const Message& msg, MessageSession * /*session*/ ) + { + printf( "type: %d, subject: %s, message: %s, thread id: %s\n", msg.subtype(), + msg.subject().c_str(), msg.body().c_str(), msg.thread().c_str() ); + + std::string re = "You said:\n> " + msg.body() + "\nI like that statement."; + std::string sub; + if( !msg.subject().empty() ) + sub = "Re: " + msg.subject(); + + m_messageEventFilter->raiseMessageEvent( MessageEventDisplayed ); + m_messageEventFilter->raiseMessageEvent( MessageEventComposing ); + m_chatStateFilter->setChatState( ChatStateComposing ); + m_session->send( re, sub ); + + if( msg.body() == "quit" ) + j->disconnect(); + } + + virtual void handleMessageEvent( const JID& from, MessageEventType event ) + { + printf( "received event: %d from: %s\n", event, from.full().c_str() ); + } + + virtual void handleChatState( const JID& from, ChatStateType state ) + { + printf( "received state: %d from: %s\n", state, from.full().c_str() ); + } + + virtual void handleMessageSession( MessageSession *session ) + { + printf( "got new session\n"); + // this example can handle only one session. so we get rid of the old session + j->disposeMessageSession( m_session ); + m_session = session; + m_session->registerMessageHandler( this ); + m_messageEventFilter = new MessageEventFilter( m_session ); + m_messageEventFilter->registerMessageEventHandler( this ); + m_chatStateFilter = new ChatStateFilter( m_session ); + m_chatStateFilter->registerChatStateHandler( this ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("%d: ", int( time( 0 ) ) ); + switch(area) + { + case LogAreaXmlIncoming: + printf("Received XML: "); + break; + case LogAreaXmlOutgoing: + printf("Sent XML: "); + break; + case LogAreaClassConnectionBOSH: + printf("BOSH: "); + break; + default: + printf("log: level: %d, area: %d, ", level, area); + } + printf("%s\n", message.c_str() ); + } + + private: + Client *j; + MessageSession *m_session; + MessageEventFilter *m_messageEventFilter; + ChatStateFilter *m_chatStateFilter; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + MessageTest *r = new MessageTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/component_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/component_example.cpp new file mode 100644 index 00000000..9aac3942 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/component_example.cpp @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../component.h" +#include "../connectionlistener.h" +#include "../loghandler.h" +#include "../discohandler.h" +#include "../disco.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class ComponentTest : public DiscoHandler, ConnectionListener, LogHandler +{ + public: + ComponentTest() {} + virtual ~ComponentTest() {} + + void start() + { + + j = new Component( XMLNS_COMPONENT_ACCEPT, "example.org", + "component.example.org", "secret", 5000 ); + j->disco()->setVersion( "componentTest", GLOOX_VERSION ); + + j->registerConnectionListener( this ); + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + j->connect(); + + delete( j ); + } + + virtual void onConnect() + { + printf( "connected -- disconnecting...\n" ); +// j->disconnect( STATE_DISCONNECTED ); + } + + virtual void onDisconnect( ConnectionError /*e*/ ) { printf( "component: disconnected\n" ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleDiscoInfo( const JID& /*iq*/, const Disco::Info&, int /*context*/ ) + { + printf( "handleDiscoInfoResult}\n" ); + } + + virtual void handleDiscoItems( const JID& /*iq*/, const Disco::Items&, int /*context*/ ) + { + printf( "handleDiscoItemsResult\n" ); + } + + virtual void handleDiscoError( const JID& /*iq*/, const Error*, int /*context*/ ) + { + printf( "handleDiscoError\n" ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Component *j; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + ComponentTest *r = new ComponentTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/disco_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/disco_example.cpp new file mode 100644 index 00000000..cc112538 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/disco_example.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../discohandler.h" +#include "../disco.h" +#include "../stanza.h" +#include "../gloox.h" +#include "../loghandler.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class DiscoTest : public DiscoHandler, ConnectionListener, LogHandler +{ + public: + DiscoTest() {} + virtual ~DiscoTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->disableRoster(); + j->registerConnectionListener( this ); + j->disco()->registerDiscoHandler( this ); + j->disco()->setVersion( "discoTest", GLOOX_VERSION, "linux" ); + j->disco()->setIdentity( "client", "bot" ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + j->connect(); + + delete( j ); + } + + virtual void onConnect() + { + } + + virtual void onDisconnect( ConnectionError e ) { printf( "disco_test: disconnected: %d\n", e ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleDiscoInfo( const JID& /*iq*/, const Disco::Info&, int /*context*/ ) + { + printf( "handleDiscoInfoResult}\n" ); + } + + virtual void handleDiscoItems( const JID& /*iq*/, const Disco::Items&, int /*context*/ ) + { + printf( "handleDiscoItemsResult\n" ); + } + + virtual void handleDiscoError( const JID& /*iq*/, const Error*, int /*context*/ ) + { + printf( "handleDiscoError\n" ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Client *j; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + DiscoTest *r = new DiscoTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/e2ee_client.cpp b/smack/smack/src/main/cpp/gloox/src/examples/e2ee_client.cpp new file mode 100644 index 00000000..9403a1cf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/e2ee_client.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../message.h" +#include "../gloox.h" +#include "../loghandler.h" +#include "../tlshandler.h" +#include "../tlsdefault.h" +#include "../logsink.h" +#include "../messagehandler.h" +#include "../base64.h" +using namespace gloox; + +#include +#include +#include +#include + +#include // [s]print[f] + +#ifdef WIN32 +#include +#endif + +#include "../config.h" + +#ifdef HAVE_GNUTLS + +/* + * Using TLS to encrypt end-to-end traffic is not a recommended practice in XMPP, + * nor is it standardized in any way. Use this code at your own risk. + */ + +class MessageTest : public ConnectionListener, LogHandler, + MessageHandler, TLSHandler +{ + public: + MessageTest() + : m_tls( new TLSDefault( this, "", TLSDefault::AnonymousClient ) ), + rcpt( "hurkhurk@example.net/server" ) {} + + virtual ~MessageTest() + { + delete m_tls; + } + + void start() + { + + JID jid( "hurkhurk@example.net/client" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->registerMessageHandler( this ); + j->disco()->setVersion( "messageTest", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + j->disco()->addFeature( XMLNS_CHAT_STATES ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + j->connect(); + + delete j; + } + + virtual void onConnect() + { + printf( "connected!\n" ); + m_tls->handshake(); + xtlsSend(); + m_send = ""; + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + void xtlsSend() + { + Tag *m = new Tag( "message" ); + m->addAttribute( "to", rcpt.full() ); + m->addAttribute( "type", "chat" ); + Tag *x = new Tag( m, "xtls", Base64::encode64( m_send ) ); + x->addAttribute( "xmlns", "test:xtls" ); + m_send = ""; + j->send( m ); + } + + virtual void handleEncryptedData( const TLSBase* /*base*/, const std::string& data ) + { + printf( "caching %d bytes of encrypted data\n", data.length() ); + m_send += data; + } + + virtual void handleDecryptedData( const TLSBase* /*base*/, const std::string& data ) + { + printf( "decrypted packet contents: %s\n", data.c_str() ); + m_tls->encrypt( "bye" ); + xtlsSend(); + j->disconnect(); + } + + virtual void handleHandshakeResult( const TLSBase* /*base*/, bool success, CertInfo& /*certinfo*/ ) + { + if( success ) + { + printf( "xtls handshake successful!\n" ); + m_tls->encrypt( "ping" ); + xtlsSend(); + } + else + { + printf( "xtls handshake failed!\n" ); + j->disconnect(); + } + } + + virtual void handleMessage( const Message& msg, MessageSession * /*session*/ ) + { + Tag* m = msg.tag(); + Tag *x = m->findChild( "xtls", "xmlns", "test:xtls" ); + if( x ) + { + printf( "decrypting: %d\n", x->cdata().length() ); + m_tls->decrypt( Base64::decode64( x->cdata() ) ); + xtlsSend(); + } + delete m; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Client *j; + TLSBase* m_tls; + std::string m_send; + const JID rcpt; +}; +#endif // HAVE_GNUTLS + +int main( int /*argc*/, char** /*argv*/ ) +{ +#ifdef HAVE_GNUTLS + MessageTest *r = new MessageTest(); + r->start(); + delete( r ); +#endif // HAVE_GNUTLS + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/e2ee_server.cpp b/smack/smack/src/main/cpp/gloox/src/examples/e2ee_server.cpp new file mode 100644 index 00000000..6aee47fd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/e2ee_server.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../message.h" +#include "../gloox.h" +#include "../loghandler.h" +#include "../tlshandler.h" +#include "../tlsdefault.h" +#include "../logsink.h" +#include "../messagehandler.h" +#include "../base64.h" +using namespace gloox; + +#include +#include +#include +#include + +#include // [s]print[f] + +#ifdef WIN32 +#include +#endif + +#include "../config.h" + +#ifdef HAVE_GNUTLS + +/* + * Using TLS to encrypt end-to-end traffic is not a recommended practice in XMPP, + * nor is it standardized in any way. Use this code at your own risk. + */ + +class MessageTest : public ConnectionListener, LogHandler, + MessageHandler, TLSHandler +{ + public: + MessageTest() + : m_tls( new TLSDefault( this, "", TLSDefault::AnonymousServer ) ), + rcpt( "hurkhurk@example.net/client" ) {} + + virtual ~MessageTest() + { + delete m_tls; + } + + void start() + { + + JID jid( "hurkhurk@example.net/server" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->registerMessageHandler( this ); + j->disco()->setVersion( "messageTest", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + j->disco()->addFeature( XMLNS_CHAT_STATES ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + j->connect(); + + delete j; + } + + virtual void onConnect() + { + printf( "connected!\n" ); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + void xtlsSend() + { + Tag *m = new Tag( "message" ); + m->addAttribute( "to", rcpt.full() ); + m->addAttribute( "type", "chat" ); + Tag *x = new Tag( m, "xtls", Base64::encode64( m_send ) ); + x->addAttribute( "xmlns", "test:xtls" ); + m_send = ""; + j->send( m ); + } + + virtual void handleEncryptedData( const TLSBase* /*base*/, const std::string& data ) + { + printf( "caching %d bytes of encrypted data\n", data.length() ); + m_send += data; + } + + virtual void handleDecryptedData( const TLSBase* /*base*/, const std::string& data ) + { + printf( "decrypted packet contents: %s\n", data.c_str() ); + if( data == "bye" ) + j->disconnect(); + + m_tls->encrypt( "pong" ); + xtlsSend(); + } + + virtual void handleHandshakeResult( const TLSBase* /*base*/, bool success, CertInfo& /*certinfo*/ ) + { + if( success ) + printf( "xtls handshake successful, waiting for encrypted packets!\n" ); + else + { + printf( "xtls handshake failed!\n" ); + j->disconnect(); + } + } + + virtual void handleMessage( const Message& msg, MessageSession * /*session*/ ) + { + Tag* m = msg.tag(); + Tag *x = m->findChild( "xtls", "xmlns", "test:xtls" ); + if( x ) + { + printf( "decrypting: %d\n", x->cdata().length() ); + m_tls->decrypt( Base64::decode64( x->cdata() ) ); + xtlsSend(); + } + delete m; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Client *j; + TLSBase* m_tls; + const JID rcpt; + std::string m_send; +}; +#endif // HAVE_GNUTLS + +int main( int /*argc*/, char** /*argv*/ ) +{ +#ifdef HAVE_GNUTLS + MessageTest *r = new MessageTest(); + r->start(); + delete( r ); +#endif // HAVE_GNUTLS + return 0; +} + diff --git a/smack/smack/src/main/cpp/gloox/src/examples/flexoff_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/flexoff_example.cpp new file mode 100644 index 00000000..14cc53be --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/flexoff_example.cpp @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../messagehandler.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../message.h" +#include "../gloox.h" +#include "../lastactivity.h" +#include "../flexoff.h" +#include "../flexoffhandler.h" +#include "../loghandler.h" +#include "../logsink.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class FlexOffTest : public MessageHandler, ConnectionListener, FlexibleOfflineHandler, + LogHandler +{ + public: + FlexOffTest() {} + virtual ~FlexOffTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->registerMessageHandler( this ); + j->disco()->setVersion( "messageTest", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + + f = new FlexibleOffline( j ); + f->registerFlexibleOfflineHandler( this ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + j->connect(); + + delete( j ); + } + + virtual void onConnect() + { + f->checkSupport(); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleMessage( const Message& msg, MessageSession * /*session*/ ) + { + printf( "type: %d, subject: %s, message: %s, thread id: %s\n", msg.subtype(), + msg.subject().c_str(), msg.body().c_str(), msg.thread().c_str() ); + Tag *m = new Tag( "message" ); + m->addAttribute( "from", j->jid().full() ); + m->addAttribute( "to", msg.from().full() ); + m->addAttribute( "type", "chat" ); + Tag *b = new Tag( "body", "You said:\n> " + msg.body() + "\nI like that statement." ); + m->addChild( b ); + if( !msg.subject().empty() ) + { + Tag *s = new Tag( "subject", "Re:" + msg.subject() ); + m->addChild( s ); + } + j->send( m ); + } + + virtual void handleFlexibleOfflineSupport( bool support ) + { + if( support ) + { + printf( "FlexOff: supported\n" ); + f->getMsgCount(); + } + else + { + printf( "FlexOff: not supported\n" ); + j->disconnect(); + } + } + + virtual void handleFlexibleOfflineMsgNum( int num ) + { + printf( "FlexOff messgaes: %d\n", num ); + f->fetchHeaders(); + } + + virtual void handleFlexibleOfflineMessageHeaders( const Disco::ItemList& headers ) + { + printf( "FlexOff: %d headers received.\n", headers.size() ); + StringList l; + l.push_back( "Fdd" ); + l.push_back( (*(headers.begin()))->node() ); + f->fetchMessages( l ); + f->removeMessages( l ); + } + + virtual void handleFlexibleOfflineResult( FlexibleOfflineResult result ) + { + printf( "FlexOff: result: %d\n", result ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Client *j; + FlexibleOffline *f; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + FlexOffTest *r = new FlexOffTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/ft_recv.cpp b/smack/smack/src/main/cpp/gloox/src/examples/ft_recv.cpp new file mode 100644 index 00000000..a50a158d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/ft_recv.cpp @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../stanza.h" +#include "../gloox.h" +#include "../disco.h" +#include "../loghandler.h" +#include "../logsink.h" +#include "../siprofileft.h" +#include "../siprofilefthandler.h" +#include "../bytestreamdatahandler.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +#if defined( WIN32 ) || defined( _WIN32 ) +# include +#endif + +/** + * Receives one file and displayes it. Does not save anything. + */ +class FTTest : public LogHandler, ConnectionListener, SIProfileFTHandler, BytestreamDataHandler +{ + public: + FTTest() : m_quit( false ) {} + + virtual ~FTTest() {} + + void start() + { + + JID jid( "hurkhurk@example.net/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->disco()->setVersion( "ftTest", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + f = new SIProfileFT( j, this ); + // you should obtain this using disco, really + f->addStreamHost( JID( "proxy.jabber.org" ), "208.245.212.98", 7777 ); + + if( j->connect( false ) ) + { + ConnectionError ce = ConnNoError; + while( ce == ConnNoError ) + { + if( m_quit ) + j->disconnect(); + + ce = j->recv( 100 ); + std::list::iterator it = m_bs.begin(); + for( ; it != m_bs.end(); ++it ) + (*it)->recv( 100 ); + } + printf( "ce: %d\n", ce ); + } + + f->dispose( m_bs.front() ); + delete f; + delete j; + } + + virtual void onConnect() + { + printf( "connected!!!\n" ); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + virtual void handleFTRequest( const JID& from, const JID& /*to*/, const std::string& sid, + const std::string& name, long size, const std::string& hash, + const std::string& date, const std::string& mimetype, + const std::string& desc, int /*stypes*/ ) + { + printf( "received ft request from %s: %s (%ld bytes, sid: %s). hash: %s, date: %s, mime-type: %s\n" + "desc: %s\n", + from.full().c_str(), name.c_str(), size, sid.c_str(), hash.c_str(), date.c_str(), + mimetype.c_str(), desc.c_str() ); + f->acceptFT( from, sid, SIProfileFT::FTTypeIBB ); + } + +// virtual void handleFTRequestResult( const JID& /*from*/, const std::string& /*sid*/ ) +// { +// } + + virtual void handleFTRequestError( const IQ& /*iq*/, const std::string& /*sid*/ ) + { + printf( "ft request error\n" ); + } + + virtual void handleFTBytestream( Bytestream* bs ) + { + printf( "received bytestream of type: %s", bs->type() == Bytestream::S5B ? "s5b" : "ibb" ); + m_bs.push_back( bs ); + bs->registerBytestreamDataHandler( this ); + if( bs->connect() ) + { + if( bs->type() == Bytestream::S5B ) + printf( "ok! s5b connected to streamhost\n" ); + else + printf( "ok! ibb sent request to remote entity\n" ); + } + } + + virtual const std::string handleOOBRequestResult( const JID& /*from*/, const JID& /*to*/, const std::string& /*sid*/ ) + { + return std::string(); + }; + + virtual void handleBytestreamData( Bytestream* /*s5b*/, const std::string& data ) + { + printf( "received %d bytes of data:\n%s\n", data.length(), data.c_str() ); + } + + virtual void handleBytestreamError( Bytestream* /*s5b*/, const IQ& /*stanza*/ ) + { + printf( "socks5 stream error\n" ); + } + + virtual void handleBytestreamOpen( Bytestream* /*s5b*/ ) + { + printf( "stream opened\n" ); + } + + virtual void handleBytestreamClose( Bytestream* /*s5b*/ ) + { + printf( "stream closed\n" ); + m_quit = true; + } + + private: + Client *j; + SIProfileFT* f; + SOCKS5BytestreamManager* s5b; + std::list m_bs; + bool m_quit; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + FTTest *r = new FTTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/ft_send.cpp b/smack/smack/src/main/cpp/gloox/src/examples/ft_send.cpp new file mode 100644 index 00000000..bfb3f93f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/ft_send.cpp @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../stanza.h" +#include "../gloox.h" +#include "../disco.h" +#include "../loghandler.h" +#include "../logsink.h" +#include "../siprofileft.h" +#include "../siprofilefthandler.h" +#include "../bytestreamdatahandler.h" +#include "../socks5bytestreamserver.h" +using namespace gloox; + +#include +#include +#include +#include +#include +#include +#include + +#include // [s]print[f] + +#if defined( WIN32 ) || defined( _WIN32 ) +# include +#endif + +/** + * Usage: + * ft_send jid@server/full /path/to/file + * + * Sends the given file to the given full JID. + */ +class FTTest : public LogHandler, ConnectionListener, SIProfileFTHandler, BytestreamDataHandler +{ + public: + FTTest( const JID& to, const std::string& file ) : m_bs( 0 ), m_to( to ), m_file( file ), m_quit( false ) {} + + virtual ~FTTest() {} + + void start() + { + + struct stat f_stat; + if( stat( m_file.c_str(), &f_stat ) ) + return; + + m_size = f_stat.st_size; + std::ifstream ifile( m_file.c_str(), std::ios_base::in | std::ios_base::binary ); + if( !ifile ) + return; + + JID jid( "hurkhurk@example.net/glooxsendfile" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->disco()->setVersion( "ftsend", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + + m_server = new SOCKS5BytestreamServer( j->logInstance(), 6666 ); + printf( "about to listen\n" ); + ConnectionError le = ConnNoError; + if( ( le = m_server->listen() ) != ConnNoError ) + printf( "listen returned: %d\n", le ); + printf( "listening\n" ); + + f = new SIProfileFT( j, this ); + f->registerSOCKS5BytestreamServer( m_server ); + f->addStreamHost( j->jid(), "192.168.100.20", 6666 ); + // you should obtain this using disco, really: +// f->addStreamHost( JID( "reflector.amessage.eu" ), "reflector.amessage.eu", 6565 ); +// f->addStreamHost( JID( "proxy.jabber.org" ), "208.245.212.98", 7777 ); + + if( j->connect( false ) ) + { + char input[200024]; + ConnectionError ce = ConnNoError; + ConnectionError se = ConnNoError; + while( ce == ConnNoError ) + { + if( m_quit ) + j->disconnect(); + + ce = j->recv( 1 ); + if( m_server ) + { + se = m_server->recv( 1 ); + if( se != ConnNoError ) + { + printf( "SOCKS5BytestreamServer returned: %d\n", se ); + delete m_server; + m_server = 0; + m_quit = true; + } + } + if( m_bs && !ifile.eof() ) + { + if( m_bs->isOpen() ) + { + ifile.read( input, 200024 ); + std::string t( input, ifile.gcount() ); + if( !m_bs->send( t ) ) + m_quit = true; + } + m_bs->recv( 1 ); + } + else if( m_bs ) + m_bs->close(); + } + printf( "ce: %d\n", ce ); + } + + f->dispose( m_bs ); + delete f; + delete m_server; + delete j; + } + + virtual void onConnect() + { + printf( "connected!!!\n" ); + f->requestFT( m_to, m_file, m_size ); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "ft_send: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + virtual void handleFTRequest( const JID& from, const JID& /*to*/, const std::string& sid, + const std::string& name, long size, const std::string& hash, + const std::string& date, const std::string& mimetype, + const std::string& desc, int /*stypes*/ ) + { + printf( "received ft request from %s: %s (%ld bytes, sid: %s). hash: %s, date: %s, mime-type: %s\n" + "desc: %s\n", + from.full().c_str(), name.c_str(), size, sid.c_str(), hash.c_str(), date.c_str(), + mimetype.c_str(), desc.c_str() ); + f->acceptFT( from, sid, SIProfileFT::FTTypeS5B ); + } + +// virtual void handleFTRequestResult( const JID& /*from*/, const std::string& /*sid*/ ) +// { +// } + + virtual void handleFTRequestError( const IQ& /*iq*/, const std::string& /*sid*/ ) + { + printf( "ft request error\n" ); + m_quit = true; + } + + virtual void handleFTBytestream( Bytestream* bs ) + { + printf( "received bytestream of type: %s", bs->type() == Bytestream::S5B ? "s5b" : "ibb" ); + m_bs = bs; + m_bs->registerBytestreamDataHandler( this ); + if( m_bs->connect() ) + { + if( bs->type() == Bytestream::S5B ) + printf( "ok! s5b connected to streamhost\n" ); + else + printf( "ok! ibb sent request to remote entity\n" ); + } + } + + virtual const std::string handleOOBRequestResult( const JID& /*from*/, const JID& /*to*/, const std::string& /*sid*/ ) + { + return std::string(); + }; + + virtual void handleBytestreamData( Bytestream* /*bs*/, const std::string& data ) + { + printf( "received %d bytes of data:\n%s\n", data.length(), data.c_str() ); + } + + virtual void handleBytestreamError( Bytestream* /*bs*/, const IQ& /*iq*/ ) + { + printf( "bytestream error\n" ); + } + + virtual void handleBytestreamOpen( Bytestream* /*bs*/ ) + { + printf( "bytestream opened\n" ); + } + + virtual void handleBytestreamClose( Bytestream* /*bs*/ ) + { + printf( "bytestream closed\n" ); + m_quit = true; + } + + private: + Client *j; + SIProfileFT* f; + Bytestream* m_bs; + SOCKS5BytestreamServer* m_server; + JID m_to; + std::string m_file; + bool m_quit; + int m_size; +}; + +int main( int argc, char** argv ) +{ + if( argc == 3 ) + { + JID j( argv[1] ); + if( j.resource().empty() ) + { + printf( "error: need full jid\n" ); + return 1; + } + FTTest *r = new FTTest( j, argv[2] ); + r->start(); + delete( r ); + } + else + { + printf( "error: need jid + file\n" ); + } + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/linklocal_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/linklocal_example.cpp new file mode 100644 index 00000000..36a595ff --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/linklocal_example.cpp @@ -0,0 +1,217 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../config.h" +#include "../linklocalmanager.h" +#include "../linklocalhandler.h" +#include "../logsink.h" +#include "../loghandler.h" +#include "../connectionhandler.h" +#include "../connectionlistener.h" +#include "../messagehandler.h" +#include "../message.h" +#include "../linklocalclient.h" +#include "../linklocal.h" +#include "../jid.h" +using namespace gloox; + +#include + +#ifdef HAVE_MDNS + +#ifndef _WIN32 +# include +#endif + +#include + +#include // [s]print[f] + +#if defined( WIN32 ) || defined( _WIN32 ) +# include +#endif + +class LinkLocalExample : public LinkLocal::Handler, LogHandler, ConnectionHandler, MessageHandler, ConnectionListener +{ + public: + LinkLocalExample() : m_mdns( "js", this, m_log ), m_client( 0 ), m_fClient( 0 ), m_disconnect( false ), m_ok( false ) {} + + virtual ~LinkLocalExample() + { + delete m_client; + delete m_fClient; + } + + void start() + { + m_mdns.registerLinkLocalHandler( this ); + m_mdns.addTXTData("nick","foo"); + m_mdns.addTXTData("1st","Firstname"); + m_mdns.addTXTData("last","Lastname"); + m_mdns.addTXTData("msg","Hanging out"); + m_mdns.addTXTData("jid","me@there.com"); + m_mdns.addTXTData("status","avail"); + m_mdns.registerService(); + if( !m_mdns.startBrowsing() ) + { + printf( "startBrowsing() failed\n" ); + return; + } + int count = 0; + int fCount = 0; + while( true ) + { + m_mdns.recv( 1000 ); + if ( m_disconnect ) + { + delete m_client; + m_client = 0; + delete m_fClient; + m_fClient = 0; + m_disconnect = false; + } + if( m_client ) + { + m_client->recv( 1000 ); + if( m_ok && count == 1000 ) + { + count = 0; + Message m( Message::Chat, JID( "user@Nokia-N900" ), "hey again!" ); + m_client->send( m ); + } + ++count; + } + if( m_fClient ) + { + m_fClient->recv( 1000 ); + if( fCount == 1000 ) + { + fCount = 0; + Message m( Message::Chat, JID( "user@Nokia-N900" ), "hey there!" ); + m_fClient->send( m ); + } + ++fCount; + } + // printf( "ok\n" ); + } + } + + virtual void handleBrowseReply( const LinkLocal::ServiceList& services ) + { + LinkLocal::ServiceList::const_iterator it = services.begin(); + for( ; it != services.end(); ++it ) + { + printf( "%s:\t%s.%s%s on interface %d\n", (*it).flag == LinkLocal::AddService ? "Added" : "Removed", (*it).service.c_str(), (*it).regtype.c_str(), + (*it).domain.c_str(), (*it).interface ); + if( !m_fClient /*&& (*it)->flag == LinkLocal::AddService && (*it)->service != "js@pitufo"*/ ) + { + printf( "setting up new local client and connecting to %s.%s%s on interface %d\n", + (*it).service.c_str(), (*it).regtype.c_str(), (*it).domain.c_str(), (*it).interface ); + m_fClient = new LinkLocal::Client( JID( "js@pitufo" ) ); + m_fClient->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + m_fClient->registerConnectionListener( this ); + if( !m_fClient->connect( (*it).service, (*it).regtype, (*it).domain, (*it).interface ) ) + { + printf( "m_fClient->connect() failed\n" ); + } + } + } + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + virtual void handleIncomingConnection( ConnectionBase* /*server*/, ConnectionBase* connection ) + { + printf( "incoming connection on port %d!\n", connection->localPort() ); + m_client = new LinkLocal::Client( JID( "js@pitufo" ) ); + m_client->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + connection->registerConnectionDataHandler( m_client ); + m_client->setConnectionImpl( connection ); + m_client->registerMessageHandler( this ); + m_client->registerConnectionListener( this ); + m_client->connect(); + } + + virtual void handleMessage( const Message& msg, MessageSession* /*session*/ = 0 ) + { + m_ok = true; + printf( "Message received: %s\n", msg.body().c_str() ); + Message m( Message::Chat, msg.from(), "hey!" ); + m_client->send( m ); + } + + virtual void onConnect() {} + + virtual void onDisconnect( ConnectionError e ) + { + printf( "onDisconnect\n" ); + m_disconnect = true; + } + +// virtual void handleClient( LinkLocal::Client* client ) +// { +// if( !client) +// return; +// +// printf( "received LinkLocalClient, connect() successful!\n" ); +// client->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); +// client->registerMessageHandler( this ); +// client->registerConnectionListener( this ); +// Message msg( Message::Chat, JID( "user@Nokia-N900" ), "hex" ); +// client->send( msg ); +// if( m_client ) +// delete m_client; +// m_client = client; +// } + + virtual void onResourceBind( const std::string& resource ) { (void)resource; } + + virtual void onResourceBindError( const Error* error ) { (void) (error); } + + virtual void onSessionCreateError( const Error* error ) { (void) (error); } + + virtual bool onTLSConnect( const CertInfo& info ) { return true; } + + virtual void onStreamEvent( StreamEvent event ) { (void) (event); } +private: + LogSink m_log; + LinkLocal::Manager m_mdns; + LinkLocal::Client* m_client; + LinkLocal::Client* m_fClient; + bool m_disconnect; + bool m_ok; + +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + LinkLocalExample *r = new LinkLocalExample(); + r->start(); + while( true ) + sleep(15); + delete( r ); + return 0; +} + +#else + +int main( int /*argc*/, char** /*argv*/ ) +{ + printf( "Link-local support not compiled in\n" ); + return 0; +} + + +#endif // HAVE_MDNS diff --git a/smack/smack/src/main/cpp/gloox/src/examples/message_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/message_example.cpp new file mode 100644 index 00000000..d14fecb2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/message_example.cpp @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../messagesessionhandler.h" +#include "../messageeventhandler.h" +#include "../messageeventfilter.h" +#include "../chatstatehandler.h" +#include "../chatstatefilter.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../message.h" +#include "../gloox.h" +#include "../lastactivity.h" +#include "../loghandler.h" +#include "../logsink.h" +#include "../connectiontcpclient.h" +#include "../connectionsocks5proxy.h" +#include "../connectionhttpproxy.h" +#include "../messagehandler.h" +using namespace gloox; + +#ifndef _WIN32 +# include +#endif + +#include +#include + +#include // [s]print[f] + +#if defined( WIN32 ) || defined( _WIN32 ) +# include +#endif + +class MessageTest : public MessageSessionHandler, ConnectionListener, LogHandler, + MessageEventHandler, MessageHandler, ChatStateHandler +{ + public: + MessageTest() : m_session( 0 ), m_messageEventFilter( 0 ), m_chatStateFilter( 0 ) {} + + virtual ~MessageTest() {} + + void start() + { + + JID jid( "hurkhurk@example.net/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->registerMessageSessionHandler( this, 0 ); + j->disco()->setVersion( "messageTest", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + j->disco()->addFeature( XMLNS_CHAT_STATES ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + +// +// this code connects to a jabber server through a SOCKS5 proxy +// +// ConnectionSOCKS5Proxy* conn = new ConnectionSOCKS5Proxy( j, +// new ConnectionTCP( j->logInstance(), +// "sockshost", 1080 ), +// j->logInstance(), "example.net" ); +// conn->setProxyAuth( "socksuser", "sockspwd" ); +// j->setConnectionImpl( conn ); + +// +// this code connects to a jabber server through a HTTP proxy through a SOCKS5 proxy +// +// ConnectionTCP* conn0 = new ConnectionTCP( j->logInstance(), "old", 1080 ); +// ConnectionSOCKS5Proxy* conn1 = new ConnectionSOCKS5Proxy( conn0, j->logInstance(), "old", 8080 ); +// conn1->setProxyAuth( "socksuser", "sockspwd" ); +// ConnectionHTTPProxy* conn2 = new ConnectionHTTPProxy( j, conn1, j->logInstance(), "jabber.cc" ); +// conn2->setProxyAuth( "httpuser", "httppwd" ); +// j->setConnectionImpl( conn2 ); + + + if( j->connect( false ) ) + { + ConnectionError ce = ConnNoError; + while( ce == ConnNoError ) + { + ce = j->recv(); + } + printf( "ce: %d\n", ce ); + } + + delete( j ); + } + + virtual void onConnect() + { + printf( "connected!!!\n" ); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + virtual void handleMessage( const Message& msg, MessageSession * /*session*/ ) + { + printf( "type: %d, subject: %s, message: %s, thread id: %s\n", msg.subtype(), + msg.subject().c_str(), msg.body().c_str(), msg.thread().c_str() ); + + std::string re = "You said:\n> " + msg.body() + "\nI like that statement."; + std::string sub; + if( !msg.subject().empty() ) + sub = "Re: " + msg.subject(); + + m_messageEventFilter->raiseMessageEvent( MessageEventDisplayed ); +#if defined( WIN32 ) || defined( _WIN32 ) + Sleep( 1000 ); +#else + sleep( 1 ); +#endif + m_messageEventFilter->raiseMessageEvent( MessageEventComposing ); + m_chatStateFilter->setChatState( ChatStateComposing ); +#if defined( WIN32 ) || defined( _WIN32 ) + Sleep( 2000 ); +#else + sleep( 2 ); +#endif + m_session->send( re, sub ); + + if( msg.body() == "quit" ) + j->disconnect(); + } + + virtual void handleMessageEvent( const JID& from, MessageEventType event ) + { + printf( "received event: %d from: %s\n", event, from.full().c_str() ); + } + + virtual void handleChatState( const JID& from, ChatStateType state ) + { + printf( "received state: %d from: %s\n", state, from.full().c_str() ); + } + + virtual void handleMessageSession( MessageSession *session ) + { + printf( "got new session\n"); + // this example can handle only one session. so we get rid of the old session + j->disposeMessageSession( m_session ); + m_session = session; + m_session->registerMessageHandler( this ); + m_messageEventFilter = new MessageEventFilter( m_session ); + m_messageEventFilter->registerMessageEventHandler( this ); + m_chatStateFilter = new ChatStateFilter( m_session ); + m_chatStateFilter->registerChatStateHandler( this ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Client *j; + MessageSession *m_session; + MessageEventFilter *m_messageEventFilter; + ChatStateFilter *m_chatStateFilter; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + MessageTest *r = new MessageTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/muc_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/muc_example.cpp new file mode 100644 index 00000000..49772131 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/muc_example.cpp @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../mucroomhandler.h" +#include "../mucroom.h" +#include "../disco.h" +#include "../presence.h" +#include "../message.h" +#include "../dataform.h" +#include "../gloox.h" +#include "../lastactivity.h" +#include "../loghandler.h" +#include "../logsink.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +#ifdef WIN32 +#include +#endif + +class MessageTest : public ConnectionListener, LogHandler, MUCRoomHandler +{ + public: + MessageTest() {} + + virtual ~MessageTest() {} + + void start() + { + JID jid( "hurkhurk@example.net/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->setPresence( Presence::Available, -1 ); + j->disco()->setVersion( "gloox muc_example", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + j->setCompression( false ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + JID nick( "test@conference.jabber.org/glooxmuctest" ); + m_room = new MUCRoom( j, nick, this, 0 ); + + if( j->connect( false ) ) + { + ConnectionError ce = ConnNoError; + while( ce == ConnNoError ) + { + ce = j->recv(); + } + printf( "ce: %d\n", ce ); + } + + // cleanup + delete m_room; + delete j; + } + + virtual void onConnect() + { + printf( "connected!!!\n" ); + m_room->join(); + m_room->getRoomInfo(); + m_room->getRoomItems(); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + virtual void handleMUCParticipantPresence( MUCRoom * /*room*/, const MUCRoomParticipant participant, + const Presence& presence ) + { + if( presence.presence() == Presence::Available ) + printf( "!!!!!!!!!!!!!!!! %s is in the room, too\n", participant.nick->resource().c_str() ); + else if( presence.presence() == Presence::Unavailable ) + printf( "!!!!!!!!!!!!!!!! %s left the room\n", participant.nick->resource().c_str() ); + else + printf( "Presence is %d of %s\n", presence.presence(), participant.nick->resource().c_str() ); + } + + virtual void handleMUCMessage( MUCRoom* /*room*/, const Message& msg, bool priv ) + { + printf( "%s said: '%s' (history: %s, private: %s)\n", msg.from().resource().c_str(), msg.body().c_str(), + msg.when() ? "yes" : "no", priv ? "yes" : "no" ); + } + + virtual void handleMUCSubject( MUCRoom * /*room*/, const std::string& nick, const std::string& subject ) + { + if( nick.empty() ) + printf( "Subject: %s\n", subject.c_str() ); + else + printf( "%s has set the subject to: '%s'\n", nick.c_str(), subject.c_str() ); + } + + virtual void handleMUCError( MUCRoom * /*room*/, StanzaError error ) + { + printf( "!!!!!!!!got an error: %d", error ); + } + + virtual void handleMUCInfo( MUCRoom * /*room*/, int features, const std::string& name, + const DataForm* infoForm ) + { + printf( "features: %d, name: %s, form xml: %s\n", + features, name.c_str(), infoForm->tag()->xml().c_str() ); + } + + virtual void handleMUCItems( MUCRoom * /*room*/, const Disco::ItemList& items ) + { + Disco::ItemList::const_iterator it = items.begin(); + for( ; it != items.end(); ++it ) + { + printf( "%s -- %s is an item here\n", (*it)->jid().full().c_str(), (*it)->name().c_str() ); + } + } + + virtual void handleMUCInviteDecline( MUCRoom * /*room*/, const JID& invitee, const std::string& reason ) + { + printf( "Invitee %s declined invitation. reason given: %s\n", invitee.full().c_str(), reason.c_str() ); + } + + virtual bool handleMUCRoomCreation( MUCRoom *room ) + { + printf( "room %s didn't exist, beeing created.\n", room->name().c_str() ); + return true; + } + + private: + Client *j; + MUCRoom *m_room; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + MessageTest *r = new MessageTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/privacylist_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/privacylist_example.cpp new file mode 100644 index 00000000..4df8de91 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/privacylist_example.cpp @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../privacylisthandler.h" +#include "../disco.h" +#include "../privacymanager.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class PLTest : public PrivacyListHandler, ConnectionListener +{ + public: + PLTest() {} + virtual ~PLTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + + j->registerConnectionListener(this ); + j->disco()->setVersion( "PLTest", GLOOX_VERSION ); + j->disco()->setIdentity( "client", "bot" ); + + p = new PrivacyManager( j ); + p->registerPrivacyListHandler( this ); + + j->connect(); + + delete( p ); + delete( j ); + } + + virtual void onConnect() + { + p->requestListNames(); + } + + virtual void onDisconnect( ConnectionError /*e*/ ) { printf( "disco_test: disconnected\n" ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handlePrivacyListNames( const std::string& active, const std::string& def, + const StringList& lists ) + { + printf( "received PL...\n" ); + printf( "active list: %s\n", active.c_str() ); + printf( "default list: %s\n", def.c_str() ); + printf( "all lists:\n" ); + StringList::const_iterator it = lists.begin(); + for( ; it != lists.end(); it++ ) + { + printf( "%s\n", (*it).c_str() ); + } + + PrivacyListHandler::PrivacyList l; + PrivacyItem item( PrivacyItem::TypeJid, PrivacyItem::ActionDeny, + PrivacyItem::PacketMessage, "me@there.com" ); + l.push_back( item ); + PrivacyItem item2( PrivacyItem::TypeJid, PrivacyItem::ActionAllow, + PrivacyItem::PacketIq, "me@example.org" ); + l.push_back( item2 ); + p->store( "mnyList", l ); +// p->unsetDefault(); +// p->unsetActive(); + p->requestList( "mnyList" ); + } + + virtual void handlePrivacyListResult( const std::string& id, PrivacyListResult plResult ) + { + printf( "result for id '%s': %d\n", id.c_str(), plResult ); + } + + virtual void handlePrivacyList( const std::string& name, const PrivacyList& items ) + { + printf( "received list: %s\n", name.c_str() ); + PrivacyListHandler::PrivacyList::const_iterator it = items.begin(); + for( ; it != items.end(); it++ ) + { + printf( "item: type: %d, action: %d, packetType: %d, value: %s\n", + (*it).type(), (*it).action(), (*it).packetType(), (*it).value().c_str() ); + } + } + + virtual void handlePrivacyListChanged( const std::string& name ) + { + printf( "list changed: %s\n", name.c_str() ); + } + + private: + Client *j; + PrivacyManager *p; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + PLTest *t = new PLTest(); + t->start(); + delete( t ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/privatexml_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/privatexml_example.cpp new file mode 100644 index 00000000..db065917 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/privatexml_example.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../discohandler.h" +#include "../disco.h" +#include "../privatexml.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class PrivateXMLTest : public PrivateXMLHandler, ConnectionListener +{ + public: + PrivateXMLTest() {} + virtual ~PrivateXMLTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + + j->registerConnectionListener(this ); + j->disco()->setVersion( "privateXMLTest", GLOOX_VERSION ); + j->disco()->setIdentity( "client", "bot" ); + + p = new PrivateXML( j ); + + j->connect(); + + delete( p ); + delete( j ); + } + + virtual void onConnect() + { + p->requestXML( "test", "http://camaya.net/jabber/test", this ); + } + + virtual void onDisconnect( ConnectionError /*e*/ ) { printf( "disco_test: disconnected\n" ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handlePrivateXML( const Tag* /*xml*/ ) + { + printf( "received privatexml...\n" ); + Tag *x = new Tag( "test" ); + x->addAttribute( "xmlns", "http://camaya.net/jabber/test" ); + std::string id = j->getID(); + Tag *b = new Tag( "blah", id ); + x->addChild( b ); + p->storeXML( x, this ); + } + + virtual void handlePrivateXMLResult( const std::string& /*uid*/, PrivateXMLResult /*result*/ ) + { + } + + private: + Client *j; + PrivateXML *p; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + PrivateXMLTest *r = new PrivateXMLTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/pubsub_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/pubsub_example.cpp new file mode 100644 index 00000000..2a1f7c6f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/pubsub_example.cpp @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../messagesessionhandler.h" +#include "../messageeventhandler.h" +#include "../messageeventfilter.h" +#include "../chatstatehandler.h" +#include "../chatstatefilter.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../message.h" +#include "../gloox.h" +#include "../lastactivity.h" +#include "../loghandler.h" +#include "../logsink.h" +#include "../connectiontcpclient.h" +#include "../connectionsocks5proxy.h" +#include "../connectionhttpproxy.h" +#include "../messagehandler.h" +#include "../pubsubmanager.h" +#include "../pubsubresulthandler.h" +using namespace gloox; + +#include +#include +#include + +#if defined( WIN32 ) || defined( _WIN32 ) +# include +#endif +/* +class PubsubExample : public MessageSessionHandler, ConnectionListener, LogHandler, + MessageEventHandler, MessageHandler, ChatStateHandler, PubSub::ResultHandler +{ + public: + PubsubExample() : m_session( 0 ), m_messageEventFilter( 0 ), m_chatStateFilter( 0 ) {} + + virtual ~PubsubExample() {} + + void start() + { + + JID jid( "hurkhurk@example.net/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->registerMessageSessionHandler( this, 0 ); + j->disco()->setVersion( "PubsubExample", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + j->disco()->addFeature( XMLNS_CHAT_STATES ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + + pubsub = new PubSub::Manager( j ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + +// +// this code connects to a jabber server through a SOCKS5 proxy +// +// ConnectionSOCKS5Proxy* conn = new ConnectionSOCKS5Proxy( j, +// new ConnectionTCP( j->logInstance(), +// "sockshost", 1080 ), +// j->logInstance(), "example.net" ); +// conn->setProxyAuth( "socksuser", "sockspwd" ); +// j->setConnectionImpl( conn ); + +// +// this code connects to a jabber server through a HTTP proxy through a SOCKS5 proxy +// +// ConnectionTCP* conn0 = new ConnectionTCP( j->logInstance(), "old", 1080 ); +// ConnectionSOCKS5Proxy* conn1 = new ConnectionSOCKS5Proxy( conn0, j->logInstance(), "old", 8080 ); +// conn1->setProxyAuth( "socksuser", "sockspwd" ); +// ConnectionHTTPProxy* conn2 = new ConnectionHTTPProxy( j, conn1, j->logInstance(), "jabber.cc" ); +// conn2->setProxyAuth( "httpuser", "httppwd" ); +// j->setConnectionImpl( conn2 ); + + + j->connect( true ); + + delete( j ); + } + + virtual void onConnect() + { + printf( "connected!!!\n" ); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "PubsubExample: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + virtual void handleMessage( Message* msg, MessageSession * session ) + { + if( msg->body() == "quit" ) + j->disconnect(); + else if( msg->body() == "create" ) + pubsub->createCollectionNode( JID( "pubsub.jabber.ru" ), "blah", this, "blubb", "pubsub/nodes" ); + } + + virtual void handleMessageEvent( const JID& from, MessageEventType event ) + { + printf( "received event: %d from: %s\n", event, from.full().c_str() ); + } + + virtual void handleChatState( const JID& from, ChatStateType state ) + { + printf( "received state: %d from: %s\n", state, from.full().c_str() ); + } + + virtual void handleMessageSession( MessageSession *session ) + { + printf( "got new session\n"); + // this example can handle only one session. so we get rid of the old session + j->disposeMessageSession( m_session ); + m_session = session; + m_session->registerMessageHandler( this ); + m_messageEventFilter = new MessageEventFilter( m_session ); + m_messageEventFilter->registerMessageEventHandler( this ); + m_chatStateFilter = new ChatStateFilter( m_session ); + m_chatStateFilter->registerChatStateHandler( this ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + virtual void handleNodeCreationResult( const JID& service, + const std::string& node, + const Error& e ) + { + printf( "created node '%s' on '%s'\n", node.c_str(), service.bare().c_str() ); + } + + virtual void handleNodeDeletationResult( const JID& service, + const std::string& node, + const Error& e ) {} + + virtual void handleNodePurgeResult( const JID& service, + const std::string& node, + const Error& e ) {} + + virtual void handleSubscriptionOptions( const JID& service, const JID& jid, + const std::string& node, + const DataForm& options ) {} + + virtual void handleSubscriptionOptionsResult( const JID& service, + //const JID& jid, + const std::string& node, + const Error& e ) {} + + virtual void handleSubscriberList( const JID& service, const std::string& node, + const PubSub::SubscriberList& list ) {} + + virtual void handleSubscriberListResult( const JID& service, const std::string& node, + const Error& e ) {} + + virtual void handleAffiliateList( const JID& service, const std::string& node, + const PubSub::AffiliateList& list ) {} + + virtual void handleAffiliateListResult( const JID& service, const std::string& node, + const Error& e ) {} + + virtual void handleNodeConfig( const JID& service, const std::string& node, + const DataForm& config ) {} + + virtual void handleNodeConfigResult( const JID& service, const std::string& node, + const Error& e ) {} + + private: + Client *j; + MessageSession *m_session; + MessageEventFilter *m_messageEventFilter; + ChatStateFilter *m_chatStateFilter; + PubSub::Manager *pubsub; +}; +*/ +int main( int /*argc*/, char** /*argv*/ ) +{ + //PubsubExample *r = new PubsubExample(); + //r->start(); + //delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/reconnect_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/reconnect_example.cpp new file mode 100644 index 00000000..54f3e8c7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/reconnect_example.cpp @@ -0,0 +1,205 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define CLIENT_TEST +#define CLIENTBASE_TEST +#include "../client.h" +#include "../messagesessionhandler.h" +#include "../messageeventhandler.h" +#include "../messageeventfilter.h" +#include "../chatstatehandler.h" +#include "../chatstatefilter.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../message.h" +#include "../gloox.h" +#include "../lastactivity.h" +#include "../loghandler.h" +#include "../logsink.h" +#include "../connectiontcpclient.h" +#include "../connectionsocks5proxy.h" +#include "../connectionhttpproxy.h" +#include "../messagehandler.h" +using namespace gloox; + +#ifndef _WIN32 +# include +#endif + +#include +#include + +#include // [s]print[f] + +#if defined( WIN32 ) || defined( _WIN32 ) +# include +#endif + +class MessageTest : public MessageSessionHandler, ConnectionListener, LogHandler, + MessageEventHandler, MessageHandler, ChatStateHandler +{ + public: + MessageTest() : m_session( 0 ), m_reconnect( false ) {} + + virtual ~MessageTest() {} + + void start() + { + + JID jid( "admin@jabba.us/gloox" ); + j = new Client( jid, "test" ); + j->registerConnectionListener( this ); + j->registerMessageSessionHandler( this, 0 ); + j->disco()->setVersion( "reconnectTest", GLOOX_VERSION, "Linux" ); + j->disco()->setIdentity( "client", "bot" ); + j->disco()->addFeature( XMLNS_CHAT_STATES ); +// j->setTls( TLSDisabled ); + j->setCompression( false ); + j->setStreamManagement( true, true ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + +// +// this code connects to a jabber server through a SOCKS5 proxy +// +// ConnectionSOCKS5Proxy* conn = new ConnectionSOCKS5Proxy( j, +// new ConnectionTCP( j->logInstance(), +// "sockshost", 1080 ), +// j->logInstance(), "example.net" ); +// conn->setProxyAuth( "socksuser", "sockspwd" ); +// j->setConnectionImpl( conn ); + +// +// this code connects to a jabber server through a HTTP proxy through a SOCKS5 proxy +// +// ConnectionTCP* conn0 = new ConnectionTCP( j->logInstance(), "old", 1080 ); +// ConnectionSOCKS5Proxy* conn1 = new ConnectionSOCKS5Proxy( conn0, j->logInstance(), "old", 8080 ); +// conn1->setProxyAuth( "socksuser", "sockspwd" ); +// ConnectionHTTPProxy* conn2 = new ConnectionHTTPProxy( j, conn1, j->logInstance(), "jabber.cc" ); +// conn2->setProxyAuth( "httpuser", "httppwd" ); +// j->setConnectionImpl( conn2 ); + + + ConnectionError ce = ConnNoError; + if( j->connect( false ) ) + { + while( ce == ConnNoError ) + { + ce = j->recv(); + } + printf( "ce: %d\n", ce ); + } + + m_reconnect = true; + ce = ConnNoError; + if( j->connect( false ) ) + { + while( ce == ConnNoError ) + { + ce = j->recv(); + } + printf( "ce: %d\n", ce ); + } + + delete( j ); + } + + virtual void onConnect() + { + printf( "connected!!!\n" ); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "message_test: disconnected: %d\n", e ); + if( e == ConnAuthenticationFailed ) + printf( "auth failed. reason: %d\n", j->authError() ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + time_t from( info.date_from ); + time_t to( info.date_to ); + + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n" + "from: %s\nto: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str(), ctime( &from ), ctime( &to ) ); + return true; + } + + virtual void handleMessage( const Message& msg, MessageSession * /*session*/ ) + { + printf( "type: %d, subject: %s, message: %s, thread id: %s\n", msg.subtype(), + msg.subject().c_str(), msg.body().c_str(), msg.thread().c_str() ); + + + if( msg.body().substr( 0, 3 ) == "ack" ) // using substr() to work around some stupid clients + j->ackStreamManagement(); + else if( msg.body().substr( 0, 3 ) == "req" ) + j->reqStreamManagement(); + else if( msg.body().substr( 0, 4 ) == "quit" ) + j->disconnect(); + else + { + std::string re = "You said:\n> " + msg.body() + "\nI like that statement."; + m_session->send( re, gloox::EmptyString ); + } + } + + virtual void handleMessageEvent( const JID& from, MessageEventType event ) + { + printf( "received event: %d from: %s\n", event, from.full().c_str() ); + } + + virtual void handleChatState( const JID& from, ChatStateType state ) + { + printf( "received state: %d from: %s\n", state, from.full().c_str() ); + } + + virtual void handleMessageSession( MessageSession *session ) + { + printf( "got new session\n"); + // this example can handle only one session. so we get rid of the old session + j->disposeMessageSession( m_session ); + m_session = session; + m_session->registerMessageHandler( this ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + + if( message.substr( 0, 10 ) == "m_smHandled > 10 ) + j->disconnect( ConnTlsFailed ); // fake disconnect reason so that no is sent + } + + private: + Client *j; + MessageSession *m_session; + bool m_reconnect; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + MessageTest *r = new MessageTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/register_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/register_example.cpp new file mode 100644 index 00000000..226435b0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/register_example.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../registration.h" +#include "../logsink.h" +#include "../loghandler.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class RegTest : public RegistrationHandler, ConnectionListener, LogHandler +{ + public: + RegTest() {} + virtual ~RegTest() {} + + void start() + { +// README +// to create an account: +// - create the Client instance by passing it the server only, e.g. j = new Client( "example.net" ); +// - in onConnect() (or some similar place) call Registration::fetchRegistrationFields() +// - in RegistrationHandler::handleRegistrationFields() set up an RegistrationFields struct +// with the desired username/password and call Registration::createAccount() + +// to change an account's password: +// - connect to the server as usual +// - in onConnect() or at any later time call Registration::changePassword() + +// to delete an account: +// - connect to teh server as usual +// - in onConnect() or at any later time call Registration::removeAccount() + +// be sure to read the API documentation for class Registration! + + j = new Client( "jabba.us" ); + j->disableRoster(); + j->registerConnectionListener( this ); + + m_reg = new Registration( j ); + m_reg->registerRegistrationHandler( this ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + j->connect(); + + delete( m_reg ); + delete( j ); + } + + virtual void onConnect() + { +// requesting reg fields + m_reg->fetchRegistrationFields(); + + // changing password +// m_reg->changePassword( j->username(), "test" ); + + // unregistering +// m_reg->removeAccount(); + } + + virtual void onDisconnect( ConnectionError e ) { printf( "register_test: disconnected: %d\n", e ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleRegistrationFields( const JID& /*from*/, int fields, std::string instructions ) + { + printf( "fields: %d\ninstructions: %s\n", fields, instructions.c_str() ); + RegistrationFields vals; + vals.username = "cotest2"; + vals.password = "test2"; + m_reg->createAccount( fields, vals ); + } + + virtual void handleRegistrationResult( const JID& /*from*/, RegistrationResult result ) + { + printf( "result: %d\n", result ); + j->disconnect(); + } + + virtual void handleAlreadyRegistered( const JID& /*from*/ ) + { + printf( "the account already exists.\n" ); + } + + virtual void handleDataForm( const JID& /*from*/, const DataForm& /*form*/ ) + { + printf( "datForm received\n" ); + } + + virtual void handleOOB( const JID& /*from*/, const OOB& oob ) + { + printf( "OOB registration requested. %s: %s\n", oob.desc().c_str(), oob.url().c_str() ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Registration *m_reg; + Client *j; +}; + +int main( int /*argc*/, char* /*argv*/[] ) +{ + RegTest *r = new RegTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/reset_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/reset_example.cpp new file mode 100644 index 00000000..79145492 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/reset_example.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../rostermanager.h" +#include "../loghandler.h" +#include "../logsink.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class RosterTest : public ConnectionListener, LogHandler +{ + public: + RosterTest() {} + virtual ~RosterTest() {} + + void start() + { + + JID jid( "hurkhurkss@example.net/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->disco()->setVersion( "resetTest", GLOOX_VERSION ); + j->disco()->setIdentity( "client", "bot" ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + printf( "first run: %d\n", j->connect() ); + printf( "second run: %d\n", j->connect() ); + + delete( j ); + } + + virtual void onConnect() + { + j->disconnect(); + } + + virtual void onDisconnect( ConnectionError e ) + { + printf( "reset_test: disconnected: %d\n", e ); + } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + private: + Client *j; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + RosterTest *r = new RosterTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/roster_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/roster_example.cpp new file mode 100644 index 00000000..afe22970 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/roster_example.cpp @@ -0,0 +1,192 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../discohandler.h" +#include "../disco.h" +#include "../rostermanager.h" +#include "../loghandler.h" +#include "../logsink.h" +#include "../messagehandler.h" +#include "../message.h" +#include "../presence.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class RosterTest : public RosterListener, ConnectionListener, LogHandler, MessageHandler +{ + public: + RosterTest() {} + virtual ~RosterTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->registerConnectionListener( this ); + j->registerMessageHandler( this ); + j->rosterManager()->registerRosterListener( this ); + j->disco()->setVersion( "rosterTest", GLOOX_VERSION ); + j->disco()->setIdentity( "client", "bot" ); + + j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + + j->connect(); + + delete( j ); + } + + virtual void onConnect() + { + } + + virtual void onDisconnect( ConnectionError e ) { printf( "disco_test: disconnected: %d\n", e ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void onResourceBindError( ResourceBindError error ) + { + printf( "onResourceBindError: %d\n", error ); + } + + virtual void onSessionCreateError( SessionCreateError error ) + { + printf( "onSessionCreateError: %d\n", error ); + } + + virtual void handleItemSubscribed( const JID& jid ) + { + printf( "subscribed %s\n", jid.bare().c_str() ); + } + + virtual void handleItemAdded( const JID& jid ) + { + printf( "added %s\n", jid.bare().c_str() ); + } + + virtual void handleItemUnsubscribed( const JID& jid ) + { + printf( "unsubscribed %s\n", jid.bare().c_str() ); + } + + virtual void handleItemRemoved( const JID& jid ) + { + printf( "removed %s\n", jid.bare().c_str() ); + } + + virtual void handleItemUpdated( const JID& jid ) + { + printf( "updated %s\n", jid.bare().c_str() ); + } + + virtual void handleRoster( const Roster& roster ) + { + printf( "roster arriving\nitems:\n" ); + Roster::const_iterator it = roster.begin(); + for( ; it != roster.end(); ++it ) + { + printf( "jid: %s, name: %s, subscription: %d\n", + (*it).second->jidJID().full().c_str(), (*it).second->name().c_str(), + (*it).second->subscription() ); + StringList g = (*it).second->groups(); + StringList::const_iterator it_g = g.begin(); + for( ; it_g != g.end(); ++it_g ) + printf( "\tgroup: %s\n", (*it_g).c_str() ); + RosterItem::ResourceMap::const_iterator rit = (*it).second->resources().begin(); + for( ; rit != (*it).second->resources().end(); ++rit ) + printf( "resource: %s\n", (*rit).first.c_str() ); + } + } + + virtual void handleRosterError( const IQ& /*iq*/ ) + { + printf( "a roster-related error occured\n" ); + } + + virtual void handleRosterPresence( const RosterItem& item, const std::string& resource, + Presence::PresenceType presence, const std::string& /*msg*/ ) + { + printf( "presence received: %s/%s -- %d\n", item.jidJID().full().c_str(), resource.c_str(), presence ); + } + + virtual void handleSelfPresence( const RosterItem& item, const std::string& resource, + Presence::PresenceType presence, const std::string& /*msg*/ ) + { + printf( "self presence received: %s/%s -- %d\n", item.jidJID().full().c_str(), resource.c_str(), presence ); + } + + virtual bool handleSubscriptionRequest( const JID& jid, const std::string& /*msg*/ ) + { + printf( "subscription: %s\n", jid.bare().c_str() ); + StringList groups; + JID id( jid ); + j->rosterManager()->subscribe( id, "", groups, "" ); + return true; + } + + virtual bool handleUnsubscriptionRequest( const JID& jid, const std::string& /*msg*/ ) + { + printf( "unsubscription: %s\n", jid.bare().c_str() ); + return true; + } + + virtual void handleNonrosterPresence( const Presence& presence ) + { + printf( "received presence from entity not in the roster: %s\n", presence.from().full().c_str() ); + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + virtual void handleMessage( const Message& msg, MessageSession * /*session*/ ) + { + if( msg.body() == "quit" ) + j->disconnect(); + else if( msg.body() == "subscribe" ) + j->rosterManager()->subscribe( msg.from() ); + else if( msg.body() == "unsubscribe" ) + j->rosterManager()->unsubscribe( msg.from() ); + else if( msg.body() == "cancel" ) + j->rosterManager()->cancel( msg.from() ); + else if( msg.body() == "remove" ) + j->rosterManager()->remove( msg.from() ); + else + printf( "msg: %s\n", msg.body().c_str() ); + } + + private: + Client *j; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + RosterTest *r = new RosterTest(); + r->start(); + delete( r ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/examples/vcard_example.cpp b/smack/smack/src/main/cpp/gloox/src/examples/vcard_example.cpp new file mode 100644 index 00000000..031911a8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/examples/vcard_example.cpp @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../client.h" +#include "../connectionlistener.h" +#include "../disco.h" +#include "../stanza.h" +#include "../gloox.h" +#include "../loghandler.h" +#include "../vcardhandler.h" +#include "../vcardmanager.h" +#include "../vcard.h" +using namespace gloox; + +#include +#include +#include + +#include // [s]print[f] + +class VCardTest : public ConnectionListener, LogHandler, VCardHandler +{ + public: + VCardTest() : m_count( 0 ) {} + virtual ~VCardTest() {} + + void start() + { + + JID jid( "hurkhurk@example.org/gloox" ); + j = new Client( jid, "hurkhurks" ); + j->disableRoster(); + j->registerConnectionListener( this ); + j->disco()->setVersion( "discoTest", GLOOX_VERSION, "linux" ); + j->disco()->setIdentity( "client", "bot" ); + StringList ca; + ca.push_back( "/path/to/cacert.crt" ); + j->setCACerts( ca ); +// j->logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + m_vManager = new VCardManager( j ); + + j->connect(); + + delete( m_vManager ); + delete( j ); + } + + virtual void onConnect() + { + printf( "connected\n" ); + JID jid( "hurkhurk@example.org" ); + m_vManager->fetchVCard( jid, this ); + } + + virtual void onDisconnect( ConnectionError e ) { printf( "disco_test: disconnected: %d\n", e ); } + + virtual bool onTLSConnect( const CertInfo& info ) + { + printf( "status: %d\nissuer: %s\npeer: %s\nprotocol: %s\nmac: %s\ncipher: %s\ncompression: %s\n", + info.status, info.issuer.c_str(), info.server.c_str(), + info.protocol.c_str(), info.mac.c_str(), info.cipher.c_str(), + info.compression.c_str() ); + return true; + } + + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + + virtual void handleVCard( const JID& jid, const VCard *v ) + { + ++m_count; + if( !v ) + { + printf( "empty vcard!\n" ); + return; + } + + VCard* vcard = new VCard( *v ); + printf( "received vcard for %s: %s, %d\n", jid.full().c_str(), vcard->tag()->xml().c_str(), m_count ); + VCard::AddressList::const_iterator it = vcard->addresses().begin(); + for( ; it != vcard->addresses().end(); ++it ) + { + printf( "address: %s\n", (*it).street.c_str() ); + } + + if( m_count > 2 ) + j->disconnect(); + else if( m_count == 1 ) + { + VCard *v = new VCard(); + v->setFormattedname( "Hurk the Hurk" ); + v->setNickname( "hurkhurk" ); + v->setName( "Simpson", "Bart", "", "Mr.", "jr." ); + v->addAddress( "pobox", "app. 2", "street", "Springfield", "region", "123", "USA", VCard::AddrTypeHome ); + m_vManager->storeVCard( v, this ); + printf( "setting vcard: %s\n", v->tag()->xml().c_str() ); + } + else + { + JID jid( "hurkhurk@example.org" ); + m_vManager->fetchVCard( jid, this ); + } + } + + virtual void handleVCardResult( VCardContext context, const JID& jid, + StanzaError se = StanzaErrorUndefined ) + { + printf( "vcard result: context: %d, jid: %s, error: %d\n", context, jid.full().c_str(), se ); + m_vManager->fetchVCard( jid, this ); + } + + private: + Client *j; + VCardManager *m_vManager; + int m_count; +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + VCardTest *v = new VCardTest(); + v->start(); + delete( v ); + return 0; +} diff --git a/smack/smack/src/main/cpp/gloox/src/featureneg.cpp b/smack/smack/src/main/cpp/gloox/src/featureneg.cpp new file mode 100644 index 00000000..2e6b3030 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/featureneg.cpp @@ -0,0 +1,60 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "featureneg.h" +#include "dataform.h" +#include "tag.h" + +namespace gloox +{ + + FeatureNeg::FeatureNeg( DataForm* form ) + : StanzaExtension( ExtFeatureNeg ), m_form( form ) + { + } + + FeatureNeg::FeatureNeg( const Tag* tag ) + : StanzaExtension( ExtFeatureNeg ), m_form( 0 ) + { + if( !tag || tag->name() != "feature" || tag->xmlns() != XMLNS_FEATURE_NEG ) + return; + + const Tag* f = tag->findTag( "feature/x[@xmlns='" + XMLNS_X_DATA + "']" ); + if( f ) + m_form = new DataForm( f ); + } + + FeatureNeg::~FeatureNeg() + { + delete m_form; + } + + const std::string& FeatureNeg::filterString() const + { + static const std::string filter = "/message/feature[@xmlns='" + XMLNS_FEATURE_NEG + "']" + "|/iq/feature[@xmlns='" + XMLNS_FEATURE_NEG + "']" ; + return filter; + } + + Tag* FeatureNeg::tag() const + { + if( !m_form ) + return 0; + + Tag* t = new Tag( "feature" ); + t->setXmlns( XMLNS_FEATURE_NEG ); + t->addChild( m_form->tag() ); + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/featureneg.h b/smack/smack/src/main/cpp/gloox/src/featureneg.h new file mode 100644 index 00000000..9f8f2556 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/featureneg.h @@ -0,0 +1,86 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef FEATURENEG_H__ +#define FEATURENEG_H__ + +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class DataForm; + class Tag; + + /** + * @brief An abstraction of Feature Negotiation (@xep{0020}), implemented + * as a StanzaExtension. + * + * XEP Version: 1.5 + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API FeatureNeg : public StanzaExtension + { + public: + /** + * Creates a new wrapper object using the given DataForm. + * @param form The DataForm to embed. The FeatureNeg object will own the DataForm. + */ + FeatureNeg( DataForm* form ); + + /** + * Creates a new wrapper object from the given Tag. + * @param tag The Tag to parse. + */ + FeatureNeg( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~FeatureNeg(); + + /** + * Returns the wrapped DataForm. + * @return The wrapped DataForm. May be 0. + */ + const DataForm* form() const { return m_form; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new FeatureNeg( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new FeatureNeg( m_form ); + } + + private: + DataForm* m_form; + + }; + +} + +#endif // FEATURENEG_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/flexoff.cpp b/smack/smack/src/main/cpp/gloox/src/flexoff.cpp new file mode 100644 index 00000000..29761377 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/flexoff.cpp @@ -0,0 +1,207 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "flexoff.h" +#include "dataform.h" +#include "disco.h" +#include "error.h" + +#include + +namespace gloox +{ + + // ---- FlexibleOffline::Offline ---- + FlexibleOffline::Offline::Offline( const Tag* /*tag*/ ) + : StanzaExtension( ExtFlexOffline ) + { + // FIXME what to do here? + } + + FlexibleOffline::Offline::Offline( int context, const StringList& msgs ) + : StanzaExtension( ExtFlexOffline ), m_context( context ), m_msgs( msgs ) + { + } + + FlexibleOffline::Offline::~Offline() + { + } + + const std::string& FlexibleOffline::Offline::filterString() const + { + static const std::string filter = "/iq/offline[@xmlns='" + XMLNS_OFFLINE + "']"; + return filter; + } + + Tag* FlexibleOffline::Offline::tag() const + { + Tag* t = new Tag( "offline" ); + t->setXmlns( XMLNS_OFFLINE ); + + if( m_msgs.empty() ) + new Tag( t, m_context == FORequestMsgs ? "fetch" : "purge" ); + else + { + const std::string action = m_context == FORequestMsgs ? "view" : "remove"; + StringList::const_iterator it = m_msgs.begin(); + for( ; it != m_msgs.end(); ++it ) + { + Tag* i = new Tag( t, "item", "action", action ); + i->addAttribute( "node", (*it) ); + } + } + return t; + } + // ---- ~FlexibleOffline::Offline ---- + + // ---- FlexibleOffline ---- + FlexibleOffline::FlexibleOffline( ClientBase* parent ) + : m_parent( parent ), m_flexibleOfflineHandler( 0 ) + { + if( m_parent ) + m_parent->registerStanzaExtension( new Offline() ); + } + + FlexibleOffline::~FlexibleOffline() + { + if( m_parent ) + m_parent->removeIDHandler( this ); + } + + void FlexibleOffline::checkSupport() + { + m_parent->disco()->getDiscoInfo( m_parent->jid().server(), EmptyString, this, FOCheckSupport ); + } + + void FlexibleOffline::getMsgCount() + { + m_parent->disco()->getDiscoInfo( m_parent->jid().server(), XMLNS_OFFLINE, this, FORequestNum ); + } + + void FlexibleOffline::fetchHeaders() + { + m_parent->disco()->getDiscoItems( m_parent->jid().server(), XMLNS_OFFLINE, this, FORequestHeaders ); + } + + void FlexibleOffline::messageOperation( int context, const StringList& msgs ) + { + const std::string& id = m_parent->getID(); + IQ::IqType iqType = context == FORequestMsgs ? IQ::Get : IQ::Set; + IQ iq( iqType, JID(), id ); + iq.addExtension( new Offline( context, msgs ) ); + m_parent->send( iq, this, context ); + } + + void FlexibleOffline::registerFlexibleOfflineHandler( FlexibleOfflineHandler* foh ) + { + m_flexibleOfflineHandler = foh; + } + + void FlexibleOffline::removeFlexibleOfflineHandler() + { + m_flexibleOfflineHandler = 0; + } + + void FlexibleOffline::handleDiscoInfo( const JID& /*from*/, const Disco::Info& info, int context ) + { + if( !m_flexibleOfflineHandler ) + return; + + switch( context ) + { + case FOCheckSupport: + m_flexibleOfflineHandler->handleFlexibleOfflineSupport( info.hasFeature( XMLNS_OFFLINE ) ); + break; + + case FORequestNum: + int num = -1; + if( info.form() && info.form()->hasField( "number_of_messages" ) ) + num = atoi( info.form()->field( "number_of_messages" )->value().c_str() ); + + m_flexibleOfflineHandler->handleFlexibleOfflineMsgNum( num ); + break; + } + } + + void FlexibleOffline::handleDiscoItems( const JID& /*from*/, const Disco::Items& items, int context ) + { + if( context == FORequestHeaders && m_flexibleOfflineHandler ) + { + if( items.node() == XMLNS_OFFLINE ) + m_flexibleOfflineHandler->handleFlexibleOfflineMessageHeaders( items.items() ); + } + } + + void FlexibleOffline::handleDiscoError( const JID& /*from*/, const Error* /*error*/, int /*context*/ ) + { + } + + void FlexibleOffline::handleIqID( const IQ& iq, int context ) + { + if( !m_flexibleOfflineHandler ) + return; + + switch( context ) + { + case FORequestMsgs: + switch( iq.subtype() ) + { + case IQ::Result: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrRequestSuccess ); + break; + case IQ::Error: + switch( iq.error()->error() ) + { + case StanzaErrorForbidden: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrForbidden ); + break; + case StanzaErrorItemNotFound: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrItemNotFound ); + break; + default: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrUnknownError ); + break; + } + break; + default: + break; + } + break; + case FORemoveMsgs: + switch( iq.subtype() ) + { + case IQ::Result: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrRemoveSuccess ); + break; + case IQ::Error: + switch( iq.error()->error() ) + { + case StanzaErrorForbidden: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrForbidden ); + break; + case StanzaErrorItemNotFound: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrItemNotFound ); + break; + default: + m_flexibleOfflineHandler->handleFlexibleOfflineResult( FomrUnknownError ); + break; + } + break; + default: + break; + } + break; + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/flexoff.h b/smack/smack/src/main/cpp/gloox/src/flexoff.h new file mode 100644 index 00000000..3863f99f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/flexoff.h @@ -0,0 +1,178 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef FLEXOFF_H__ +#define FLEXOFF_H__ + +#include "clientbase.h" +#include "discohandler.h" +#include "flexoffhandler.h" +#include "iqhandler.h" +#include "stanzaextension.h" + +namespace gloox +{ + + /** + * @brief An implementation of @xep{0013} (Flexible Offline Message Retrieval). + * + * Use the FlexibleOfflineHandler to receive results. + * + * @author Jakob Schröter + * @since 0.7 + */ + class GLOOX_API FlexibleOffline : public DiscoHandler, public IqHandler + { + public: + /** + * Creates a new FlexibleOffline object that manages retrieval of offline messages. + * @param parent The ClientBase to use for communication. + */ + FlexibleOffline( ClientBase* parent ); + + /** + * Virtual Destructor. + */ + virtual ~FlexibleOffline(); + + /** + * Initiates querying the server for Flexible Offline Message Retrieval-support. + * The result is announced through the FlexibleOfflineHandler. + * An application could cache the result on a per-server basis to eliminate the associated delay. + */ + void checkSupport(); + + /** + * Asks the server for the number of stored offline messages. + * The result is announced through the FlexibleOfflineHandler. + */ + void getMsgCount(); + + /** + * Initiates fetching the offline message headers. + * The result is announced through the FlexibleOfflineHandler. + */ + void fetchHeaders(); + + /** + * Initiates fetching of one or more specific messages, or all messages. + * The result is announced through the FlexibleOfflineHandler. + * If the list of message nodes contains one or more nodes, the corresponding messages are + * fetched. If the list is empty all messages are fetched (<fetch>). + * @param msgs A list of message nodes to fetch. + */ + void fetchMessages( const StringList& msgs ) + { messageOperation( FORequestMsgs, msgs ); } + + /** + * Initiates removing of one or more specific messages, or all messages. + * The result is announced through the FlexibleOfflineHandler. + * If the list of message nodes contains one or more nodes, the corresponding messages are + * removed. If the list is empty all messages are removed (<purge>). + */ + void removeMessages( const StringList& msgs ) + { messageOperation( FORemoveMsgs, msgs ); } + + /** + * Registers a FlexibleOfflineHandler as object that receives results of @xep{0013} queries. + * Only one Handler at a time is possible. + * @param foh The Handler object to register. + */ + void registerFlexibleOfflineHandler( FlexibleOfflineHandler* foh ); + + /** + * Removes the registered handler. + */ + void removeFlexibleOfflineHandler(); + + // reimplemented from DiscoHandler + virtual void handleDiscoInfo( const JID& from, const Disco::Info& info, int context ); + + // reimplemented from DiscoHandler + virtual void handleDiscoItems( const JID& from, const Disco::Items& items, int context ); + + // reimplemented from DiscoHandler + virtual void handleDiscoError( const JID& from, const Error* error, int context ); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ) { (void)iq; return false; } + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef FLEXOFF_TEST + public: +#endif + class Offline : public StanzaExtension + { + public: + /** + * Constructs a new Offline object from the given Tag. + * @param tag The Tag to parse. + */ + Offline( const Tag* tag = 0 ); + + /** + * Constructs a new Offline object for the given context and messages. + * @param context The context. + * @param msgs The messages. + */ + Offline( int context, const StringList& msgs ); + + /** + * Virtual destructor. + */ + virtual ~Offline(); + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Offline( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Offline( *this ); + } + + private: + int m_context; + StringList m_msgs; + }; + + void messageOperation( int context, const StringList& msgs ); + + enum FOContext + { + FOCheckSupport, + FORequestNum, + FORequestHeaders, + FORequestMsgs, + FORemoveMsgs + }; + + ClientBase* m_parent; + FlexibleOfflineHandler* m_flexibleOfflineHandler; + }; + +} + +#endif // FLEXOFF_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/flexoffhandler.h b/smack/smack/src/main/cpp/gloox/src/flexoffhandler.h new file mode 100644 index 00000000..b9bf89f0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/flexoffhandler.h @@ -0,0 +1,82 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef FLEXOFFHANDLER_H__ +#define FLEXOFFHANDLER_H__ + +#include "disco.h" +#include "gloox.h" + +namespace gloox +{ + + /** + * Describes the possible results of a message retrieval or deletion request. + */ + enum FlexibleOfflineResult + { + FomrRemoveSuccess, /**< Message(s) were removed successfully. */ + FomrRequestSuccess, /**< Message(s) were fetched successfully. */ + FomrForbidden, /**< The requester is a JID other than an authorized resource of the + * user. Something wnet serieously wrong */ + FomrItemNotFound, /**< The requested node (message ID) does not exist. */ + FomrUnknownError /**< An error occurred which is not specified in @xep{0013}. */ + }; + + /** + * @brief Implementation of this virtual interface allows for retrieval of offline messages following + * @xep{0030}. + * + * @author Jakob Schröter + * @since 0.7 + */ + class GLOOX_API FlexibleOfflineHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~FlexibleOfflineHandler() {} + + /** + * This function is called to indicate whether the server supports @xep{0013} or not. + * Call @ref FlexibleOffline::checkSupport() to trigger the check. + * @param support Whether the server support @xep{0013} or not. + */ + virtual void handleFlexibleOfflineSupport( bool support ) = 0; + + /** + * This function is called to announce the number of available offline messages. + * Call @ref FlexibleOffline::getMsgCount() to trigger the check. + * @param num The number of stored offline messages. + */ + virtual void handleFlexibleOfflineMsgNum( int num ) = 0; + + /** + * This function is called when the offline message headers arrive. + * Call @ref FlexibleOffline::fetchHeaders() to trigger the check. + * @param headers A map of ID/sender pairs describing the offline messages. + */ + virtual void handleFlexibleOfflineMessageHeaders( const Disco::ItemList& headers ) = 0; + + /** + * This function is called to indicate the result of a fetch or delete instruction. + * @param foResult The result of the operation. + */ + virtual void handleFlexibleOfflineResult( FlexibleOfflineResult foResult ) = 0; + + }; + +} + +#endif // FLEXOFFHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/forward.cpp b/smack/smack/src/main/cpp/gloox/src/forward.cpp new file mode 100644 index 00000000..fd507908 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/forward.cpp @@ -0,0 +1,85 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "forward.h" + +#include "delayeddelivery.h" +#include "message.h" +#include "stanza.h" +#include "util.h" + +namespace gloox +{ + + Forward::Forward( Stanza *stanza, DelayedDelivery *delay ) + : StanzaExtension( ExtForward ), + m_stanza( stanza ), m_tag( 0 ), m_delay( delay ) + { + } + + Forward::Forward( const Tag* tag ) + : StanzaExtension( ExtForward ), + m_stanza( 0 ), m_tag( 0 ), m_delay( 0 ) + { + if( !tag || !( tag->name() == "forwarded" && tag->hasAttribute( XMLNS, XMLNS_STANZA_FORWARDING ) ) ) + return; + + m_delay = new DelayedDelivery( tag->findChild( "delay", XMLNS, XMLNS_DELAY ) ); + + Tag* m = tag->findChild( "message" ); + if( !m ) + return; + + m_tag = m->clone(); + m_stanza = new Message( m ); + } + + Forward::~Forward() + { + delete m_delay; + delete m_stanza; + delete m_tag; + } + + const std::string& Forward::filterString() const + { + static const std::string filter = "/message/forwarded[@xmlns='" + XMLNS_STANZA_FORWARDING + "']" + "|/iq/forwarded[@xmlns='" + XMLNS_STANZA_FORWARDING + "']" + "|/presence/forwarded[@xmlns='" + XMLNS_STANZA_FORWARDING + "']"; + return filter; + } + + Tag* Forward::tag() const + { + if( !m_stanza ) + return 0; + + Tag* f = new Tag( "forwarded" ); + f->setXmlns( XMLNS_STANZA_FORWARDING ); + if( m_delay ) + f->addChild( m_delay->tag() ); + if( m_stanza ) + f->addChild( m_stanza->tag() ); + + return f; + } + + StanzaExtension* Forward::clone() const + { + if( !m_tag || !m_delay ) + return 0; + + return new Forward( new Message( m_tag ), static_cast( m_delay->clone() ) ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/forward.h b/smack/smack/src/main/cpp/gloox/src/forward.h new file mode 100644 index 00000000..2b4dc4c5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/forward.h @@ -0,0 +1,104 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef FORWARD_H__ +#define FORWARD_H__ + +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class DelayedDelivery; + class Stanza; + + /** + * @brief This is an implementation of Stanza Forwarding (@xep{0297}) as a StanzaExtension. + * + * @note At this point, Forward can only hold forwarded Messages, not IQ or Presence. + * However, Forward can be used inside any type of stanza (<message>, <iq>, + * or <presence>). + * + * XEP-Version: 0.5 + * + * @author Jakob Schröter + * @author Fernando Sanchez + * @since 1.0.5 + */ + class GLOOX_API Forward : public StanzaExtension + { + public: + + /** + * Creates a forwarding StanzaExtension, embedding the given Stanza and DelayedDelivery objects. + * @param stanza The forwarded Stanza. This Forward instance will own the Stanza object. + * @param delay The date/time the forwarded stanza was received at by the forwarder. This + * Forward instance will own the DelayedDelivery object. + */ + Forward( Stanza* stanza, DelayedDelivery* delay ); + + /** + * Creates a forwarding Stanza from the given Tag. The original Tag will be ripped off. + * If a valid Stanza is conatined (as a child) in the Tag it will be parsed, too. + * It can then be accessed through embeddedStanza(). The Tag that the Stanza was built from + * is available through embeddedTag(). + * @param tag The Tag to parse. + */ + Forward( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~Forward(); + + /** + * This function returns a pointer to a DelayedDelivery StanzaExtension which indicates + * when the forwarder originally received the forwarded stanza. + * + * @return A pointer to a DelayedDelivery object. May be 0. + */ + const DelayedDelivery* when() const { return m_delay; } + + // reimplemented from StanzaExtension + virtual Stanza* embeddedStanza() const { return m_stanza; } + + // reimplemented from StanzaExtension + virtual Tag* embeddedTag() const { return m_tag; } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + const std::string& filterString() const; + + // reimplemented from StanzaExtension + StanzaExtension* newInstance( const Tag* tag ) const + { + return new Forward( tag ); + } + + // reimplemented from StanzaExtension + StanzaExtension* clone() const; + + private: + Stanza* m_stanza; + Tag* m_tag; + DelayedDelivery* m_delay; + + }; + +} + +#endif // FORWARD_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/gloox.cpp b/smack/smack/src/main/cpp/gloox/src/gloox.cpp new file mode 100644 index 00000000..3d4e08d7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/gloox.cpp @@ -0,0 +1,129 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "gloox.h" + +namespace gloox +{ + + const std::string XMLNS_CLIENT = "jabber:client"; + const std::string XMLNS_COMPONENT_ACCEPT = "jabber:component:accept"; + const std::string XMLNS_COMPONENT_CONNECT = "jabber:component:connect"; + + const std::string XMLNS_DISCO_INFO = "http://jabber.org/protocol/disco#info"; + const std::string XMLNS_DISCO_ITEMS = "http://jabber.org/protocol/disco#items"; + const std::string XMLNS_DISCO_PUBLISH = "http://jabber.org/protocol/disco#publish"; + const std::string XMLNS_ADHOC_COMMANDS = "http://jabber.org/protocol/commands"; + const std::string XMLNS_COMPRESSION = "http://jabber.org/protocol/compress"; + + const std::string XMLNS_OFFLINE = "http://jabber.org/protocol/offline"; + const std::string XMLNS_CHAT_STATES = "http://jabber.org/protocol/chatstates"; + const std::string XMLNS_AMP = "http://jabber.org/protocol/amp"; + const std::string XMLNS_IBB = "http://jabber.org/protocol/ibb"; + const std::string XMLNS_FEATURE_NEG = "http://jabber.org/protocol/feature-neg"; + + const std::string XMLNS_CHATNEG = "http://jabber.org/protocol/chatneg"; + const std::string XMLNS_XHTML_IM = "http://jabber.org/protocol/xhtml-im"; + const std::string XMLNS_DELAY = "urn:xmpp:delay"; + const std::string XMLNS_ROSTER = "jabber:iq:roster"; + const std::string XMLNS_VERSION = "jabber:iq:version"; + + const std::string XMLNS_REGISTER = "jabber:iq:register"; + const std::string XMLNS_PRIVACY = "jabber:iq:privacy"; + const std::string XMLNS_AUTH = "jabber:iq:auth"; + const std::string XMLNS_PRIVATE_XML = "jabber:iq:private"; + const std::string XMLNS_LAST = "jabber:iq:last"; + + const std::string XMLNS_SEARCH = "jabber:iq:search"; + const std::string XMLNS_IQ_OOB = "jabber:iq:oob"; + const std::string XMLNS_X_DATA = "jabber:x:data"; + const std::string XMLNS_X_EVENT = "jabber:x:event"; + const std::string XMLNS_X_OOB = "jabber:x:oob"; + + const std::string XMLNS_X_DELAY = "jabber:x:delay"; + const std::string XMLNS_X_GPGSIGNED = "jabber:x:signed"; + const std::string XMLNS_X_GPGENCRYPTED = "jabber:x:encrypted"; + const std::string XMLNS_VCARD_TEMP = "vcard-temp"; + const std::string XMLNS_X_VCARD_UPDATE = "vcard-temp:x:update"; + + const std::string XMLNS_BOOKMARKS = "storage:bookmarks"; + const std::string XMLNS_ANNOTATIONS = "storage:rosternotes"; + const std::string XMLNS_ROSTER_DELIMITER = "roster:delimiter"; + const std::string XMLNS_XMPP_PING = "urn:xmpp:ping"; + const std::string XMLNS_SI = "http://jabber.org/protocol/si"; + + const std::string XMLNS_SI_FT = "http://jabber.org/protocol/si/profile/file-transfer"; + const std::string XMLNS_BYTESTREAMS = "http://jabber.org/protocol/bytestreams"; + const std::string XMLNS_MUC = "http://jabber.org/protocol/muc"; + const std::string XMLNS_MUC_USER = "http://jabber.org/protocol/muc#user"; + const std::string XMLNS_MUC_ADMIN = "http://jabber.org/protocol/muc#admin"; + + const std::string XMLNS_MUC_UNIQUE = "http://jabber.org/protocol/muc#unique"; + const std::string XMLNS_MUC_OWNER = "http://jabber.org/protocol/muc#owner"; + const std::string XMLNS_MUC_ROOMINFO = "http://jabber.org/protocol/muc#roominfo"; + const std::string XMLNS_MUC_ROOMS = "http://jabber.org/protocol/muc#rooms"; + const std::string XMLNS_MUC_REQUEST = "http://jabber.org/protocol/muc#request"; + + const std::string XMLNS_PUBSUB = "http://jabber.org/protocol/pubsub"; + const std::string XMLNS_PUBSUB_ERRORS = "http://jabber.org/protocol/pubsub#errors"; + const std::string XMLNS_PUBSUB_EVENT = "http://jabber.org/protocol/pubsub#event"; + const std::string XMLNS_PUBSUB_OWNER = "http://jabber.org/protocol/pubsub#owner"; + const std::string XMLNS_CAPS = "http://jabber.org/protocol/caps"; + + const std::string XMLNS_FT_FASTMODE = "http://affinix.com/jabber/stream"; + const std::string XMLNS_STREAM = "http://etherx.jabber.org/streams"; + const std::string XMLNS_XMPP_STREAM = "urn:ietf:params:xml:ns:xmpp-streams"; + const std::string XMLNS_XMPP_STANZAS = "urn:ietf:params:xml:ns:xmpp-stanzas"; + const std::string XMLNS_STREAM_TLS = "urn:ietf:params:xml:ns:xmpp-tls"; + + const std::string XMLNS_STREAM_SASL = "urn:ietf:params:xml:ns:xmpp-sasl"; + const std::string XMLNS_STREAM_BIND = "urn:ietf:params:xml:ns:xmpp-bind"; + const std::string XMLNS_STREAM_SESSION = "urn:ietf:params:xml:ns:xmpp-session"; + const std::string XMLNS_STREAM_IQAUTH = "http://jabber.org/features/iq-auth"; + const std::string XMLNS_STREAM_IQREGISTER = "http://jabber.org/features/iq-register"; + + const std::string XMLNS_STREAM_COMPRESS = "http://jabber.org/features/compress"; + const std::string XMLNS_HTTPBIND = "http://jabber.org/protocol/httpbind"; + const std::string XMLNS_XMPP_BOSH = "urn:xmpp:xbosh"; + const std::string XMLNS_RECEIPTS = "urn:xmpp:receipts"; + const std::string XMLNS_NICKNAME = "http://jabber.org/protocol/nick"; + + const std::string XMLNS_JINGLE = "urn:xmpp:jingle:1"; + const std::string XMLNS_JINGLE_ERRORS = "urn:xmpp:jingle:errors:1"; + const std::string XMLNS_JINGLE_ICE_UDP = "urn:xmpp:jingle:transports:ice-udp:1"; + const std::string XMLNS_JINGLE_FILE_TRANSFER = "urn:xmpp:jingle:apps:file-transfer:3"; + const std::string XMLNS_JINGLE_FILE_TRANSFER_MULTI = "urn:xmpp:jingle:apps:file-transfer:multi"; + + const std::string XMLNS_SHIM = "http://jabber.org/protocol/shim"; + const std::string XMLNS_ATTENTION = "urn:xmpp:attention:0"; + const std::string XMLNS_STREAM_MANAGEMENT = "urn:xmpp:sm:3"; + const std::string XMLNS_STANZA_FORWARDING = "urn:xmpp:forward:0"; + const std::string XMLNS_MESSAGE_CARBONS = "urn:xmpp:carbons:2"; + + const std::string XMLNS_HASHES = "urn:xmpp:hashes:1"; + const std::string XMLNS_IODATA = "urn:xmpp:tmp:io-data"; + + const std::string XMPP_STREAM_VERSION_MAJOR = "1"; + const std::string XMPP_STREAM_VERSION_MINOR = "0"; + const std::string GLOOX_VERSION = "1.0.13"; + const std::string GLOOX_CAPS_NODE = "http://camaya.net/gloox"; + + const std::string XMLNS = "xmlns"; + const std::string TYPE = "type"; + const std::string EmptyString = ""; +} + +const char* gloox_version() +{ + return gloox::GLOOX_VERSION.c_str(); +} diff --git a/smack/smack/src/main/cpp/gloox/src/gloox.h b/smack/smack/src/main/cpp/gloox/src/gloox.h new file mode 100644 index 00000000..6702d3e9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/gloox.h @@ -0,0 +1,1273 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +/*! @mainpage gloox API Documentation + * + * @section contents Contents + * @ref intro_sec
    + * @ref handlers_sec
    + * @ref comp_sec
    + * @ref client_sec
    + * @ref block_conn_sec
    + * @ref roster_sec
    + * @ref privacy_sec
    + * @ref auth_sec
    + * @ref msg_sec
    + * @ref xeps_sec
    + * @ref filetransfer_sec
    + * @ref proxy_sec
    + * @ref upgrading_sec
    + *
    + * + * @section intro_sec Introduction + * + * The design of gloox follows the so-called observer pattern, which basically means that everything is + * event-driven. There are two ways you can connect to the Jabber/XMPP network using gloox, either as + * client or as component. For a C++ XMPP server library see . + * + * @note Section 11.5 of the XMPP specification (RFC 3290) requires that only UTF-8 is used as encoding + * for any traffic sent over the wire. Since gloox cannot know which encoding is used in any given input, + * it is a requirement that any input to gloox is valid UTF-8. + * + * @section handlers_sec Event Handlers + * + * The most important tools of gloox are the event handlers. Currently, there exist 4 handlers for + * the basic protocol as defined in the RFCs, as well as numerous handlers for events generated by + * the included XEP-implementations and for additional functionality. Additionally, a log handler, + * a generic tag handler and a handler for connection events are available. + * + * Basically these handlers are virtual interfaces from which you derive a class and implement a few + * virtual functions. Then you register such an object with the respective protocol implementation. A + * short example: + * @code + * class MyClass : public PresenceHandler + * { + * public: + * // reimplemented from PresenceHandler + * virtual void handlePresence( const Presence& presence ); + * + * [...] + * }; + * + * void MyClass::handlePresence( const Presence& presence ) + * { + * // extract further information from the Presence object + * } + * @endcode + * + * Somewhere else you do something like this: + * @code + * OtherClass::doSomething() + * { + * Client* client = new Client( ... ); + * [...] + * MyClass* handler = new MyClass( ... ); + * client->registerPresenceHandler( handler ); + * } + * @endcode + * + * Now, every time a presence stanza (not subscription stanza) is received, handlePresence() is called + * with the current stanza as argument. You can then use the extensive getters of the Stanza class to + * extract stanza data. + * + * This works similar for all the other event handlers. + * Another example, this time using the connection event handler (class @link gloox::ConnectionListener + * ConnectionListener @endlink): + * @code + * class MyClass : public ConnectionListener + * { + * public: + * virtual void onConnect(); + * + * virtual bool onTLSConnect( ... ); + * }; + * + * void MyClass::onConnect() + * { + * // do something when the connection is established + * } + * + * bool MyClass::onTLSConnect( const CertInfo& info ) + * { + * // decide whether you trust the certificate, examine the CertInfo structure + * return true; // if you trust it, otherwise return false + * } + * @endcode + * + * @note The ConnectionListener interface is a peculiarity. You MUST re-implement + * @link gloox::ConnectionListener::onTLSConnect() ConnectionListener::onTLSConnect() @endlink if + * you want to be able to connect successfully to TLS/SSL enabled servers. Even though gloox tries + * to verify the server's certificate it does not automatically trust a server. The client's programmer + * and/or user have to decide whether to trust a server or not. This trust is expressed by the return + * value of onTLSConnect(). @b False means you don't trust the server/certificate and as a consequence + * the connection is dropped immediately. + * + * @section comp_sec Components + * + * A component in the Jabber/XMPP network is an add-on to a server which runs externally + * to the actual server software, but can have similar privileges. Components use a protocol described in + * @xep{0114} to connect and authenticate to a server. + * + * The @link gloox::Component Component @endlink class supports this protocol and can be used to create + * a new Jabber component. It's as simple as: + * @code + * Component* comp = new Component( ... ); + * comp->connect(); + * @endcode + * + * @section client_sec Clients + * + * A client can be an end-user's chat client, a bot, or a similar entity not tied to a particular + * server. The @link gloox::Client Client @endlink class implements the necessary functionality to + * connect to an XMPP server. Usage is, again, pretty simple: + * @code + * class MyClass : public ConnectionListener, PresenceHandler + * { + * public: + * void doSomething(); + * + * virtual void handlePresence( ... ); + * + * virtual void onConnect(); + * + * virtual bool onTLSConnect( const CertInfo& info ); + * }; + * + * void MyClass::doSomething() + * { + * JID jid( "jid@server/resource" ); + * Client* client = new Client( jid, "password" ); + * client->registerConnectionListener( this ); + * client->registerPresenceHandler( this ); + * client->connect(); + * } + * + * void MyClass::onConnect() + * { + * // connection established, auth done (see API docs for exceptions) + * } + * + * bool MyClass::onTLSConnect( const CertInfo& info ) + * { + * // examine certificate info + * } + * + * void MyClass::handlePresence( Presence* presence ) + * { + * // presence info + * } + * @endcode + * + * @note gloox does not officially support the style of connection which is usually used on port + * 5223, i.e. SSL encryption before any XML is sent, because it's a legacy method and not standard XMPP. + * However, gloox includes a ConnectionTLS class that, as a side-effect, allows you to establish such + * connections. + * + * @note @link gloox::Client::connect() Client::connect() @endlink by default blocks until the + * connection ends (either @link gloox::Client::disconnect() Client::disconnect() @endlink is called + * or the server closes the connection). + * + * @section block_conn_sec Blocking vs. Non-blocking Connections + * + * For some kind of bots a blocking connection (the default behaviour) is ideal. All the bot does is + * react to events coming from the server. However, for end user clients or anything with a GUI this + * is far from perfect. + * + * In these cases non-blocking connections can be used. If + * @link gloox::ClientBase::connect() ClientBase::connect( false ) @endlink is + * called, the function returnes immediately after the connection has been established. It is then + * the resposibility of the programmer to initiate receiving of data from the socket. + * + * The easiest way is to call @link gloox::ClientBase::recv() ClientBase::recv() @endlink + * periodically with the desired timeout (in microseconds) as parameter. The default value of -1 + * means the call blocks until any data was received, which is then parsed automatically. + * + * As an alternative to periodic polling you can get a hold of the raw file descriptor used for the + * connection. You can then use select() on it and use + * @link gloox::ClientBase::recv() ClientBase::recv() @endlink when select indicates that data is + * available. You should @b not recv() any data from the file descriptor directly as there is no + * way to feed that back into the parser. + * + * To get the file descriptor you'll need to set a connection class (e.g. an instance of + * @link gloox::ConnectionTCPClient ConnectionTCPClient @endlink) manually, like so: + * + * @code + * Client* client = new Client( ... ); + * ConnectionTCPClient* conn = new ConnectionTCPClient( client, client->logInstance(), server, port ); + * client->setConnectionImpl( conn ); + * + * client->connect( false ); + * int sock = conn->socket(); + * + * [...] + * @endcode + * + * It would also be possible to fetch the fd like this: + * + * @code + * Client* client = new Client( ... ); + * client->connect( false ); + * int sock = static_cast( client->connectionImpl() )->socket(); + * + * [...] + * @endcode + * Obviously this will only work as long as you haven't set a different type of connection using setConnectionImpl(). + * + * @note This has changed in 0.9. ClientBase::fileDescriptor() is no longer available. + * + * @section roster_sec Roster Management + * + * Among others, RFC 3921 defines the protocol to manage one's contact list (roster). In gloox, the + * @link gloox::RosterManager RosterManager @endlink class implements this functionality. A few + * easy-to-use functions are available to subscribe to or unsubscribe from the presence of remote + * entities. It is also possible to add a contact to a roster without actually subscribing to the + * contacts presence. Additionally, the interface @link gloox::RosterListener RosterListener @endlink + * offers many callbacks for various roster-related events. + * + * If you create a Client object as shown above, you also get a RosterManager for free. + * @link gloox::Client::rosterManager() Client::rosterManager() @endlink returns a pointer to the + * object. + * + * @section privacy_sec Privacy Lists + * + * Also defined in RFC 3921: Privacy Lists. A Privacy List can be used to explicitely block or allow + * sending of stanzas from and to contacts, respectively. You can define rules based on JID, stanza type, + * etc. The @link gloox::PrivacyManager PrivacyManager @endlink class and the + * @link gloox::PrivacyListHandler PrivacyListHandler @endlink virtual interface allow for full + * flexibility in Privacy List handling. + * + * @code + * PrivacyManager* p = new PrivacyManager( ... ); + * [...] + * PrivacyListHandler::PrivacyList list; + * PrivacyItem item( PrivacyItem::TypeJid, PrivacyItem::ActionDeny, + * PrivacyItem::PacketMessage, "me@there.com" ); + * list.push_back( item ); + * + * PrivacyItem item2( PrivacyItem::TypeJid, PrivacyItem::ActionAllow, + * PrivacyItem::PacketIq, "me@example.org" ); + * list.push_back( item2 ); + * + * p->store( "myList", list ); + * @endcode + * + * @section auth_sec Authentication + * + * gloox supports old-style IQ-based authentication defined in @xep{0078} as well as several SASL mechanisms. + * See the documentation of the @link gloox::Client Client @endlink class for more information. + * + * @section msg_sec Sending and Receiving of Chat Messages + * + * For Messaging it is recommended to use the MessageSession interface. It handles sending and receiving + * of messages as well as message events and chat states (such as typing notifications, etc.). See + * @link gloox::MessageSession MessageSession @endlink for more details. + * + * @section xeps_sec Protocol Extensions (XEPs) + * + * The XMPP Standards Foundation has published a number of extensions to the core protocols, called + * XMPP Extension Protocols (XEPs). A couple of these XEPs are implemented in gloox: + * + * @li @xep{0004} @link gloox::DataForm Data Forms @endlink + * @li @xep{0012} @link gloox::LastActivity Last Activity @endlink + * @li @xep{0013} @link gloox::FlexibleOffline Flexible Offline Message Retrieval @endlink + * @li @xep{0022} Message Events (see @link gloox::MessageSession MessageSession @endlink for examples) + * @li @xep{0027} Current Jabber OpenPGP Usage (see @link gloox::GPGSigned GPGSigned @endlink + * and @link gloox::GPGEncrypted GPGEncrypted @endlink) + * @li @xep{0030} @link gloox::Disco Service Discovery @endlink + * @li @xep{0045} @link gloox::MUCRoom Multi-User Chat @endlink + * @li @xep{0047} Used with @ref filetransfer_sec + * @li @xep{0048} @link gloox::BookmarkStorage Bookmark Storage @endlink + * @li @xep{0049} @link gloox::PrivateXML Private XML Storage @endlink + * @li @xep{0050} @link gloox::Adhoc Ad-hoc Commands @endlink + * @li @xep{0054} @link gloox::VCardManager vcard-temp @endlink + * @li @xep{0060} @link gloox::PubSub::Manager Publish-Subscribe @endlink + * @li @xep{0065} @link gloox::SOCKS5BytestreamManager SOCKS5 Bytestreams @endlink, used with + * @ref filetransfer_sec and @ref proxy_sec + * @li @xep{0066} @link gloox::OOB Out of Band Data @endlink, also used with @ref filetransfer_sec + * @li @xep{0077} @link gloox::Registration In-Band Registration @endlink + * @li @xep{0078} Non-SASL Authentication (automatically used if the server does not support SASL) + * @li @xep{0079} @link gloox::AMP Advanced Message Processing @endlink + * @li @xep{0083} Nested Roster Groups (automatically used if supported by the server. see + * @link gloox::RosterManager::delimiter() RosterManager @endlink) + * @li @xep{0085} Chat State Notifications (see @link gloox::MessageSession MessageSession @endlink for + * examples) + * @li @xep{0091} @link gloox::DelayedDelivery Delayed Delivery @endlink (old spec) + * @li @xep{0092} Software Version (integrated into @link gloox::Disco Service Discovery @endlink) + * @li @xep{0095} @link gloox::SIManager Stream Initiation @endlink, used with @ref filetransfer_sec + * @li @xep{0096} @ref filetransfer_sec + * @li @xep{0106} @link gloox::JID::escapeNode() JID Escaping @endlink + * @li @xep{0114} @link gloox::Component Jabber Component Protocol @endlink + * @li @xep{0115} @link gloox::Capabilities Entity Capabilities @endlink (used automatically internally) + * @li @xep{0124} @link gloox::ConnectionBOSH Bidirectional-streams Over Synchronous HTTP (BOSH) @endlink + * @li @xep{0131} @link gloox::SHIM Stanza Headers and Internet Metadata @endlink + * @li @xep{0138} Stream Compression (used automatically if gloox is compiled with zlib and if the server + * supports it) + * @li @xep{0145} @link gloox::Annotations Annotations @endlink + * @li @xep{0153} @link gloox::VCardUpdate vCard-based Avatars @endlink + * @li @xep{0166} @link gloox::Jingle::SessionManager Jingle @endlink + * @li @xep{0172} @link gloox::Nickname User Nickname @endlink + * @li @xep{0174} @link gloox::LinkLocal::Manager Link-local Messaging @endlink + * @li @xep{0176} @link gloox::Jingle::ICEUDP Jingle ICE-UDP Transport Method @endlink + * @li @xep{0184} @link gloox::Receipt Message Receipts @endlink + * @li @xep{0198} Stream Management (integrated into @link gloox::Client @endlink) + * @li @xep{0199} @link gloox::ClientBase::xmppPing() XMPP Ping @endlink + * @li @xep{0203} @link gloox::DelayedDelivery Delayed Delivery @endlink (new spec) + * @li @xep{0206} @link gloox::ConnectionBOSH see BOSH @endlink + * @li @xep{0224} @link gloox::Attention Attention @endlink + * @li @xep{0234} @link gloox::Jingle::FileTransfer Jingle File Transfer @endlink + * @li @xep{0256} @link gloox::LastActivity::Query Last Activity in Presence @endlink + * @li @xep{0280} @link gloox::Carbons Message Carbons @endlink + * @li @xep{0297} @link gloox::Forward Stanza Forwarding @endlink + * + * Further extensions can easily be implemented using + * @link gloox::StanzaExtension StanzaExtensions @endlink. + * + * @section filetransfer_sec File Transfer + * + * For file transfer, gloox implements @xep{0095} (Stream Initiation) as well @xep{0096} (File Transfer) + * for the signalling, and @xep{0065} (SOCKS5 Bytestreams) as well as @xep{0047} (In-Band Bytestreams) + * for the transport. See @link gloox::SIProfileFT SIProfileFT @endlink. + * + * @section proxy_sec HTTP and SOCKS5 Proxy support + * + * gloox is capable of traversing HTTP as well as SOCKS5 proxies, even chained. See + * @link gloox::ConnectionHTTPProxy ConnectionHTTPProxy @endlink and + * @link gloox::ConnectionSOCKS5Proxy ConnectionSOCKS5Proxy @endlink. + * + * @section upgrading_sec Upgrading from earlier versions + * + * See Upgrading. + * + */ + +#ifndef GLOOX_H__ +#define GLOOX_H__ + +#include "macros.h" + +#include +#include +#include + +/** + * @brief The namespace for the gloox library. + * + * @author Jakob Schröter + * @since 0.3 + */ +namespace gloox +{ + /** Client namespace (RFC 3920)*/ + GLOOX_API extern const std::string XMLNS_CLIENT; + + /** Component Accept namespace (@xep{0114}) */ + GLOOX_API extern const std::string XMLNS_COMPONENT_ACCEPT; + + /** Component Connect namespace (@xep{0114}) */ + GLOOX_API extern const std::string XMLNS_COMPONENT_CONNECT; + + /** Service Discovery Info namespace (@xep{0030}) */ + GLOOX_API extern const std::string XMLNS_DISCO_INFO; + + /** Service Discovery Items namespace (@xep{0030}) */ + GLOOX_API extern const std::string XMLNS_DISCO_ITEMS; + + /** Service Discovery Publish namespace (@xep{0030}) */ + GLOOX_API extern const std::string XMLNS_DISCO_PUBLISH; + + /** Adhoc Commands namespace (@xep{0050}) */ + GLOOX_API extern const std::string XMLNS_ADHOC_COMMANDS; + + /** Stream Compression namespace (@xep{0138}) */ + GLOOX_API extern const std::string XMLNS_COMPRESSION; + + /** Flexible Offline Message Retrieval (@xep{0013}) */ + GLOOX_API extern const std::string XMLNS_OFFLINE; + + /** Chat State Notifications namespace (@xep{0085}) */ + GLOOX_API extern const std::string XMLNS_CHAT_STATES; + + /** Advanced Message Processing (@xep{0079}) */ + GLOOX_API extern const std::string XMLNS_AMP; + + /** In-Band Bytestreams namespace (@xep{0047}) */ + GLOOX_API extern const std::string XMLNS_IBB; + + /** Feature Negotiation namespace (@xep{0020}) */ + GLOOX_API extern const std::string XMLNS_FEATURE_NEG; + + /** Chat Session Negotiation namespace (@xep{0155}) */ + GLOOX_API extern const std::string XMLNS_CHATNEG; + + /** XHTML-IM namespace (@xep{0071}) */ + GLOOX_API extern const std::string XMLNS_XHTML_IM; + + /** Delayed Delivery namespace (@xep{0203}) */ + GLOOX_API extern const std::string XMLNS_DELAY; + + /** Roster namespace (RFC 3921) */ + GLOOX_API extern const std::string XMLNS_ROSTER; + + /** Software Version namespace (@xep{0092}) */ + GLOOX_API extern const std::string XMLNS_VERSION; + + /** In-Band Registration namespace (@xep{0077}) */ + GLOOX_API extern const std::string XMLNS_REGISTER; + + /** Privacy lists namespace (RFC 3921) */ + GLOOX_API extern const std::string XMLNS_PRIVACY; + + /** Non-SASL Authentication namespace (@xep{0078}) */ + GLOOX_API extern const std::string XMLNS_AUTH; + + /** Private XML Storage namespace (@xep{0049}) */ + GLOOX_API extern const std::string XMLNS_PRIVATE_XML; + + /** Last Activity namespace (@xep{0012}) */ + GLOOX_API extern const std::string XMLNS_LAST; + + /** Jabber Search namespace (@xep{0055}) */ + GLOOX_API extern const std::string XMLNS_SEARCH; + + /** Out of Band Data (IQ) namespace (@xep{0066}) */ + GLOOX_API extern const std::string XMLNS_IQ_OOB; + + /** Data Forms namespace (@xep{0004}) */ + GLOOX_API extern const std::string XMLNS_X_DATA; + + /** Message Events (@xep{0022}) */ + GLOOX_API extern const std::string XMLNS_X_EVENT; + + /** Out of Band Data (X) namespace (@xep{0066}) */ + GLOOX_API extern const std::string XMLNS_X_OOB; + + /** Delayed Delivery namespace (@xep{0091}) */ + GLOOX_API extern const std::string XMLNS_X_DELAY; + + /** Current Jabber OpenPGP Usage (Sign.) (@xep{0027}) */ + GLOOX_API extern const std::string XMLNS_X_GPGSIGNED; + + /** Current Jabber OpenPGP Usage (Enc.) (@xep{0027}) */ + GLOOX_API extern const std::string XMLNS_X_GPGENCRYPTED; + + /** vcard-temp namespace (@xep{0054}) */ + GLOOX_API extern const std::string XMLNS_VCARD_TEMP; + + /** vCard-Based Avatars namespace (@xep{0153}) */ + GLOOX_API extern const std::string XMLNS_X_VCARD_UPDATE; + + /** Bookmark Storage namespace (@xep{0048}) */ + GLOOX_API extern const std::string XMLNS_BOOKMARKS; + + /** Annotations namespace (@xep{0145}) */ + GLOOX_API extern const std::string XMLNS_ANNOTATIONS; + + /** Nested Roster Groups namespace (@xep{0083}) */ + GLOOX_API extern const std::string XMLNS_ROSTER_DELIMITER; + + /** XMPP Ping namespace (@xep{0199}) */ + GLOOX_API extern const std::string XMLNS_XMPP_PING; + + /** Stream Initiation namespace (@xep{0095}) */ + GLOOX_API extern const std::string XMLNS_SI; + + /** File transfer profile of Stream Initiation (@xep{0096}) */ + GLOOX_API extern const std::string XMLNS_SI_FT; + + /** SOCKS5 Bytestreams namespace (@xep{0065}) */ + GLOOX_API extern const std::string XMLNS_BYTESTREAMS; + + /** Multi-User Chat namespace (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC; + + /** Multi-User Chat namespace (user) (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC_USER; + + /** Multi-User Chat namespace (admin) (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC_ADMIN; + + /** Multi-User Chat namespace (unique) (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC_UNIQUE; + + /** Multi-User Chat namespace (owner) (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC_OWNER; + + /** Multi-User Chat namespace (roominfo) (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC_ROOMINFO; + + /** Multi-User Chat namespace (rooms) (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC_ROOMS; + + /** Multi-User Chat namespace (request) (@xep{0045}) */ + GLOOX_API extern const std::string XMLNS_MUC_REQUEST; + + /** PubSub namespace (@xep{0060}) */ + GLOOX_API extern const std::string XMLNS_PUBSUB; + + /** PubSub namespace (errors) (@xep{0060}) */ + GLOOX_API extern const std::string XMLNS_PUBSUB_ERRORS; + + /** PubSub namespace (event) (@xep{0060}) */ + GLOOX_API extern const std::string XMLNS_PUBSUB_EVENT; + + /** PubSub namespace (owner) (@xep{0060}) */ + GLOOX_API extern const std::string XMLNS_PUBSUB_OWNER; + + /** Entity Capabilities namespace (@xep{0115}) */ + GLOOX_API extern const std::string XMLNS_CAPS; + + /** SOCKS5 Fast Mode namespace */ + GLOOX_API extern const std::string XMLNS_FT_FASTMODE; + + /** XMPP stream namespace (RFC 3920) */ + GLOOX_API extern const std::string XMLNS_STREAM; + + /** XMPP stream namespace (RFC 3920) */ + GLOOX_API extern const std::string XMLNS_XMPP_STREAM; + + /** XMPP stanzas namespace (RFC 3920) */ + GLOOX_API extern const std::string XMLNS_XMPP_STANZAS; + + /** TLS Stream Feature namespace (RFC 3920) */ + GLOOX_API extern const std::string XMLNS_STREAM_TLS; + + /** SASL Stream Feature namespace (RFC 3920) */ + GLOOX_API extern const std::string XMLNS_STREAM_SASL; + + /** Resource Bind Stream Feature (RFC 3921) */ + GLOOX_API extern const std::string XMLNS_STREAM_BIND; + + /** Session Create Stream Feature (RFC 3921) */ + GLOOX_API extern const std::string XMLNS_STREAM_SESSION; + + /** Non-SASL Auth. Stream Feature (@xep{0078}) */ + GLOOX_API extern const std::string XMLNS_STREAM_IQAUTH; + + /** In-Band Registration namespace (@xep{0077}) */ + GLOOX_API extern const std::string XMLNS_STREAM_IQREGISTER; + + /** Stream Compression Feature namespace (@xep{0138}) */ + GLOOX_API extern const std::string XMLNS_STREAM_COMPRESS; + + /** General HTTP binding (BOSH) namespace (@xep{0124}) */ + GLOOX_API extern const std::string XMLNS_HTTPBIND; + + /** XMPP-over-BOSH extensions (@xep{0206}) */ + GLOOX_API extern const std::string XMLNS_XMPP_BOSH; + + /** Message Receipt namespace (@xep{0184}) */ + GLOOX_API extern const std::string XMLNS_RECEIPTS; + + /** Message Receipt namespace (@xep{0172}) */ + GLOOX_API extern const std::string XMLNS_NICKNAME; + + /** Jabber RPC namespace (@xep{0009}) */ + GLOOX_API extern const std::string XMLNS_JABBER_RPC; + + /** Jingle namespace (@xep{0166}) */ + GLOOX_API extern const std::string XMLNS_JINGLE; + + /** Jingle error namespace (@xep{0166}) */ + GLOOX_API extern const std::string XMLNS_JINGLE_ERRORS; + + /** Jingle ICE-UDP Transport namespace (@xep{0176}) */ + GLOOX_API extern const std::string XMLNS_JINGLE_ICE_UDP; + + /** Jingle File Transfer namespace (@xep{0234}) */ + GLOOX_API extern const std::string XMLNS_JINGLE_FILE_TRANSFER; + + /** Jingle File Transfer namespace (multiple files) (@xep{0234}) */ + GLOOX_API extern const std::string XMLNS_JINGLE_FILE_TRANSFER_MULTI; + + /** Stanza Headers and Internet Metadata (SHIM) namespace (@xep{0131}) */ + GLOOX_API extern const std::string XMLNS_SHIM; + + /** Attention namespace (@xep{0224}) */ + GLOOX_API extern const std::string XMLNS_ATTENTION; + + /** Stream Management namespace (@xep{0198}) */ + GLOOX_API extern const std::string XMLNS_STREAM_MANAGEMENT; + + /** Stanza Forwarding namespace (@xep{0297}) */ + GLOOX_API extern const std::string XMLNS_STANZA_FORWARDING; + + /** Message Carbons namespace (@xep{0280}) */ + GLOOX_API extern const std::string XMLNS_MESSAGE_CARBONS; + + /** Use of Cryptographic Hash Functions in XMPP namespace (@xep{0300}) */ + GLOOX_API extern const std::string XMLNS_HASHES; + + /** IO Data (@xep 0244) */ + GLOOX_API extern const std::string XMLNS_IODATA; + + /** Supported stream version (major). */ + GLOOX_API extern const std::string XMPP_STREAM_VERSION_MAJOR; + + /** Supported stream version (minor). */ + GLOOX_API extern const std::string XMPP_STREAM_VERSION_MINOR; + + /** gloox version */ + GLOOX_API extern const std::string GLOOX_VERSION; + + /** gloox caps node */ + GLOOX_API extern const std::string GLOOX_CAPS_NODE; + + /** A string containing "xmlns". */ + GLOOX_API extern const std::string XMLNS; + + /** A string containing "type". */ + GLOOX_API extern const std::string TYPE; + + /** An empty string. */ + GLOOX_API extern const std::string EmptyString; + + /** + * This describes the possible states of a stream. + */ + enum ConnectionState + { + StateDisconnected, /**< The client is in disconnected state. */ + StateConnecting, /**< The client is currently trying to establish a connection. */ + StateConnected /**< The client is connected to the server but authentication is not + * (yet) done. */ + }; + + /** + * Describes stream events that get emitted by means of ConnectionListener::onStreamEvent(). + * @since 0.9 + */ + enum StreamEvent + { + StreamEventConnecting, /**< The Client is about to initaite the connection. */ + StreamEventEncryption, /**< The Client is about to negotiate encryption. */ + StreamEventCompression, /**< The Client is about to negotiate compression. */ + StreamEventAuthentication, /**< The Client is about to authenticate. */ + StreamEventSessionInit, /**< The Client is about to create a session. */ + StreamEventResourceBinding, /**< The Client is about to bind a resource to the stream. */ + StreamEventSMEnable, /**< The Client is about to request Stream Management (@xep{0198}). + * @since 1.0.4 */ + StreamEventSMResume, /**< The Client is about to request resumption by means of Stream Management + * (@xep{0198}). + * @since 1.0.4 */ + StreamEventSMResumed, /**< The stream has successfully been resumed by means of Stream Management + * (@xep{0198}). + * @since 1.0.4 */ + StreamEventSMEnableFailed, /**< The attempt to enable Stream Management + * (@xep{0198}) failed. This is not critical. + * @since 1.0.4 */ + StreamEventSMResumeFailed, /**< The attempt to resume an aborted session by means of Stream Management + * (@xep{0198}) failed. This is not critical. + * @since 1.0.4 */ + StreamEventSessionCreation, /**< The Client is about to create a session. + * @since 0.9.1 */ + StreamEventRoster, /**< The Client is about to request the roster. */ + StreamEventFinished /**< The log-in phase is completed. */ + }; + + /** + * This describes connection error conditions. + */ + enum ConnectionError + { + ConnNoError, /**< Not really an error. Everything went just fine. */ + ConnStreamError, /**< A stream error occured. The stream has been closed. + * Use ClientBase::streamError() to find the reason. */ + ConnStreamVersionError, /**< The incoming stream's version is not supported */ + ConnStreamClosed, /**< The stream has been closed (by the server). */ + ConnProxyAuthRequired, /**< The HTTP/SOCKS5 proxy requires authentication. + * @since 0.9 */ + ConnProxyAuthFailed, /**< HTTP/SOCKS5 proxy authentication failed. + * @since 0.9 */ + ConnProxyNoSupportedAuth, /**< The HTTP/SOCKS5 proxy requires an unsupported auth mechanism. + * @since 0.9 */ + ConnIoError, /**< An I/O error occured. */ + ConnParseError, /**< An XML parse error occurred. */ + ConnConnectionRefused, /**< The connection was refused by the server (on the socket level). + * @since 0.9 */ + ConnDnsError, /**< Resolving the server's hostname failed. + * @since 0.9 */ + ConnOutOfMemory, /**< Out of memory. Uhoh. */ + ConnNoSupportedAuth, /**< The auth mechanisms the server offers are not supported + * or the server offered no auth mechanisms at all. */ + ConnTlsFailed, /**< The server's certificate could not be verified or the TLS + * handshake did not complete successfully. */ + ConnTlsNotAvailable, /**< The server didn't offer TLS while it was set to be required, + * or TLS was not compiled in. + * @since 0.9.4 */ + ConnCompressionFailed, /**< Negotiating/initializing compression failed. + * @since 0.9 */ + ConnAuthenticationFailed, /**< Authentication failed. Username/password wrong or account does + * not exist. Use ClientBase::authError() to find the reason. */ + ConnUserDisconnected, /**< The user (or higher-level protocol) requested a disconnect. */ + ConnNotConnected /**< There is no active connection. */ + }; + + /** + * ClientBase's policy regarding TLS usage. Use with ClientBase::setTls(). + */ + enum TLSPolicy + { + TLSDisabled, /**< Don't use TLS. */ + TLSOptional, /**< Use TLS if compiled in and offered by the server. */ + TLSRequired /**< Don't attempt to log in if the server didn't offer TLS + * or if TLS was not compiled in. Disconnect error will be + * ConnTlsNotAvailable. */ + }; + + /** + * Supported Stream Features. + */ + enum StreamFeature + { + StreamFeatureBind = 1, /**< The server supports resource binding. */ + StreamFeatureUnbind = 2, /**< The server supports binding multiple resources. */ + StreamFeatureSession = 4, /**< The server supports sessions. */ + StreamFeatureStartTls = 8, /**< The server supports <starttls>. */ + StreamFeatureIqRegister = 16, /**< The server supports @xep{0077} (In-Band + * Registration). */ + StreamFeatureIqAuth = 32, /**< The server supports @xep{0078} (Non-SASL + * Authentication). */ + StreamFeatureCompressZlib = 64, /**< The server supports @xep{0138} (Stream + * Compression) (Zlib). */ + StreamFeatureCompressDclz = 128, /**< The server supports @xep{0138} (Stream + * Compression) (LZW/DCLZ). */ + StreamFeatureStreamManagement = 256 /**< The server supports @xep{0198} (Stream Management). */ + // SaslMechanism below must be adjusted accordingly. + }; + + /** + * Supported SASL mechanisms. + */ + // must be adjusted with changes to StreamFeature enum above + enum SaslMechanism + { + SaslMechNone = 0, /**< Invalid SASL Mechanism. */ + SaslMechScramSha1 = 2048, /**< SASL SCRAM-SHA-1-PLUS accroding to RFC 5801 */ + SaslMechScramSha1Plus = 1024, /**< SASL SCRAM-SHA-1 accroding to RFC 5801 */ + SaslMechDigestMd5 = 4096, /**< SASL Digest-MD5 according to RFC 2831. */ + SaslMechPlain = 8192, /**< SASL PLAIN according to RFC 2595 Section 6. */ + SaslMechAnonymous = 16384, /**< SASL ANONYMOUS according to draft-ietf-sasl-anon-05.txt/ + * RFC 2245 Section 6. */ + SaslMechExternal = 32768, /**< SASL EXTERNAL according to RFC 2222 Section 7.4. */ + SaslMechGssapi = 65536, /**< SASL GSSAPI (Win32 only). */ + SaslMechNTLM = 131072, /**< SASL NTLM (Win32 only). */ + SaslMechAll = 262143 /**< Includes all supported SASL mechanisms. */ + }; + + /** + * This decribes stream error conditions as defined in RFC 3920 Sec. 4.7.3. + */ + enum StreamError + { + StreamErrorBadFormat, /**< The entity has sent XML that cannot be processed; + * this error MAY be used instead of the more specific XML-related + * errors, such as <bad-namespace-prefix/>, <invalid-xml/>, + * <restricted-xml/>, <unsupported-encoding/>, and + * <xml-not-well-formed/>, although the more specific errors are + * preferred. */ + StreamErrorBadNamespacePrefix, /**< The entity has sent a namespace prefix that is unsupported, or has + * sent no namespace prefix on an element that requires such a prefix + * (see XML Namespace Names and Prefixes (Section 11.2)). */ + StreamErrorConflict, /**< The server is closing the active stream for this entity because a + * new stream has been initiated that conflicts with the existing + * stream. */ + StreamErrorConnectionTimeout, /**< The entity has not generated any traffic over the stream for some + * period of time (configurable according to a local service policy).*/ + StreamErrorHostGone, /**< the value of the 'to' attribute provided by the initiating entity + * in the stream header corresponds to a hostname that is no longer + * hosted by the server.*/ + StreamErrorHostUnknown, /**< The value of the 'to' attribute provided by the initiating entity + * in the stream header does not correspond to a hostname that is hosted + * by the server. */ + StreamErrorImproperAddressing, /**< A stanza sent between two servers lacks a 'to' or 'from' attribute + * (or the attribute has no value). */ + StreamErrorInternalServerError, /**< the server has experienced a misconfiguration or an + * otherwise-undefined internal error that prevents it from servicing the + * stream. */ + StreamErrorInvalidFrom, /**< The JID or hostname provided in a 'from' address does not match an + * authorized JID or validated domain negotiated between servers via SASL + * or dialback, or between a client and a server via authentication and + * resource binding.*/ + StreamErrorInvalidId, /**< The stream ID or dialback ID is invalid or does not match an ID + * previously provided. */ + StreamErrorInvalidNamespace, /**< The streams namespace name is something other than + * "http://etherx.jabber.org/streams" or the dialback namespace name is + * something other than "jabber:server:dialback" (see XML Namespace Names + * and Prefixes (Section 11.2)). */ + StreamErrorInvalidXml, /**< The entity has sent invalid XML over the stream to a server that + * performs validation (see Validation (Section 11.3)). */ + StreamErrorNotAuthorized, /**< The entity has attempted to send data before the stream has been + * authenticated, or otherwise is not authorized to perform an action + * related to stream negotiation; the receiving entity MUST NOT process + * the offending stanza before sending the stream error. */ + StreamErrorPolicyViolation, /**< The entity has violated some local service policy; the server MAY + * choose to specify the policy in the <text/> element or an + * application-specific condition element. */ + StreamErrorRemoteConnectionFailed,/**< The server is unable to properly connect to a remote entity that + * is required for authentication or authorization. */ + StreamErrorResourceConstraint, /**< the server lacks the system resources necessary to service the + * stream. */ + StreamErrorRestrictedXml, /**< The entity has attempted to send restricted XML features such as a + * comment, processing instruction, DTD, entity reference, or unescaped + * character (see Restrictions (Section 11.1)). */ + StreamErrorSeeOtherHost, /**< The server will not provide service to the initiating entity but is + * redirecting traffic to another host; the server SHOULD specify the + * alternate hostname or IP address (which MUST be a valid domain + * identifier) as the XML character data of the <see-other-host/> + * element. */ + StreamErrorSystemShutdown, /**< The server is being shut down and all active streams are being + * closed. */ + StreamErrorUndefinedCondition, /**< The error condition is not one of those defined by the other + * conditions in this list; this error condition SHOULD be used only in + * conjunction with an application-specific condition. */ + StreamErrorUnsupportedEncoding, /**< The initiating entity has encoded the stream in an encoding that is + * not supported by the server (see Character Encoding (Section 11.5)). + */ + StreamErrorUnsupportedStanzaType,/**< The initiating entity has sent a first-level child of the stream + * that is not supported by the server. */ + StreamErrorUnsupportedVersion, /**< The value of the 'version' attribute provided by the initiating + * entity in the stream header specifies a version of XMPP that is not + * supported by the server; the server MAY specify the version(s) it + * supports in the <text/> element. */ + StreamErrorXmlNotWellFormed, /**< The initiating entity has sent XML that is not well-formed as + * defined by [XML]. */ + StreamErrorUndefined /**< An undefined/unknown error occured. Also used if a diconnect was + * user-initiated. Also set before and during a established connection + * (where obviously no error occured). */ + }; + + /** + * Describes types of stanza errors. + */ + enum StanzaErrorType + { + StanzaErrorTypeAuth, /**< Retry after providing credentials. */ + StanzaErrorTypeCancel, /**< Do not retry (the error is unrecoverable). */ + StanzaErrorTypeContinue, /**< Proceed (the condition was only a warning). */ + StanzaErrorTypeModify, /**< Retry after changing the data sent. */ + + StanzaErrorTypeWait, /**< Retry after waiting (the error is temporary). */ + StanzaErrorTypeUndefined /**< No error. */ + }; + + /** + * Describes the defined stanza error conditions of RFC 3920. + * Used by, eg., Stanza::error(). + */ + enum StanzaError + { + + StanzaErrorBadRequest, /**< The sender has sent XML that is malformed or that cannot be + * processed (e.g., an IQ stanza that includes an unrecognized value + * of the 'type' attribute); the associated error type SHOULD be + * "modify". */ + StanzaErrorConflict, /**< Access cannot be granted because an existing resource or session + * exists with the same name or address; the associated error type + * SHOULD be "cancel". */ + StanzaErrorFeatureNotImplemented,/**< The feature requested is not implemented by the recipient or + * server and therefore cannot be processed; the associated error + * type SHOULD be "cancel". */ + StanzaErrorForbidden, /**< The requesting entity does not possess the required permissions to + * perform the action; the associated error type SHOULD be "auth". */ + StanzaErrorGone, /**< The recipient or server can no longer be contacted at this address + * (the error stanza MAY contain a new address in the XML character data + * of the <gone/> element); the associated error type SHOULD be + * "modify". */ + StanzaErrorInternalServerError, /**< The server could not process the stanza because of a + * misconfiguration or an otherwise-undefined internal server error; the + * associated error type SHOULD be "wait". */ + StanzaErrorItemNotFound, /**< The addressed JID or item requested cannot be found; the associated + * error type SHOULD be "cancel". */ + StanzaErrorJidMalformed, /**< The sending entity has provided or communicated an XMPP address + * (e.g., a value of the 'to' attribute) or aspect thereof (e.g., a + * resource identifier) that does not adhere to the syntax defined in + * Addressing Scheme (Section 3); the associated error type SHOULD be + * "modify". */ + StanzaErrorNotAcceptable, /**< The recipient or server understands the request but is refusing to + * process it because it does not meet criteria defined by the recipient + * or server (e.g., a local policy regarding acceptable words in + * messages); the associated error type SHOULD be "modify". */ + StanzaErrorNotAllowed, /**< The recipient or server does not allow any entity to perform the + * action; the associated error type SHOULD be "cancel". */ + StanzaErrorNotAuthorized, /**< The sender must provide proper credentials before being allowed to + * perform the action, or has provided impreoper credentials; the + * associated error type should be "auth". */ + StanzaErrorNotModified, /**< The item requested has not changed since it was last requested; + * the associated error type SHOULD be "continue". */ + StanzaErrorPaymentRequired, /**< The requesting entity is not authorized to access the requested + * service because payment is required; the associated error type SHOULD + * be "auth". */ + StanzaErrorRecipientUnavailable,/**< The intended recipient is temporarily unavailable; the associated + * error type SHOULD be "wait" (note: an application MUST NOT return + * this error if doing so would provide information about the intended + * recipient's network availability to an entity that is not authorized + * to know such information). */ + StanzaErrorRedirect, /**< The recipient or server is redirecting requests for this + * information to another entity, usually temporarily (the error + * stanza SHOULD contain the alternate address, which MUST be a valid + * JID, in the XML character data of the <redirect/> element); + * the associated error type SHOULD be "modify". */ + StanzaErrorRegistrationRequired,/**< The requesting entity is not authorized to access the requested + * service because registration is required; the associated error type + * SHOULD be "auth". */ + StanzaErrorRemoteServerNotFound,/**< A remote server or service specified as part or all of the JID of + * the intended recipient does not exist; the associated error type + * SHOULD be "cancel". */ + StanzaErrorRemoteServerTimeout, /**< A remote server or service specified as part or all of the JID of + * the intended recipient (or required to fulfill a request) could not + * be contacted within a reasonable amount of time; the associated error + * type SHOULD be "wait". */ + StanzaErrorResourceConstraint, /**< The server or recipient lacks the system resources necessary to + * service the request; the associated error type SHOULD be "wait". */ + StanzaErrorServiceUnavailable, /**< The server or recipient does not currently provide the requested + * service; the associated error type SHOULD be "cancel". */ + StanzaErrorSubscribtionRequired,/**< The requesting entity is not authorized to access the requested + * service because a subscription is required; the associated error type + * SHOULD be "auth". */ + StanzaErrorUndefinedCondition, /**< The error condition is not one of those defined by the other + * conditions in this list; any error type may be associated with this + * condition, and it SHOULD be used only in conjunction with an + * application-specific condition. */ + StanzaErrorUnexpectedRequest, /**< The recipient or server understood the request but was not + * expecting it at this time (e.g., the request was out of order); + * the associated error type SHOULD be "wait". */ + StanzaErrorUnknownSender, /**< The stanza 'from' address specified by a connected client is not + * valid for the stream (e.g., the stanza does not include a 'from' + * address when multiple resources are bound to the stream); the + * associated error type SHOULD be "modify".*/ + StanzaErrorUndefined /**< No stanza error occured. */ + }; + + /** + * Describes the possible 'available presence' types. + */ +// enum Presence +// { +// PresenceUnknown, /**< Unknown status. */ +// PresenceAvailable, /**< The entity or resource is online and available. */ +// PresenceChat, /**< The entity or resource is actively interested in chatting. */ +// PresenceAway, /**< The entity or resource is temporarily away. */ +// PresenceDnd, /**< The entity or resource is busy (dnd = "Do Not Disturb"). */ +// PresenceXa, /**< The entity or resource is away for an extended period (xa = +// * "eXtended Away"). */ +// PresenceUnavailable /**< The entity or resource is offline. */ +// }; + + /** + * Describes the verification results of a certificate. + */ + enum CertStatus + { + CertOk = 0, /**< The certificate is valid and trusted. */ + CertInvalid = 1, /**< The certificate is not trusted. */ + CertSignerUnknown = 2, /**< The certificate hasn't got a known issuer. */ + CertRevoked = 4, /**< The certificate has been revoked. */ + CertExpired = 8, /**< The certificate has expired. */ + CertNotActive = 16, /**< The certifiacte is not yet active. */ + CertWrongPeer = 32, /**< The certificate has not been issued for the + * peer we're connected to. */ + CertSignerNotCa = 64 /**< The signer is not a CA. */ + }; + + /** + * Describes the certificate presented by the peer. + */ + struct CertInfo + { + int status; /**< Bitwise or'ed CertStatus or CertOK. */ + bool chain; /**< Determines whether the cert chain verified ok. */ + std::string issuer; /**< The name of the issuing entity.*/ + std::string server; /**< The server the certificate has been issued for. */ + int date_from; /**< The date from which onwards the certificate is valid + * (UNIX timestamp; UTC; not set when using OpenSSL). */ + int date_to; /**< The date up to which the certificate is valid + * (UNIX timestamp; UTC; not set when using OpenSSL). */ + std::string protocol; /**< The encryption protocol used for the connection. */ + std::string cipher; /**< The cipher used for the connection. */ + std::string mac; /**< The MAC used for the connection. */ + std::string compression; /**< The compression used for the connection. */ + }; + + /** + * Describes the defined SASL (and non-SASL) error conditions. + */ + enum AuthenticationError + { + AuthErrorUndefined, /**< No error occurred, or error condition is unknown. */ + SaslAborted, /**< The receiving entity acknowledges an <abort/> element sent + * by the initiating entity; sent in reply to the <abort/> + * element. */ + SaslIncorrectEncoding, /**< The data provided by the initiating entity could not be processed + * because the [BASE64] encoding is incorrect (e.g., because the encoding + * does not adhere to the definition in Section 3 of [BASE64]); sent in + * reply to a <response/> element or an <auth/> element with + * initial response data. */ + SaslInvalidAuthzid, /**< The authzid provided by the initiating entity is invalid, either + * because it is incorrectly formatted or because the initiating entity + * does not have permissions to authorize that ID; sent in reply to a + * <response/> element or an <auth/> element with initial + * response data.*/ + SaslInvalidMechanism, /**< The initiating entity did not provide a mechanism or requested a + * mechanism that is not supported by the receiving entity; sent in reply + * to an <auth/> element. */ + SaslMalformedRequest, /**< The request is malformed (e.g., the <auth/> element includes + * an initial response but the mechanism does not allow that); sent in + * reply to an <abort/>, <auth/>, <challenge/>, or + * <response/> element. */ + SaslMechanismTooWeak, /**< The mechanism requested by the initiating entity is weaker than + * server policy permits for that initiating entity; sent in reply to a + * <response/> element or an <auth/> element with initial + * response data. */ + SaslNotAuthorized, /**< The authentication failed because the initiating entity did not + * provide valid credentials (this includes but is not limited to the + * case of an unknown username); sent in reply to a <response/> + * element or an <auth/> element with initial response data. */ + SaslTemporaryAuthFailure, /**< The authentication failed because of a temporary error condition + * within the receiving entity; sent in reply to an <auth/> element + * or <response/> element. */ + NonSaslConflict, /**< @xep{0078}: Resource Conflict */ + NonSaslNotAcceptable, /**< @xep{0078}: Required Information Not Provided */ + NonSaslNotAuthorized /**< @xep{0078}: Incorrect Credentials */ + }; + + /** + * Identifies log sources. + */ + enum LogArea + { + LogAreaClassParser = 0x000001, /**< Log messages from Parser. */ + LogAreaClassConnectionTCPBase = 0x000002, /**< Log messages from ConnectionTCPBase. */ + LogAreaClassClient = 0x000004, /**< Log messages from Client. */ + LogAreaClassClientbase = 0x000008, /**< Log messages from ClientBase. */ + LogAreaClassComponent = 0x000010, /**< Log messages from Component. */ + LogAreaClassDns = 0x000020, /**< Log messages from DNS. */ + LogAreaClassConnectionHTTPProxy = 0x000040, /**< Log messages from ConnectionHTTPProxy */ + LogAreaClassConnectionSOCKS5Proxy = 0x000080, /**< Log messages from ConnectionSOCKS5Proxy */ + LogAreaClassConnectionTCPClient = 0x000100, /**< Log messages from ConnectionTCPClient. */ + LogAreaClassConnectionTCPServer = 0x000200, /**< Log messages from ConnectionTCPServer. */ + LogAreaClassS5BManager = 0x000400, /**< Log messages from SOCKS5BytestreamManager. */ + LogAreaClassSOCKS5Bytestream = 0x000800, /**< Log messages from SOCKS5Bytestream. */ + LogAreaClassConnectionBOSH = 0x001000, /**< Log messages from ConnectionBOSH */ + LogAreaClassConnectionTLS = 0x002000, /**< Log messages from ConnectionTLS */ + LogAreaLinkLocalManager = 0x004000, /**< Log messages from LinkLocalManager */ + LogAreaAllClasses = 0x01FFFF, /**< All log messages from all the classes. */ + LogAreaXmlIncoming = 0x020000, /**< Incoming XML. */ + LogAreaXmlOutgoing = 0x040000, /**< Outgoing XML. */ + LogAreaUser = 0x800000, /**< User-defined sources. */ + LogAreaAll = 0xFFFFFF /**< All log sources. */ + }; + + /** + * Describes a log message's severity. + */ + enum LogLevel + { + LogLevelDebug, /**< Debug messages. */ + LogLevelWarning, /**< Non-crititcal warning messages. */ + LogLevelError /**< Critical, unrecoverable errors. */ + }; + + /** + * The possible Message Events according to @xep{0022}. + */ + enum MessageEventType + { + MessageEventOffline = 1, /**< Indicates that the message has been stored offline by the + * intended recipient's server. */ + MessageEventDelivered = 2, /**< Indicates that the message has been delivered to the + * recipient. */ + MessageEventDisplayed = 4, /**< Indicates that the message has been displayed */ + MessageEventComposing = 8, /**< Indicates that a reply is being composed. */ + MessageEventInvalid = 16, /**< Invalid type. */ + MessageEventCancel = 32 /**< Cancels the 'Composing' event. */ + }; + + /** + * The possible Chat States according to @xep{0085}. + */ + enum ChatStateType + { + ChatStateActive = 1, /**< User is actively participating in the chat session. */ + ChatStateComposing = 2, /**< User is composing a message. */ + ChatStatePaused = 4, /**< User had been composing but now has stopped. */ + ChatStateInactive = 8, /**< User has not been actively participating in the chat session. */ + ChatStateGone = 16, /**< User has effectively ended their participation in the chat + * session. */ + ChatStateInvalid = 32 /**< Invalid type. */ + }; + + /** + * Describes the possible error conditions for resource binding. + */ + enum ResourceBindError + { + RbErrorUnknownError, /**< An unknown error occured. */ + RbErrorBadRequest, /**< Resource identifier cannot be processed. */ + RbErrorNotAllowed, /**< Client is not allowed to bind a resource. */ + RbErrorConflict /**< Resource identifier is in use. */ + }; + + /** + * Describes the possible error conditions for session establishemnt. + */ + enum SessionCreateError + { + ScErrorUnknownError, /**< An unknown error occured. */ + ScErrorInternalServerError, /**< Internal server error. */ + ScErrorForbidden, /**< Username or resource not allowed to create session. */ + ScErrorConflict /**< Server informs newly-requested session of resource + * conflict. */ + }; + + /** + * Currently implemented message session filters. + */ + enum MessageSessionFilter + { + FilterMessageEvents = 1, /**< Message Events (@xep{0022}) */ + FilterChatStates = 2 /**< Chat State Notifications (@xep{0085}) */ + }; + + /** + * Defined MUC room affiliations. See @xep{0045} for default privileges. + */ + enum MUCRoomAffiliation + { + AffiliationNone, /**< No affiliation with the room. */ + AffiliationOutcast, /**< The user has been banned from the room. */ + AffiliationMember, /**< The user is a member of the room. */ + AffiliationOwner, /**< The user is a room owner. */ + AffiliationAdmin, /**< The user is a room admin. */ + AffiliationInvalid /**< Invalid affiliation. */ + }; + + /** + * Defined MUC room roles. See @xep{0045} for default privileges. + */ + enum MUCRoomRole + { + RoleNone, /**< Not present in room. */ + RoleVisitor, /**< The user visits a room. */ + RoleParticipant, /**< The user has voice in a moderatd room. */ + RoleModerator, /**< The user is a room moderator. */ + RoleInvalid /**< Invalid role. */ + }; + + /** + * Configuration flags for a room. + */ + enum MUCRoomFlag + { + FlagPasswordProtected = 1<< 1, /**< Password-protected room. */ + FlagPublicLogging = 1<< 2, /**< Room conversation is logged. Code: 170 */ + FlagPublicLoggingOff = 1<< 3, /**< Room conversation is not logged. Code: 171 */ + FlagHidden = 1<< 4, /**< Hidden room. */ + FlagMembersOnly = 1<< 5, /**< Members-only room. */ + FlagModerated = 1<< 6, /**< Moderated room. */ + FlagNonAnonymous = 1<< 7, /**< Non-anonymous room. Code: 100, 172 */ + FlagOpen = 1<< 8, /**< Open room. */ + FlagPersistent = 1<< 9, /**< Persistent room .*/ + FlagPublic = 1<<10, /**< Public room. */ + FlagSemiAnonymous = 1<<11, /**< Semi-anonymous room. Code: 173 */ + FlagTemporary = 1<<12, /**< Temporary room. */ + FlagUnmoderated = 1<<13, /**< Unmoderated room. */ + FlagUnsecured = 1<<14, /**< Unsecured room. */ + FlagFullyAnonymous = 1<<15 /**< Fully anonymous room. Code: 174 */ + // keep in sync with MUCUserFlag below + }; + + /** + * Configuration flags for a user. + */ + // keep in sync with MUCRoomFlag above + enum MUCUserFlag + { + UserSelf = 1<<16, /**< Other flags relate to the current user him/herself. Code: 110 */ + UserNickChanged = 1<<17, /**< The user changed his/her nickname. Code: 303 */ + UserKicked = 1<<18, /**< The user has been kicked. Code: 307 */ + UserBanned = 1<<19, /**< The user has been banned. Code: 301 */ + UserAffiliationChanged = 1<<20, /**< The user's affiliation with the room changed and as a result + * he/she has been removed from the room. Code: 321 */ + UserRoomDestroyed = 1<<21, /**< The room has been destroyed. */ + UserNickAssigned = 1<<22, /**< Service has assigned or modified occupant's roomnick. + * Code: 210*/ + UserNewRoom = 1<<23, /**< The room has been newly created. Code: 201*/ + UserMembershipRequired = 1<<24, /**< User is being removed from the room because the room has + * been changed to members-only and the user is not a member. + * Code: 322 */ + UserRoomShutdown = 1<<25, /**< User is being removed from the room because of a system + * shutdown. Code: 332 */ + UserAffiliationChangedWNR = 1<<26 /**< The user's affiliation changed While Not in the Room. + * Code: 101 */ + }; + + /** + * Describes possible subscription types according to RFC 3921, Section 9. + */ + enum SubscriptionType + { + S10nNone, /**< Contact and user are not subscribed to each other, and + * neither has requested a subscription from the other. */ + S10nNoneOut, /**< Contact and user are not subscribed to each other, and + * user has sent contact a subscription request but contact + * has not replied yet. */ + S10nNoneIn, /**< Contact and user are not subscribed to each other, and + * contact has sent user a subscription request but user has + * not replied yet (note: contact's server SHOULD NOT push or + * deliver roster items in this state, but instead SHOULD wait + * until contact has approved subscription request from user). */ + S10nNoneOutIn, /**< Contact and user are not subscribed to each other, contact + * has sent user a subscription request but user has not replied + * yet, and user has sent contact a subscription request but + * contact has not replied yet. */ + S10nTo, /**< User is subscribed to contact (one-way). */ + S10nToIn, /**< User is subscribed to contact, and contact has sent user a + * subscription request but user has not replied yet. */ + S10nFrom, /**< Contact is subscribed to user (one-way). */ + S10nFromOut, /**< Contact is subscribed to user, and user has sent contact a + * subscription request but contact has not replied yet. */ + S10nBoth /**< User and contact are subscribed to each other (two-way). */ + }; + + /** + * A list of strings. + */ + typedef std::list StringList; + + /** + * A list of pointers to strings. + */ + typedef std::list StringPList; + + /** + * A map of strings. + */ + typedef std::map StringMap; + + /** + * A multimap of strings. + */ + typedef std::multimap StringMultiMap; + + class StanzaExtension; + /** + * A list of StanzaExtensions. + */ + typedef std::list StanzaExtensionList; +} + +extern "C" +{ + GLOOX_API const char* gloox_version(); +} + +#endif // GLOOX_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/glooxversion.h b/smack/smack/src/main/cpp/gloox/src/glooxversion.h new file mode 100644 index 00000000..500d989a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/glooxversion.h @@ -0,0 +1,13 @@ +/* + Copyright (c) 2009-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#define GLOOXVERSION 0x010013 diff --git a/smack/smack/src/main/cpp/gloox/src/gpgencrypted.cpp b/smack/smack/src/main/cpp/gloox/src/gpgencrypted.cpp new file mode 100644 index 00000000..11bb23cc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/gpgencrypted.cpp @@ -0,0 +1,60 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "gpgencrypted.h" +#include "tag.h" + +namespace gloox +{ + + GPGEncrypted::GPGEncrypted( const std::string& encrypted ) + : StanzaExtension( ExtGPGEncrypted ), + m_encrypted( encrypted ), m_valid( true ) + { + if( m_encrypted.empty() ) + m_valid = false; + } + + GPGEncrypted::GPGEncrypted( const Tag* tag ) + : StanzaExtension( ExtGPGEncrypted ), + m_valid( false ) + { + if( tag && tag->name() == "x" && tag->hasAttribute( XMLNS, XMLNS_X_GPGENCRYPTED ) ) + { + m_valid = true; + m_encrypted = tag->cdata(); + } + } + + GPGEncrypted::~GPGEncrypted() + { + } + + const std::string& GPGEncrypted::filterString() const + { + static const std::string filter = "/message/x[@xmlns='" + XMLNS_X_GPGENCRYPTED + "']"; + return filter; + } + + Tag* GPGEncrypted::tag() const + { + if( !m_valid ) + return 0; + + Tag* x = new Tag( "x", m_encrypted ); + x->addAttribute( XMLNS, XMLNS_X_GPGENCRYPTED ); + + return x; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/gpgencrypted.h b/smack/smack/src/main/cpp/gloox/src/gpgencrypted.h new file mode 100644 index 00000000..e2c5a1e6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/gpgencrypted.h @@ -0,0 +1,91 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef GPGENCRYPTED_H__ +#define GPGENCRYPTED_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an abstraction of a jabber:x:encrypted namespace element, as used in @xep{0027} + * (Current Jabber OpenPGP Usage). + * + * This class does not encrypt or decrypt any stanza content. It's meant to be an abstraction + * of the XML representation only. + * + * XEP version: 1.3 + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API GPGEncrypted : public StanzaExtension + { + public: + /** + * Constructs a new object with the given encrypted message. + * @param encrypted The encrypted message. + */ + GPGEncrypted( const std::string& encrypted ); + + /** + * Constructs an GPGEncrypted object from the given Tag. To be recognized properly, the Tag should + * have a name of 'x' in the @c jabber:x:encrypted namespace. + * @param tag The Tag to parse. + */ + GPGEncrypted( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~GPGEncrypted(); + + /** + * Returns the encrypted message. + * @return The encrypted message. + */ + const std::string& encrypted() const { return m_encrypted; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new GPGEncrypted( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new GPGEncrypted( *this ); + } + + private: + std::string m_encrypted; + bool m_valid; + + }; + +} + +#endif // GPGENCRYPTED_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/gpgsigned.cpp b/smack/smack/src/main/cpp/gloox/src/gpgsigned.cpp new file mode 100644 index 00000000..663d5c36 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/gpgsigned.cpp @@ -0,0 +1,62 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "gpgsigned.h" +#include "tag.h" + +namespace gloox +{ + + GPGSigned::GPGSigned( const std::string& signature ) + : StanzaExtension( ExtGPGSigned ), + m_signature( signature ), m_valid( true ) + { + if( m_signature.empty() ) + m_valid = false; + } + + GPGSigned::GPGSigned( const Tag* tag ) + : StanzaExtension( ExtGPGSigned ), + m_valid( false ) + { + if( tag && tag->name() == "x" && tag->hasAttribute( XMLNS, XMLNS_X_GPGSIGNED ) ) + { + m_valid = true; + m_signature = tag->cdata(); + } + } + + GPGSigned::~GPGSigned() + { + } + + const std::string& GPGSigned::filterString() const + { + static const std::string filter = + "/presence/x[@xmlns='" + XMLNS_X_GPGSIGNED + "']" + "|/message/x[@xmlns='" + XMLNS_X_GPGSIGNED + "']"; + return filter; + } + + Tag* GPGSigned::tag() const + { + if( !m_valid ) + return 0; + + Tag* x = new Tag( "x", m_signature ); + x->addAttribute( XMLNS, XMLNS_X_GPGSIGNED ); + + return x; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/gpgsigned.h b/smack/smack/src/main/cpp/gloox/src/gpgsigned.h new file mode 100644 index 00000000..f90c6211 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/gpgsigned.h @@ -0,0 +1,91 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef GPGSIGNED_H__ +#define GPGSIGNED_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an abstraction of a jabber:x:signed namespace element, as used in @xep{0027} + * (Current Jabber OpenPGP Usage). + * + * This class does not sign or verify any stanza content. It's meant to be an abstraction + * of the XML representation only. + * + * XEP version: 1.3 + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API GPGSigned : public StanzaExtension + { + public: + /** + * Constructs a new object with the given signature. + * @param signature The signature. + */ + GPGSigned( const std::string& signature ); + + /** + * Constructs an GPGSigned object from the given Tag. To be recognized properly, the Tag should + * have a name of 'x' in the @c jabber:x:signed namespace. + * @param tag The Tag to parse. + */ + GPGSigned( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~GPGSigned(); + + /** + * Returns the signature. + * @return The signature. + */ + const std::string& signature() const { return m_signature; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new GPGSigned( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new GPGSigned( *this ); + } + + private: + std::string m_signature; + bool m_valid; + + }; + +} + +#endif // GPGSIGNED_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/inbandbytestream.cpp b/smack/smack/src/main/cpp/gloox/src/inbandbytestream.cpp new file mode 100644 index 00000000..3a942038 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/inbandbytestream.cpp @@ -0,0 +1,299 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "inbandbytestream.h" +#include "base64.h" +#include "bytestreamdatahandler.h" +#include "disco.h" +#include "clientbase.h" +#include "error.h" +#include "message.h" +#include "util.h" + +#include + +namespace gloox +{ + + // ---- InBandBytestream::IBB ---- + static const char* typeValues[] = + { + "open", "data", "close" + }; + + InBandBytestream::IBB::IBB( const std::string& sid, int blocksize ) + : StanzaExtension( ExtIBB ), m_sid ( sid ), m_seq( 0 ), m_blockSize( blocksize ), + m_type( IBBOpen ) + { + } + + InBandBytestream::IBB::IBB( const std::string& sid, int seq, const std::string& data ) + : StanzaExtension( ExtIBB ), m_sid ( sid ), m_seq( seq ), m_blockSize( 0 ), + m_data( data ), m_type( IBBData ) + { + } + + InBandBytestream::IBB::IBB( const std::string& sid ) + : StanzaExtension( ExtIBB ), m_sid ( sid ), m_seq( 0 ), m_blockSize( 0 ), + m_type( IBBClose ) + { + } + + InBandBytestream::IBB::IBB( const Tag* tag ) + : StanzaExtension( ExtIBB ), m_type( IBBInvalid ) + { + if( !tag || tag->xmlns() != XMLNS_IBB ) + return; + + m_type = (IBBType)util::lookup( tag->name(), typeValues ); + m_blockSize = atoi( tag->findAttribute( "block-size" ).c_str() ); + m_seq = atoi( tag->findAttribute( "seq" ).c_str() ); + m_sid = tag->findAttribute( "sid" ); + m_data = Base64::decode64( tag->cdata() ); + } + + InBandBytestream::IBB::~IBB() + { + } + + const std::string& InBandBytestream::IBB::filterString() const + { + static const std::string filter = "/iq/open[@xmlns='" + XMLNS_IBB + "']" + "|/iq/data[@xmlns='" + XMLNS_IBB + "']" + "|/message/data[@xmlns='" + XMLNS_IBB + "']" + "|/iq/close[@xmlns='" + XMLNS_IBB + "']"; + return filter; + } + + Tag* InBandBytestream::IBB::tag() const + { + if( m_type == IBBInvalid ) + return 0; + + Tag* t = new Tag( util::lookup( m_type, typeValues ) ); + t->setXmlns( XMLNS_IBB ); + t->addAttribute( "sid", m_sid ); + if( m_type == IBBData ) + { + t->setCData( Base64::encode64( m_data ) ); + t->addAttribute( "seq", m_seq ); + } + else if( m_type == IBBOpen ) + t->addAttribute( "block-size", m_blockSize ); + + return t; + } + // ---- ~InBandBytestream::IBB ---- + + // ---- InBandBytestream ---- + InBandBytestream::InBandBytestream( ClientBase* clientbase, LogSink& logInstance, const JID& initiator, + const JID& target, const std::string& sid ) + : Bytestream( Bytestream::IBB, logInstance, initiator, target, sid ), + m_clientbase( clientbase ), m_blockSize( 4096 ), m_sequence( -1 ), m_lastChunkReceived( -1 ) + { + if( m_clientbase ) + { + m_clientbase->registerStanzaExtension( new IBB() ); + m_clientbase->registerIqHandler( this, ExtIBB ); + m_clientbase->registerMessageHandler( this ); + } + + m_open = false; + } + + InBandBytestream::~InBandBytestream() + { + m_handler = 0; // to prevent handleBytestreamClose() from being called in close() + + if( m_open ) + close(); + + if( m_clientbase ) + { + m_clientbase->removeMessageHandler( this ); + m_clientbase->removeIqHandler( this, ExtIBB ); + m_clientbase->removeIDHandler( this ); + } + } + + bool InBandBytestream::connect() + { + if( !m_clientbase ) + return false; + + if( m_target == m_clientbase->jid() ) + return true; + + const std::string& id = m_clientbase->getID(); + IQ iq( IQ::Set, m_target, id ); + iq.addExtension( new IBB( m_sid, m_blockSize ) ); + m_clientbase->send( iq, this, IBBOpen ); + return true; + } + + void InBandBytestream::handleIqID( const IQ& iq, int context ) + { + switch( iq.subtype() ) + { + case IQ::Result: + if( context == IBBOpen && m_handler ) + { + m_handler->handleBytestreamOpen( this ); + m_open = true; + } + break; + case IQ::Error: + closed(); + break; + default: + break; + } + } + + bool InBandBytestream::handleIq( const IQ& iq ) // data or open request, always 'set' + { + const IBB* i = iq.findExtension( ExtIBB ); + if( !i || !m_handler || iq.subtype() != IQ::Set || i->sid() != this->sid() ) + return false; + + if( !m_open ) + { + if( i->type() == IBBOpen ) + { + returnResult( iq.from(), iq.id() ); + m_open = true; + m_handler->handleBytestreamOpen( this ); + return true; + } + return false; + } + + if( i->type() == IBBClose ) + { + returnResult( iq.from(), iq.id() ); + closed(); + return true; + } + + if( ( m_lastChunkReceived + 1 ) != i->seq() ) + { + m_open = false; + returnError( iq.from(), iq.id(), StanzaErrorTypeModify, StanzaErrorItemNotFound ); + return false; + } + + if( i->data().empty() ) + { + m_open = false; + returnError( iq.from(), iq.id(), StanzaErrorTypeModify, StanzaErrorBadRequest ); + return false; + } + + returnResult( iq.from(), iq.id() ); + m_handler->handleBytestreamData( this, i->data() ); + m_lastChunkReceived++; + return true; + } + + void InBandBytestream::handleMessage( const Message& msg, MessageSession* /*session*/ ) + { + if( msg.from() != m_target || !m_handler ) + return; + + const IBB* i = msg.findExtension( ExtIBB ); + if( !i ) + return; + + if( !m_open ) + return; + + if( m_lastChunkReceived != i->seq() ) + { + m_open = false; + return; + } + + if( i->data().empty() ) + { + m_open = false; + return; + } + + m_handler->handleBytestreamData( this, i->data() ); + m_lastChunkReceived++; + } + + void InBandBytestream::returnResult( const JID& to, const std::string& id ) + { + IQ iq( IQ::Result, to, id ); + m_clientbase->send( iq ); + } + + void InBandBytestream::returnError( const JID& to, const std::string& id, StanzaErrorType type, StanzaError error ) + { + IQ iq( IQ::Error, to, id ); + iq.addExtension( new Error( type, error ) ); + m_clientbase->send( iq ); + } + + bool InBandBytestream::send( const std::string& data ) + { + if( !m_open || !m_clientbase ) + return false; + + size_t pos = 0; + size_t len = data.length(); + do + { + const std::string& id = m_clientbase->getID(); + IQ iq( IQ::Set, m_clientbase->jid() == m_target ? m_initiator : m_target, id ); + iq.addExtension( new IBB( m_sid, ++m_sequence, data.substr( pos, m_blockSize ) ) ); + m_clientbase->send( iq, this, IBBData ); + + pos += m_blockSize; + if( m_sequence == 65535 ) + m_sequence = -1; + } + while( pos < len ); + + return true; + } + + void InBandBytestream::closed() + { + if( !m_open ) + return; + + m_open = false; + + if( m_handler ) + m_handler->handleBytestreamClose( this ); + } + + void InBandBytestream::close() + { + m_open = false; + + if( !m_clientbase ) + return; + + const std::string& id = m_clientbase->getID(); + IQ iq( IQ::Set, m_target, id ); + iq.addExtension( new IBB( m_sid ) ); + m_clientbase->send( iq, this, IBBClose ); + + if( m_handler ) + m_handler->handleBytestreamClose( this ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/inbandbytestream.h b/smack/smack/src/main/cpp/gloox/src/inbandbytestream.h new file mode 100644 index 00000000..b9aaa872 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/inbandbytestream.h @@ -0,0 +1,214 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef INBANDBYTESTREAM_H__ +#define INBANDBYTESTREAM_H__ + +#include "bytestream.h" +#include "iqhandler.h" +#include "messagehandler.h" +#include "gloox.h" + +namespace gloox +{ + + class BytestreamDataHandler; + class ClientBase; + class Message; + + /** + * @brief An implementation of a single In-Band Bytestream (@xep{0047}). + * + * One instance of this class handles a single byte stream. + * + * See SIProfileFT for a detailed description on how to implement file transfer. + * + * @note This class can @b receive data wrapped in Message stanzas. This will only work if you + * are not using MessageSessions. However, it will always send + * data using IQ stanzas (which will always work). + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API InBandBytestream : public Bytestream, public IqHandler, public MessageHandler + { + + friend class SIProfileFT; + + public: + /** + * Virtual destructor. + */ + virtual ~InBandBytestream(); + + /** + * Lets you retrieve this bytestream's block-size. + * @return The bytestream's block-size. + */ + int blockSize() const { return m_blockSize; } + + /** + * Sets the stream's block-size. Default: 4096 + * @param blockSize The new block size. + * @note You should not change the block size once connect() has been called. + */ + void setBlockSize( int blockSize ) { m_blockSize = blockSize; } + + // reimplemented from Bytestream + virtual ConnectionError recv( int timeout = -1 ) { (void)timeout; return ConnNoError; } + + // reimplemented from Bytestream + bool send( const std::string& data ); + + // reimplemented from Bytestream + virtual bool connect(); + + // reimplemented from Bytestream + virtual void close(); + + // reimplemented from IqHandler + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler + virtual void handleIqID( const IQ& iq, int context ); + + // reimplemented from MessageHandler + virtual void handleMessage( const Message& msg, MessageSession* session = 0 ); + + private: +#ifdef INBANDBYTESTREAM_TEST + public: +#endif + enum IBBType + { + IBBOpen, + IBBData, + IBBClose, + IBBInvalid + }; + + /** + * @brief An abstraction of IBB elements, implemented as as StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class IBB : public StanzaExtension + { + public: + /** + * Constructs a new IBB object that opens an IBB, using the given SID and block size. + * @param sid The SID of the IBB to open. + * @param blocksize The streams block size. + */ + IBB( const std::string& sid, int blocksize ); + + /** + * Constructs a new IBB object that can be used to send a single block of data, + * using the given SID and sequence number. + * @param sid The SID of the IBB. + * @param seq The block's sequence number. + * @param data The block data, not base64 encoded. + */ + IBB( const std::string& sid, int seq, const std::string& data ); + + /** + * Constructs a new IBB object that closes an IBB, using the given SID. + * @param sid The SID of the IBB to close. + */ + IBB( const std::string& sid ); + + /** + * Constructs a new IBB object from the given Tag. + * @param tag The Tag to parse. + */ + IBB( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~IBB(); + + /** + * Returns the IBB's type. + * @return The IBB's type. + */ + IBBType type() const { return m_type; } + + /** + * Returns the IBB's block size. Only meaningful if the IBB is of type() IBBOpen. + * @return The IBB's block size. + */ + int blocksize() const { return m_blockSize; } + + /** + * Returns the current block's sequence number. + * @return The current block's sequence number. + */ + int seq() const { return m_seq; } + + /** + * Returns the current block's SID. + * @return The current block's SID. + */ + const std::string sid() const { return m_sid; } + + /** + * Returns the current block's data (not base64 encoded). + * @return The current block's data. + */ + const std::string& data() const { return m_data; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new IBB( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new IBB( *this ); + } + + private: + std::string m_sid; + int m_seq; + int m_blockSize; + std::string m_data; + IBBType m_type; + }; + + InBandBytestream( ClientBase* clientbase, LogSink& logInstance, const JID& initiator, + const JID& target, const std::string& sid ); + InBandBytestream& operator=( const InBandBytestream& ); + void closed(); // by remote entity + void returnResult( const JID& to, const std::string& id ); + void returnError( const JID& to, const std::string& id, StanzaErrorType type, StanzaError error ); + + ClientBase* m_clientbase; + int m_blockSize; + int m_sequence; + int m_lastChunkReceived; + + }; + +} + +#endif // INBANDBYTESTREAM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/instantmucroom.cpp b/smack/smack/src/main/cpp/gloox/src/instantmucroom.cpp new file mode 100644 index 00000000..2501697e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/instantmucroom.cpp @@ -0,0 +1,31 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "instantmucroom.h" +#include "clientbase.h" +#include "jid.h" + +namespace gloox +{ + + InstantMUCRoom::InstantMUCRoom( ClientBase* parent, const JID& nick, MUCRoomHandler* mrh ) + : MUCRoom( parent, nick, mrh, 0 ) + { + } + + InstantMUCRoom::~InstantMUCRoom() + { + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/instantmucroom.h b/smack/smack/src/main/cpp/gloox/src/instantmucroom.h new file mode 100644 index 00000000..ae5d1748 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/instantmucroom.h @@ -0,0 +1,60 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef INSTANTMUCROOM_H__ +#define INSTANTMUCROOM_H__ + +#include "mucroom.h" + +namespace gloox +{ + + /** + * @brief This class implements an instant MUC room. + * + * XEP version: 1.21 + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API InstantMUCRoom : public MUCRoom + { + public: + /** + * Creates a new abstraction of a @b unique Multi-User Chat room. The room is not joined + * automatically. Use join() to join the room, use leave() to leave it. See MUCRoom for + * detailed info. + * @param parent The ClientBase object to use for the communication. + * @param nick The room's name and service plus the desired nickname in the form + * room\@service/nick. + * @param mrh The MUCRoomHandler that will listen to room events. May be 0 and may be specified + * later using registerMUCRoomHandler(). However, without one, MUC is no joy. + * @note To subsequently configure the room, use MUCRoom::registerMUCRoomConfigHandler(). + */ + InstantMUCRoom( ClientBase* parent, const JID& nick, MUCRoomHandler* mrh ); + + /** + * Virtual Destructor. + */ + virtual ~InstantMUCRoom(); + + protected: + // reimplemented from MUCRoom (acknowledges instant room creation w/o a + // call to the MUCRoomConfigHandler) + virtual bool instantRoomHook() const { return true; } + + }; + +} + +#endif // INSTANTMUCROOM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/iodata.cpp b/smack/smack/src/main/cpp/gloox/src/iodata.cpp new file mode 100644 index 00000000..eeeb0eec --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/iodata.cpp @@ -0,0 +1,226 @@ +/* + Copyright (c) 2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "iodata.h" + +#include "util.h" + +namespace gloox +{ + + static const char* ioTypes[] = { + "io-schemata-get", + "input", + "getStatus", + "getOutput", + "io-schemata-result", + "output", + "error", + "status" + }; + + static inline IOData::Type ioType( const std::string& type ) + { + return (IOData::Type)util::lookup( type, ioTypes ); + } + + IOData::IOData( Type type ) + : AdhocPlugin( ExtIOData ), + m_in( 0 ), m_out( 0 ), m_error( 0 ), + m_type( type ) + { + m_status.elapsed = -1; + m_status.remaining = -1; + m_status.percentage = -1; + } + + IOData::IOData( const Tag* tag ) + : AdhocPlugin( ExtIOData ), + m_in( 0 ), m_out( 0 ), m_error( 0 ), + m_type( TypeInvalid ) + { + if( !tag || !( tag->name() == "iodata" && tag->hasAttribute( XMLNS, XMLNS_IODATA ) ) ) + return; + + m_status.elapsed = -1; + m_status.remaining = -1; + m_status.percentage = -1; + + m_type = ioType( tag->findAttribute( "type" ) ); + Tag* m = 0; + switch( m_type ) + { + case TypeInput: + m = tag->findChild( "in" ); + if( m ) + m_in = m->clone(); + break; + case TypeIoSchemataResult: + m = tag->findChild( "desc" ); + if( m ) + m_desc = m->cdata(); + + m = tag->findChild( "out" ); + if( m ) + m_out = m->clone(); + + m = tag->findChild( "in" ); + if( m ) + m_in = m->clone(); + break; + case TypeOutput: + m = tag->findChild( "out" ); + if( m ) + m_out = m->clone(); + break; + case TypeError: + m = tag->findChild( "error" ); + if( m ) + m_error = m->clone(); + break; + case TypeStatus: + m = tag->findChild( "status" ); + if( m ) + { + Tag* t = m->findChild( "elapsed" ); + if( t ) + m_status.elapsed = atoi( t->cdata().c_str() ); + + t = m->findChild( "remaining" ); + if( t ) + m_status.remaining = atoi( t->cdata().c_str() ); + + t = m->findChild( "percentage" ); + if( t ) + m_status.percentage = atoi( t->cdata().c_str() ); + + t = m->findChild( "information" ); + if( t ) + m_status.info = t->cdata(); + } + break; + case TypeIoSchemataGet: + case TypeGetStatus: + case TypeGetOutput: + default: + break; + } + + } + + IOData::~IOData() + { + delete m_in; + delete m_out; + delete m_error; + } + + Tag* IOData::tag() const + { + if( m_type == TypeInvalid ) + return 0; + + Tag* i = new Tag( "iodata" ); + i->setXmlns( XMLNS_IODATA ); + i->addAttribute( "type", util::lookup( m_type, ioTypes ) ); + + Tag* t = 0; + switch( m_type ) + { + case TypeInput: + i->addChild( m_in ); + break; + case TypeIoSchemataResult: + i->addChild( m_in ); + i->addChild( m_out ); + new Tag( i, "desc", m_desc ); + break; + case TypeOutput: + i->addChild( m_out ); + break; + case TypeError: + i->addChild( m_error ); + break; + case TypeStatus: + t = new Tag( i, "status" ); + if( m_status.elapsed >= 0 ) + new Tag( t, "elapsed", util::int2string( m_status.elapsed ) ); + if( m_status.remaining >= 0 ) + new Tag( t, "remaining", util::int2string( m_status.remaining ) ); + if( m_status.percentage >= 0 ) + new Tag( t, "percentage", util::int2string( m_status.percentage ) ); + if( m_status.info.length() ) + new Tag( t, "information", m_status.info ); + break; + case TypeIoSchemataGet: + case TypeGetStatus: + case TypeGetOutput: + default: + break; + } + + return i; + } + + IOData* IOData::clone() const + { + IOData* i = new IOData( m_type ); + i->m_status = m_status; + i->m_desc = m_desc; + + if( m_in ) + i->m_in = m_in->clone(); + if( m_out ) + i->m_out = m_out->clone(); + if( m_error ) + i->m_error = m_error->clone(); + + return i; + } + + void IOData::setIn( Tag* in ) + { + if( !in ) + return; + + delete m_in; + + m_in = new Tag( "in" ); + m_in->addChild( in ); + } + + void IOData::setOut( Tag* out ) + { + if( !out ) + return; + + delete m_out; + + m_out = new Tag( "out" ); + m_out->addChild( out ); + } + + void IOData::setError( Tag* error ) + { + if( !error ) + return; + + delete m_error; + + m_error = new Tag( "error" ); + m_error->addChild( error ); + } + + +} + diff --git a/smack/smack/src/main/cpp/gloox/src/iodata.h b/smack/smack/src/main/cpp/gloox/src/iodata.h new file mode 100644 index 00000000..fa824e06 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/iodata.h @@ -0,0 +1,186 @@ +/* + Copyright (c) 2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef IODATA_H__ +#define IODATA_H__ + +#include "adhocplugin.h" + +#include "gloox.h" +#include "tag.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an abstraction of the IO Data specification @xep{0153}. + * + * This abstraction can be used to implement IO Data on top of Data Forms. + * + * XEP version: 0.1 + * @author Jakob Schröter + * @since 1.0.13 + */ + class GLOOX_API IOData : public AdhocPlugin + { + public: + /** + * The IO Data transaction types. + */ + enum Type + { + TypeIoSchemataGet, /** To request the schemata of input and output. */ + TypeInput, /** To submit the input. */ + TypeGetStatus, /** To request the status of the procedure. */ + TypeGetOutput, /** To request the output. */ + TypeIoSchemataResult, /** To return the schemata of input and output. */ + TypeOutput, /** To submit the output. */ + TypeError, /** To submit additional error information. */ + TypeStatus, /** To indicate the current status of the procedure. */ + TypeInvalid /** Invalid type. */ + }; + + struct Status + { + int elapsed; /** Aan integer value of the time in milliseconds that + * elapsed since the procedure was invoked. */ + int remaining; /** An integer value of the (estimated) time in milliseconds + * till the procedure will finish. */ + int percentage; /** The percentage of the procedure that is finished. */ + std::string info; /** Describes the current status of the procedure. */ + }; + + /** + * Constructs a new IO Data object of the given type. + * @param type The transaction type. + */ + IOData( Type type ); + + /** + * Constructs a new IO Data object by parsing the given Tag. + * @param tag The Tag to parse. This should be a <iodata> tag with the correct namespace and child elements. + */ + IOData( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~IOData(); + + /** + * Returns the IO Data object's type. + * @return The IO Data object's type. + */ + Type type() const { return m_type; } + + /** + * Returns the 'input' tag, if the transaction type is either @c input or @c io-schemata-result. + * @return The 'input' tag, including the encapsulating <in>. + * @note The IOData instance will still own the tag and delete it. Clone it if you need it later. + */ + const Tag* in() const { return m_in; } + + /** + * Sets the 'input' tag. If an 'input' tag was previosuly set, it is deleted before the new one is set. + * @param in The new 'input' tag. + * @note The @c in tag will be owned by this IOData instance. Clone it if you need it somewhere else. + */ + void setIn( Tag* in ); + + /** + * Returns the 'output' tag, if the transaction type is either @c output or @c io-schemata-result. + * @return The 'output' tag, including the encapsulating <out>. + * @note The IOData instance will still own the tag and delete it. Clone it if you need it later. + */ + const Tag* out() const { return m_out; } + + /** + * Sets the 'output' tag. If an 'output' tag was previosuly set, it is deleted before the new one is set. + * @param out The new 'output' tag. + * @note The @c out tag will be owned by this IOData instance. Clone it if you need it somewhere else. + */ + void setOut( Tag* out ); + + /** + * Returns the 'error' tag, if the transaction type is either @c error or @c io-schemata-result. + * @return The 'error' tag, including the encapsulating <error>. + * @note The IOData instance will still own the tag and delete it. Clone it if you need it later. + */ + const Tag* error() const { return m_error; } + + /** + * Sets the 'error' tag. If an 'error' tag was previosuly set, it is deleted before the new one is set. + * @param out The new 'error' tag. + * @note The @c error tag will be owned by this IOData instance. Clone it if you need it somewhere else. + */ + void setError( Tag* error ); + + /** + * Sets the Schema description. Only used/valid if type is @c io-schemata-result. + * @param desc The schema description. + */ + void setDesc( const std::string& desc ) { m_desc = desc; } + + /** + * Returns the schema description, if any. Usually only valid if transaction type is @c io-schema-result. + * @return The schema description. + */ + const std::string& desc() const { return m_desc; } + + /** + * Sets the status of the procedure. Only used/valid if transaction type is @c status. + * @param status The status of the procedure. + */ + void setStatus( Status status ) { m_status = status; } + + /** + * Returns the status of the procedure. Only used/valid if transaction type is @c status. + * @return The status of the procedure. + */ + Status status() const { return m_status; } + + // reimplemented from AdhocPlugin/StanzaExtension + virtual Tag* tag() const; + + // reimplemented from AdhocPlugin/StanzaExtension + virtual IOData* clone() const; + + // reimplemented from AdhocPlugin/StanzaExtension + virtual const std::string& filterString() const { return EmptyString; } + + // reimplemented from AdhocPlugin/StanzaExtension + virtual StanzaExtension* newInstance( const Tag* /*tag*/ ) const { return 0; } + + /** + * Converts to @b true if the IOData is valid, @b false otherwise. + */ + operator bool() const { return m_type != TypeInvalid; } + + private: + Tag* m_in; + Tag* m_out; + Tag* m_error; + + std::string m_desc; + + Status m_status; + + Type m_type; + + }; + +} + +#endif // IODATA_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/iq.cpp b/smack/smack/src/main/cpp/gloox/src/iq.cpp new file mode 100644 index 00000000..aab62ae2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/iq.cpp @@ -0,0 +1,69 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "iq.h" +#include "util.h" + +namespace gloox +{ + + static const char * iqTypeStringValues[] = + { + "get", "set", "result", "error" + }; + + static inline const char* typeString( IQ::IqType type ) + { + return iqTypeStringValues[type]; + } + + IQ::IQ( Tag* tag ) + : Stanza( tag ), m_subtype( Invalid ) + { + if( !tag || tag->name() != "iq" ) + return; + + m_subtype = (IQ::IqType)util::lookup( tag->findAttribute( TYPE ), iqTypeStringValues ); + } + + IQ::IQ( IqType type, const JID& to, const std::string& id ) + : Stanza( to ), m_subtype( type ) + { + m_id = id; + } + + IQ::~IQ() + { + } + + Tag* IQ::tag() const + { + if( m_subtype == Invalid ) + return 0; + + Tag* t = new Tag( "iq" ); + if( m_to ) + t->addAttribute( "to", m_to.full() ); + if( m_from ) + t->addAttribute( "from", m_from.full() ); + if( !m_id.empty() ) + t->addAttribute( "id", m_id ); + t->addAttribute( TYPE, typeString( m_subtype ) ); + + StanzaExtensionList::const_iterator it = m_extensionList.begin(); + for( ; it != m_extensionList.end(); ++it ) + t->addChild( (*it)->tag() ); + + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/iq.h b/smack/smack/src/main/cpp/gloox/src/iq.h new file mode 100644 index 00000000..266cc802 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/iq.h @@ -0,0 +1,96 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef IQ_H__ +#define IQ_H__ + +#include "stanza.h" +#include "gloox.h" + +#include + +namespace gloox +{ + + class JID; + + /** + * @brief An abstraction of an IQ stanza. + * + * @author Vincent Thomasset + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API IQ : public Stanza + { + + friend class ClientBase; + + public: + + /** + * Describes the different valid IQ types. + */ + enum IqType + { + Get = 0, /**< The stanza is a request for information or requirements. */ + Set, /**< The stanza provides required data, sets new values, or + * replaces existing values. */ + Result, /**< The stanza is a response to a successful get or set request. */ + Error, /**< An error has occurred regarding processing or delivery of a + * previously-sent get or set (see Stanza Errors (Section 9.3)). */ + Invalid /**< The stanza is invalid */ + }; + + /** + * Creates an IQ Query. + * @param type The desired IqType. + * @param to The intended receiver. + * @param id The request's ID. Usually obtained from ClientBase::getID(). Optional, + * will be added by ClientBase if the IQ is sent by means of + * @link gloox::ClientBase::send( IQ&, IqHandler*, int, bool ) send( IQ&, IqHandler*, int, bool ) @endlink. + * You should only need to pass this when creating a reply (i.e. an IQ of type Result or Error). + */ + IQ( IqType type, const JID& to, const std::string& id = EmptyString ); + + /** + * Virtual destructor. + */ + virtual ~IQ(); + + /** + * Returns the IQ's type. + * @return The IQ's type. + */ + IqType subtype() const { return m_subtype; } + + // reimplemented from Stanza + virtual Tag* tag() const; + + private: +#ifdef IQ_TEST + public: +#endif + /** + * Creates an IQ from a tag. The original Tag will be ripped off. + * @param tag The Tag to parse. + */ + IQ( Tag* tag ); + + void setID( const std::string& id ) { m_id = id; } + + IqType m_subtype; + }; + +} + +#endif // IQ_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/iqhandler.h b/smack/smack/src/main/cpp/gloox/src/iqhandler.h new file mode 100644 index 00000000..8bc9b964 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/iqhandler.h @@ -0,0 +1,66 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef IQHANDLER_H__ +#define IQHANDLER_H__ + +#include "iq.h" + +namespace gloox +{ + + /** + * @brief A virtual interface which can be reimplemented to receive IQ stanzas. + * + * Derived classes can be registered as IqHandlers with the Client. + * Upon an incoming IQ packet @ref handleIq() will be called. + * + * @author Jakob Schröter + */ + class GLOOX_API IqHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~IqHandler() {} + + /** + * Reimplement this function if you want to be notified about incoming IQs. + * @param iq The complete IQ stanza. + * @return Indicates whether a request of type 'get' or 'set' has been handled. This includes + * the obligatory 'result' answer. If you return @b false, an 'error' will be sent. + * @since 1.0 + */ + virtual bool handleIq( const IQ& iq ) = 0; + + /** + * Reimplement this function if you want to be notified about + * incoming IQs with a specific value of the @c id attribute. You + * have to enable tracking of those IDs using Client::trackID(). + * This is usually useful for IDs that generate a positive reply, i.e. + * <iq type='result' id='reg'/> where a namespace filter wouldn't + * work. + * @param iq The complete IQ stanza. + * @param context A value to restore context, stored with ClientBase::trackID(). + * @note Only IQ stanzas of type 'result' or 'error' can arrive here. + * @since 1.0 + */ + virtual void handleIqID( const IQ& iq, int context ) = 0; + + }; + +} + +#endif // IQHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jid.cpp b/smack/smack/src/main/cpp/gloox/src/jid.cpp new file mode 100644 index 00000000..a3a90c7a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jid.cpp @@ -0,0 +1,123 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "jid.h" +#include "prep.h" +#include "gloox.h" +#include "util.h" + +namespace gloox +{ + + bool JID::setJID( const std::string& jid ) + { + if ( jid.empty() ) + { + m_bare = m_full = m_server = m_username = m_serverRaw = m_resource = EmptyString; + m_valid = false; + return false; + } + + const std::string::size_type at = jid.find( '@' ); + const std::string::size_type slash = jid.find( '/', at == std::string::npos ? 0 : at ); + + if( at != std::string::npos && !( m_valid = prep::nodeprep( jid.substr( 0, at ), m_username ) ) ) + return false; + + m_serverRaw = jid.substr( at == std::string::npos ? 0 : at + 1, slash - at - 1 ); + if( !( m_valid = prep::nameprep( m_serverRaw, m_server ) ) ) + return false; + + if( slash != std::string::npos + && !( m_valid = prep::resourceprep( jid.substr( slash + 1 ), m_resource ) ) ) + return false; + + setStrings(); + + return m_valid; + } + + bool JID::setUsername( const std::string& uname ) + { + m_valid = prep::nodeprep( uname, m_username ); + setStrings(); + return m_valid; + } + + bool JID::setServer( const std::string& serv ) + { + m_serverRaw = serv; + m_valid = prep::nameprep( m_serverRaw, m_server ); + setStrings(); + return m_valid; + } + + bool JID::setResource( const std::string& res ) + { + m_valid = prep::resourceprep( res, m_resource ); + setFull(); + return m_valid; + } + + void JID::setFull() + { + m_full = bare(); + if( !m_resource.empty() ) + m_full += '/' + m_resource; + } + + void JID::setBare() + { + if( !m_username.empty() ) + m_bare = m_username + '@'; + else + m_bare = ""/*EmptyString*/; + m_bare += m_server; + } + + std::string JID::escapeNode( const std::string& node ) + { + std::string escaped = node; + + util::replaceAll( escaped, "\\", "\\5c" ); + util::replaceAll( escaped, " ", "\\20" ); + util::replaceAll( escaped, "\"", "\\22" ); + util::replaceAll( escaped, "&", "\\26" ); + util::replaceAll( escaped, "'", "\\27" ); + util::replaceAll( escaped, "/", "\\2f" ); + util::replaceAll( escaped, ":", "\\3a" ); + util::replaceAll( escaped, "<", "\\3c" ); + util::replaceAll( escaped, ">", "\\3e" ); + util::replaceAll( escaped, "@", "\\40" ); + + return escaped; + } + + std::string JID::unescapeNode( const std::string& node ) + { + std::string unescaped = node; + + util::replaceAll( unescaped, "\\20", " " ); + util::replaceAll( unescaped, "\\22", "\"" ); + util::replaceAll( unescaped, "\\26", "&" ); + util::replaceAll( unescaped, "\\27", "'" ); + util::replaceAll( unescaped, "\\2f", "/" ); + util::replaceAll( unescaped, "\\3a", ":" ); + util::replaceAll( unescaped, "\\3c", "<" ); + util::replaceAll( unescaped, "\\3e", ">" ); + util::replaceAll( unescaped, "\\40", "@" ); + util::replaceAll( unescaped, "\\5c", "\\" ); + + return unescaped; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/jid.h b/smack/smack/src/main/cpp/gloox/src/jid.h new file mode 100644 index 00000000..833d7f65 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jid.h @@ -0,0 +1,219 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef JID_H__ +#define JID_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + /** + * @brief An abstraction of a JID. + * + * @author Jakob Schröter + * @since 0.4 + */ + class GLOOX_API JID + { + public: + + /** + * Constructs an empty JID. + */ + JID() : m_valid( false ) {} + + /** + * Constructs a new JID from a string. + * @param jid The string containing the JID. + */ + JID( const std::string& jid ) : m_valid( true ) { setJID(jid); } + + /** + * Destructor. + */ + ~JID() {} + + /** + * Sets the JID from a string. + * @param jid The string containing the JID. + * @return @b True if the given JID was valid, @b false otherwise. + */ + bool setJID( const std::string& jid ); + + /** + * Returns the full (prepped) JID (user\@host/resource). + * @return The full JID. + */ + const std::string& full() const { return m_full; } + + /** + * Returns the bare (prepped) JID (user\@host). + * @return The bare JID. + */ + const std::string& bare() const { return m_bare; } + + /** + * Creates and returns a JID from this JID's node and server parts. + * @return The bare JID. + * @since 0.9 + */ + JID bareJID() const { return JID( bare() ); } + + /** + * Sets the username. + * @param username The new username. + */ + bool setUsername( const std::string& username ); + + /** + * Sets the server. + * @param server The new server. + */ + bool setServer( const std::string& server ); + + /** + * Sets the resource. + * @param resource The new resource. + */ + bool setResource( const std::string& resource ); + + /** + * Returns the prepped username. + * @return The current username. + */ + const std::string& username() const { return m_username; } + + /** + * Returns the prepped server name. + * @return The current server. + */ + const std::string& server() const { return m_server; } + + /** + * Returns the raw (unprepped) server name. + * @return The raw server name. + */ + const std::string& serverRaw() const { return m_serverRaw; } + + /** + * Returns the prepped resource. + * @return The current resource. + */ + const std::string& resource() const { return m_resource; } + + /** + * Compares a JID with a string. + * @param right The second JID in string representation. + */ + bool operator==( const std::string& right ) const { return full() == right; } + + /** + * Compares a JID with a string. + * @param right The second JID in string representation. + */ + bool operator!=( const std::string& right ) const { return full() != right; } + + /** + * Compares two JIDs. + * @param right The second JID. + */ + bool operator==( const JID& right ) const { return full() == right.full(); } + + /** + * Compares two JIDs. + * @param right The second JID. + */ + bool operator!=( const JID& right ) const { return full() != right.full(); } + + /** + * Compares two JIDs to see if the left is less than the right. + * Needed for JID to be a key in a map. + * @param right The second JID. + * @since 1.0.4 + */ + bool operator<( const JID& right ) const { return full() < right.full(); } + + /** + * Compares two JIDs to see if the left is less than or equal to the right. + * @param right The second JID. + * @since 1.0.4 + */ + bool operator<=( const JID& right ) const { return full() <= right.full(); } + + /** + * Compares two JIDs to see if the left is greater than the right. + * @param right The second JID. + * @since 1.0.4 + */ + bool operator>( const JID& right ) const { return full() > right.full(); } + + /** + * Compares two JIDs to see if the left is greater than the right. + * @param right The second JID. + * @since 1.0.4 + */ + bool operator>=( const JID& right ) const { return full() >= right.full(); } + + /** + * Converts to @b true if the JID is valid, @b false otherwise. + */ + operator bool() const { return m_valid; } + + /** + * @xep{0106}: JID Escaping + * @param node The node to escape. + * @return The escaped node. + */ + static std::string escapeNode( const std::string& node ); + + /** + * @xep{0106}: JID Escaping + * @param node The node to unescape. + * @return The unescaped node. + */ + static std::string unescapeNode( const std::string& node ); + + private: + /** + * Utility function to rebuild both the bare and full jid. + */ + void setStrings() { setBare(); setFull(); } + + /** + * Utility function rebuilding the bare jid. + * @note Do not use this function directly, instead use setStrings. + */ + void setBare(); + + /** + * Utility function rebuilding the full jid. + */ + void setFull(); + + std::string m_resource; + std::string m_username; + std::string m_server; + std::string m_serverRaw; + std::string m_bare; + std::string m_full; + bool m_valid; + + }; + +} + +#endif // JID_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jinglecontent.cpp b/smack/smack/src/main/cpp/gloox/src/jinglecontent.cpp new file mode 100644 index 00000000..c69e1aaf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglecontent.cpp @@ -0,0 +1,104 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "jinglecontent.h" +#include "jinglepluginfactory.h" +#include "util.h" + +namespace gloox +{ + + namespace Jingle + { + + static const char* creatorValues [] = { + "initiator", + "responder" + }; + + static inline Content::Creator creatorType( const std::string& type ) + { + return (Content::Creator)util::lookup( type, creatorValues ); + } + + static const char* sendersValues [] = { + "initiator", + "responder", + "both", + "none" + }; + + static inline Content::Senders sendersType( const std::string& type ) + { + return (Content::Senders)util::lookup( type, sendersValues ); + } + + Content::Content( const std::string& name, const PluginList& plugins, Creator creator, + Senders senders, const std::string& disposition ) + : Plugin( PluginContent ), m_creator( creator ), m_disposition( disposition ), + m_name( name ), m_senders( senders ) + { + m_plugins = plugins; + } + + Content::Content( const Tag* tag, PluginFactory* factory ) + : Plugin( PluginContent ) + { + if( !tag || tag->name() != "content" ) + return; + + m_name = tag->findAttribute( "name" ); + m_creator = (Creator)util::lookup( tag->findAttribute( "creator" ), creatorValues ); + m_senders = (Senders)util::lookup( tag->findAttribute( "senders" ), sendersValues ); + m_disposition = tag->findAttribute( "disposition" ); + + if( factory ) + factory->addPlugins( *this, tag ); + } + + Content::~Content() + { + } + + const std::string& Content::filterString() const + { + static const std::string filter = "jingle/content"; + return filter; + } + + Tag* Content::tag() const + { + if( m_creator == InvalidCreator || m_name.empty() ) + return 0; + + Tag* t = new Tag( "content" ); + t->addAttribute( "creator", util::lookup( m_creator, creatorValues ) ); + t->addAttribute( "disposition", m_disposition ); + t->addAttribute( "name", m_name ); + t->addAttribute( "senders", util::lookup( m_senders, sendersValues ) ); + + PluginList::const_iterator it = m_plugins.begin(); + for( ; it != m_plugins.end(); ++it ) + t->addChild( (*it)->tag() ); + + return t; + } + + Plugin* Content::clone() const + { + return 0; + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/jinglecontent.h b/smack/smack/src/main/cpp/gloox/src/jinglecontent.h new file mode 100644 index 00000000..c04d7861 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglecontent.h @@ -0,0 +1,138 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLECONTENT_H__ +#define JINGLECONTENT_H__ + + +#include "jingleplugin.h" +#include "tag.h" + +#include + +namespace gloox +{ + + namespace Jingle + { + + class PluginFactory; + + /** + * @brief An abstraction of a Jingle Content Type. This is part of Jingle (@xep{0166}). + * + * See @link gloox::Jingle::Session Jingle::Session @endlink for more info on Jingle. + * + * XEP Version: 1.1 + * + * @author Jakob Schröter + * @since 1.0.5 + */ + class GLOOX_API Content : public Plugin + { + public: + /** + * The original creator of the content type. + */ + enum Creator + { + CInitiator, /**< The creator is the initiator of the session. */ + CResponder, /**< The creator is the responder. */ + InvalidCreator /**< Invalid value. */ + }; + + /** + * The parties in the session that will be generating content. + */ + enum Senders + { + SInitiator, /**< The initiator generates/sends content. */ + SResponder, /**< The responder generates/sends content. */ + SBoth, /**< Both parties generate/send content( default). */ + SNone, /**< No party generates/sends content. */ + InvalidSender /**< Invalid value. */ + }; + + /** + * Creates a new Content wrapper. + * @param name A unique name for the content type. + * @param plugins A list of application formats, transport methods, security preconditions, ... + * @param creator Which party originally generated the content type; the defined values are "SInitiator" and "SResponder". + * @param senders Which parties in the session will be generating content. + * @param disposition How the content definition is to be interpreted by the recipient. The meaning of this attribute + * matches the "Content-Disposition" header as defined in RFC 2183 and applied to SIP by RFC 3261. + */ + Content( const std::string& name, const PluginList& plugins, Creator creator = CInitiator, + Senders senders = SBoth, const std::string& disposition = "session" ); + + /** + * Creates a new Content object from the given tag. + * @param tag The Tag to parse. + * @param factory A PluginFactory instance to use for embedding plugins. + */ + Content( const Tag* tag = 0, PluginFactory* factory = 0 ); + + /** + * Returns the content's creator. + * @return The content's creator. + */ + Creator creator() const { return m_creator; } + + /** + * Returns the senders. + * @return The senders. + */ + Senders senders() const { return m_senders; } + + /** + * Returns the disposition. + * @return The disposition. + */ + const std::string& disposition() const { return m_disposition; } + + /** + * Returns the content name. + * @return The content name. + */ + const std::string& name() const { return m_name; } + + /** + * Virtual destructor. + */ + virtual ~Content(); + + // reimplemented from Plugin + virtual const std::string& filterString() const; + + // reimplemented from Plugin + virtual Tag* tag() const; + + // reimplemented from Plugin + virtual Plugin* newInstance( const Tag* tag ) const { return new Content( tag, m_factory ); } + + // reimplemented from Plugin + virtual Plugin* clone() const; + + private: + Creator m_creator; + std::string m_disposition; + std::string m_name; + Senders m_senders; + + }; + + } + +} + +#endif // JINGLECONTENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.cpp b/smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.cpp new file mode 100644 index 00000000..13b4a46e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.cpp @@ -0,0 +1,173 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "jinglefiletransfer.h" + +#include "tag.h" +#include "gloox.h" +#include "util.h" + +#include + +namespace gloox +{ + + namespace Jingle + { + + static const char* typeValues [] = { + "offer", + "request", + "checksum", + "abort", + "received" + }; + + FileTransfer::FileTransfer( Type type, const FileList& files ) + : Plugin( PluginFileTransfer ), m_type( type ), m_files( files ) + { + } + + FileTransfer::FileTransfer( const Tag* tag ) + : Plugin( PluginFileTransfer ), m_type( Invalid ) + { + if( !tag || tag->xmlns() != XMLNS_JINGLE_FILE_TRANSFER ) + return; + + std::string name = tag->name(); + if( name == "description" ) + { + const Tag* c = tag->findTag( "description/offer|description/request" ); + if( c ) + { + parseFileList( c->findChildren( "file" ) ); + name = c->name(); + } + } + else if( name == "checksum" || name == "abort" || name == "received" ) + { + parseFileList( tag->findChildren( "file" ) ); + } + + m_type = (Type)util::lookup( name, typeValues ); + } + + void FileTransfer::parseFileList( const TagList& files ) + { + TagList::const_iterator it = files.begin(); + for( ; it != files.end(); ++it ) + { + File f; + Tag *t = (*it)->findChild( "name" ); + f.name = t ? t->cdata() : EmptyString; + t = (*it)->findChild( "desc" ); + f.desc = t ? t->cdata() : EmptyString; + t = (*it)->findChild( "date" ); + f.date = t ? t->cdata() : EmptyString; + t = (*it)->findChild( "size" ); + f.size = t ? atoi( t->cdata().c_str() ) : -1; + t = (*it)->findChild( "range" ); + if( t ) + { + f.range = true; + f.offset = t->hasAttribute( "offset" ) ? atoi( t->findAttribute( "offset" ).c_str() ) : -1; + } + t = (*it)->findChild( "hash", XMLNS, XMLNS_HASHES ); + if( t ) + { + f.hash_algo = t->findAttribute( "algo" ); + f.hash = t->cdata(); + } + m_files.push_back( f ); + } + } + + const StringList FileTransfer::features() const + { + StringList sl; + sl.push_back( XMLNS_JINGLE_FILE_TRANSFER ); + return sl; + } + + const std::string& FileTransfer::filterString() const + { + static const std::string filter = "content/description[@xmlns='" + XMLNS_JINGLE_FILE_TRANSFER + "']" + "|jingle/abort[@xmlns='" + XMLNS_JINGLE_FILE_TRANSFER + "']" + "|jingle/received[@xmlns='" + XMLNS_JINGLE_FILE_TRANSFER + "']" + "|jingle/checksum[@xmlns='" + XMLNS_JINGLE_FILE_TRANSFER + "']"; + return filter; + } + + Plugin* FileTransfer::newInstance( const Tag* tag ) const + { + return new FileTransfer( tag ); + } + + Tag* FileTransfer::tag() const + { + if( m_type == Invalid ) + return 0; + + Tag* r = 0; + + switch( m_type ) + { + case Offer: + case Request: + { + r = new Tag( "description", XMLNS, XMLNS_JINGLE_FILE_TRANSFER ); + Tag* o = new Tag( r, util::lookup( m_type, typeValues ) ); + FileList::const_iterator it = m_files.begin(); + for( ; it != m_files.end(); ++it ) + { + Tag* f = new Tag( o, "file" ); + new Tag( f, "date", (*it).date ); + new Tag( f, "name", (*it).name ); + new Tag( f, "desc", (*it).desc ); + new Tag( f, "size", util::long2string( (*it).size ) ); + Tag* h = new Tag( f, "hash", XMLNS, XMLNS_HASHES ); + h->addAttribute( "algo", (*it).hash_algo ); + h->setCData( (*it).hash ); + if( (*it).range ) + new Tag( f, "range", "offset", (*it).offset ? util::long2string( (*it).offset ) : EmptyString ); + } + break; + } + case Abort: + case Checksum: + case Received: + { + r = new Tag( util::lookup( m_type, typeValues ), XMLNS, XMLNS_JINGLE_FILE_TRANSFER ); + FileList::const_iterator it = m_files.begin(); + Tag* f = new Tag( r, "file" ); + new Tag( f, "date", (*it).date ); + new Tag( f, "name", (*it).name ); + new Tag( f, "desc", (*it).desc ); + new Tag( f, "size", util::long2string( (*it).size ) ); + Tag* h = new Tag( f, "hash", XMLNS, XMLNS_HASHES ); + h->addAttribute( "algo", (*it).hash_algo ); + h->setCData( (*it).hash ); + if( (*it).range ) + new Tag( f, "range" ); + break; + } + default: + break; + } + + return r; + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.h b/smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.h new file mode 100644 index 00000000..b43d21ac --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglefiletransfer.h @@ -0,0 +1,134 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLEFILETRANSFER_H__ +#define JINGLEFILETRANSFER_H__ + +#include "jingleplugin.h" +#include "tag.h" + +#include +#include + +namespace gloox +{ + + namespace Jingle + { + + /** + * @brief An abstraction of the signaling part of Jingle File Transfer (@xep{0234}), implemented as a Jingle::Plugin. + * + * XEP Version: 0.15 + * + * @author Jakob Schröter + * @since 1.0.7 + */ + class GLOOX_API FileTransfer : public Plugin + { + public: + + /** + * The type of a FileTransfer instance. + */ + enum Type + { + Offer, /**< Signifies a file transfer offer (send). */ + Request, /**< Signifies a file request (pull). */ + Checksum, /**< Used to send a file's checksum. */ + Abort, /**< used to abort a running transfer. */ + Received, /**< Signifies a successful file transfer. */ + Invalid /**< Invalid type. */ + }; + + /** + * A struct holding information about a file. + */ + struct File + { + std::string name; /**< The file's name. */ + std::string date; /**< The file's (creation?) date */ + std::string desc; /**< A description. */ + std::string hash; /**< The file's cehcksum. */ + std::string hash_algo; /**< The algorithm used to calculate the checksum */ + long int size; /**< The filesize in Bytes. */ + bool range; /**< Signifies that an offset transfer is possible. */ + long int offset; /**< An (optional) offset. */ + }; + + /** A list of file information structs. */ + typedef std::list FileList; + + /** + * Creates a new instance. + * @param type The type of the object. + * @param files A list of files to offer, request, acknowledge, ... Most of + * the time this list will contain only one file. + */ + FileTransfer( Type type, const FileList& files ); + + /** + * Creates a new instance from the given Tag + * @param tag The Tag to parse. + */ + FileTransfer( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~FileTransfer() {} + + /** + * Returns the type. + * @return The type. + */ + Type type() const { return m_type; } + + /** + * Returns a list of embedded file infos. + * @return A list of embedded file infos. + */ + const FileList& files() const { return m_files; } + + // reimplemented from Plugin + virtual const StringList features() const; + + // reimplemented from Plugin + virtual const std::string& filterString() const; + + // reimplemented from Plugin + virtual Tag* tag() const; + + // reimplemented from Plugin + virtual Plugin* newInstance( const Tag* tag ) const; + + // reimplemented from Plugin + virtual Plugin* clone() const + { + return new FileTransfer( *this ); + } + + private: + + void parseFileList( const TagList& files ); + + Type m_type; + FileList m_files; + + }; + + } + +} + +#endif // JINGLEFILETRANSFER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jingleiceudp.cpp b/smack/smack/src/main/cpp/gloox/src/jingleiceudp.cpp new file mode 100644 index 00000000..eee9f3d7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jingleiceudp.cpp @@ -0,0 +1,113 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "jingleiceudp.h" + +#include "tag.h" +#include "gloox.h" + +namespace gloox +{ + + namespace Jingle + { + + static const char* typeValues [] = { + "host", + "prflx", + "relay", + "srflx" + }; + + ICEUDP::ICEUDP( const std::string& pwd, const std::string& ufrag, CandidateList& candidates ) + : Plugin( PluginICEUDP ), m_pwd( pwd ), m_ufrag( ufrag), m_candidates( candidates ) + { + } + + ICEUDP::ICEUDP( const Tag* tag ) + : Plugin( PluginICEUDP ) + { + if( !tag || tag->name() != "transport" || tag->xmlns() != XMLNS_JINGLE_ICE_UDP ) + return; + + m_pwd = tag->findAttribute( "pwd" ); + m_ufrag = tag->findAttribute( "ufrag" ); + const TagList candidates = tag->findChildren( "candidate" ); + TagList::const_iterator it = candidates.begin(); + for( ; it != candidates.end(); ++it ) + { + Candidate c; + c.component = (*it)->findAttribute( "component" ); + c.foundation = (*it)->findAttribute( "foundation" ); + c.generation = (*it)->findAttribute( "generation" ); + c.id = (*it)->findAttribute( "id" ); + c.ip = (*it)->findAttribute( "ip" ); + c.network = (*it)->findAttribute( "network" ); + c.port = atoi( (*it)->findAttribute( "port" ).c_str() ); + c.priority = atoi( (*it)->findAttribute( "priority" ).c_str() ); + c.protocol = (*it)->findAttribute( "protocol" ); + c.rel_addr = (*it)->findAttribute( "rel-addr" ); + c.rel_port = atoi( (*it)->findAttribute( "rel-port" ).c_str() ); + c.type = (Type)util::lookup( (*it)->findAttribute( "type" ), typeValues ); + m_candidates.push_back( c ); + } + } + + const StringList ICEUDP::features() const + { + StringList sl; + sl.push_back( XMLNS_JINGLE_ICE_UDP ); + return sl; + } + + const std::string& ICEUDP::filterString() const + { + static const std::string filter = "content/transport[@xmlns='" + XMLNS_JINGLE_ICE_UDP + "']"; + return filter; + } + + Plugin* ICEUDP::newInstance( const Tag* tag ) const + { + return new ICEUDP( tag ); + } + + Tag* ICEUDP::tag() const + { + Tag* t = new Tag( "transport", XMLNS, XMLNS_JINGLE_ICE_UDP ); + t->addAttribute( "pwd", m_pwd ); + t->addAttribute( "ufrag", m_ufrag ); + + CandidateList::const_iterator it = m_candidates.begin(); + for( ; it != m_candidates.end(); ++it ) + { + Tag* c = new Tag( t, "candidate" ); + c->addAttribute( "component", (*it).component ); + c->addAttribute( "foundation", (*it).foundation ); + c->addAttribute( "generation", (*it).generation ); + c->addAttribute( "id", (*it).id ); + c->addAttribute( "ip", (*it).ip ); + c->addAttribute( "network", (*it).network ); + c->addAttribute( "port", (*it).port ); + c->addAttribute( "priority", (*it).priority ); + c->addAttribute( "protocol", (*it).protocol ); + c->addAttribute( "rel-addr", (*it).rel_addr ); + c->addAttribute( "rel-port", (*it).rel_port ); + c->addAttribute( "type", util::lookup( (*it).type, typeValues ) ); + } + + return t; + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/jingleiceudp.h b/smack/smack/src/main/cpp/gloox/src/jingleiceudp.h new file mode 100644 index 00000000..7d2d3fce --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jingleiceudp.h @@ -0,0 +1,141 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLEICEUDP_H__ +#define JINGLEICEUDP_H__ + +#include "jingleplugin.h" + +#include +#include + +namespace gloox +{ + + class Tag; + + namespace Jingle + { + + /** + * @brief An abstraction of the signaling part of Jingle ICE-UDP Transport Method (@xep{0176}). + * + * XEP Version: 1.0 + * + * @author Jakob Schröter + * @since 1.0.7 + */ + class GLOOX_API ICEUDP : public Plugin + { + public: + /** + * Describes the candidate type. + */ + enum Type + { + Host, /**< A host candidate. */ + PeerReflexive, /**< A peer reflexive candidate. */ + Relayed, /**< A relayed candidate. */ + ServerReflexive /**< A server reflexive candidate. */ + }; + + /** + * Describes a single transport candidate. + */ + struct Candidate + { + std::string component; /**< A Component ID as defined in ICE-CORE. */ + std::string foundation; /**< A Foundation as defined in ICE-CORE.*/ + std::string generation; /**< An index, starting at 0, that enables the parties to keep track of + updates to the candidate throughout the life of the session. */ + std::string id; /**< A unique identifier for the candidate. */ + std::string ip; /**< The IP address for the candidate transport mechanism. */ + std::string network; /**< An index, starting at 0, referencing which network this candidate is on for a given peer. */ + int port; /**< The port at the candidate IP address. */ + int priority; /**< A Priority as defined in ICE-CORE. */ + std::string protocol; /**< The protocol to be used. Should be @b udp. */ + std::string rel_addr; /**< A related address as defined in ICE-CORE. */ + int rel_port; /**< A related port as defined in ICE-CORE. */ + Type type; /**< A Candidate Type as defined in ICE-CORE. */ + }; + + /** A list of transport candidates. */ + typedef std::list CandidateList; + + /** + * Constructs a new instance. + * @param pwd The @c pwd value. + * @param ufrag The @c ufrag value. + * @param candidates A list of connection candidates. + */ + ICEUDP( const std::string& pwd, const std::string& ufrag, CandidateList& candidates ); + + /** + * Constructs a new instance from the given tag. + * @param tag The Tag to parse. + */ + ICEUDP( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~ICEUDP() {} + + /** + * Returns the @c pwd value. + * @return The @c pwd value. + */ + const std::string& pwd() const { return m_pwd; } + + /** + * Returns the @c ufrag value. + * @return The @c ufrag value. + */ + const std::string& ufrag() const { return m_ufrag; } + + /** + * Returns the list of connection candidates. + * @return The list of connection candidates. + */ + const CandidateList& candidates() const { return m_candidates; } + + // reimplemented from Plugin + virtual const StringList features() const; + + // reimplemented from Plugin + virtual const std::string& filterString() const; + + // reimplemented from Plugin + virtual Tag* tag() const; + + // reimplemented from Plugin + virtual Plugin* newInstance( const Tag* tag ) const; + + // reimplemented from Plugin + virtual Plugin* clone() const + { + return new ICEUDP( *this ); + } + + private: + std::string m_pwd; + std::string m_ufrag; + CandidateList m_candidates; + + }; + + } + +} + +#endif // JINGLEICEUDP_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jingleplugin.h b/smack/smack/src/main/cpp/gloox/src/jingleplugin.h new file mode 100644 index 00000000..94ba2aaa --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jingleplugin.h @@ -0,0 +1,176 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLEPLUGIN_H__ +#define JINGLEPLUGIN_H__ + +#include "macros.h" +#include "util.h" + +#include +#include + +namespace gloox +{ + + class Tag; + + namespace Jingle + { + + class Plugin; + class PluginFactory; + + enum JinglePluginType + { + PluginNone, /**< Invalid plugin type. */ + PluginContent, /**< A plugin abstracting a <content> element. May contain further plugins. */ + PluginFileTransfer, /**< A plugin for File Transfer. */ + PluginICEUDP, /**< A plugin for ICE UDP transport negotiation. */ + PluginReason, /**< An abstraction of a Jingle (@xep{0166}) session terminate reason. */ + PluginUser /**< User-supplied plugins must use IDs above this. Do + * not hard-code PluginUser's value anywhere, it is subject + * to change. */ + }; + + /** + * A list of Jingle plugins. + */ + typedef std::list PluginList; + + /** + * @brief An abstraction of a Jingle plugin. This is part of Jingle (@xep{0166} et al.) + * + * This is the base class for Content and all other pluggable Jingle-related containers, e.g. + * session information, such as the 'ringing' info in Jingle Audio, or Jingle DTMF, etc. + * + * A Plugin abstracts the XML that gets sent and received as part of a Jingle session negotiation. + * + * XEP Version: 1.1 + * + * @author Jakob Schröter + * @since 1.0.5 + */ + class GLOOX_API Plugin + { + + friend class PluginFactory; + + public: + /** + * Simple initializer. + */ + Plugin( JinglePluginType type ) : m_factory( 0 ), m_pluginType( type ) {} + + /** + * Virtual destructor. + */ + virtual ~Plugin() { util::clearList( m_plugins ) ; } + + /** + * Adds another Plugin as child. + * @param plugin A plugin to be embedded. Will be owned by this instance and deleted in the destructor. + */ + void addPlugin( const Plugin* plugin ) { if( plugin ) m_plugins.push_back( plugin ); } + + /** + * Finds a Jingle::Plugin of a particular type. + * @param type JinglePluginType to search for. + * @return A pointer to the first Jingle::Plugin of the given type, or 0 if none was found. + */ + const Plugin* findPlugin( int type ) const + { + PluginList::const_iterator it = m_plugins.begin(); + for( ; it != m_plugins.end() && (*it)->pluginType() != type; ++it ) ; + return it != m_plugins.end() ? (*it) : 0; + } + + /** + * Finds a Jingle::Plugin of a particular type. + * Example: + * @code + * const MyPlugin* c = plugin.findPlugin( PluginMyPlugin ); + * @endcode + * @param type The plugin type to look for. + * @return The static_cast' type, or 0 if none was found. + */ + template< class T > + inline const T* findPlugin( int type ) const + { + return static_cast( findPlugin( type ) ); + } + + /** + * Returns a reference to a list of embedded plugins. + * @return A reference to a list of embedded plugins. + */ + const PluginList& plugins() const { return m_plugins; } + + /** + * Reimplement this function if your plugin wants to add anything to the list of + * features announced via Disco. + * @return A list of additional feature strings. + */ + virtual const StringList features() const { return StringList(); } + + /** + * Returns an XPath expression that describes a path to child elements of a + * jingle element that the plugin handles. + * The result should be a single Tag. + * + * @return The plugin's filter string. + */ + virtual const std::string& filterString() const = 0; + + /** + * Returns a Tag representation of the plugin. + * @return A Tag representation of the plugin. + */ + virtual Tag* tag() const = 0; + + /** + * Returns a new instance of the same plugin type, + * based on the Tag provided. + * @param tag The Tag to parse and create a new instance from. + * @return The new plugin instance. + */ + virtual Plugin* newInstance( const Tag* tag ) const = 0; + + /** + * Creates an identical deep copy of the current instance. + * @return An identical deep copy of the current instance. + */ + virtual Plugin* clone() const = 0; + + /** + * Returns the plugin type. + * @return The plugin type. + */ + JinglePluginType pluginType() const { return m_pluginType; } + + protected: + PluginList m_plugins; + PluginFactory* m_factory; + + private: + void setFactory( PluginFactory* factory ) { m_factory = factory; } + + JinglePluginType m_pluginType; + + }; + + } + +} + +#endif // JINGLEPLUGIN_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.cpp b/smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.cpp new file mode 100644 index 00000000..510516f8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.cpp @@ -0,0 +1,91 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "jinglepluginfactory.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + namespace Jingle + { + + PluginFactory::PluginFactory() + { + } + + PluginFactory::~PluginFactory() + { + util::clearList( m_plugins ); + } + + void PluginFactory::registerPlugin( Plugin* plugin ) + { + if( !plugin ) + return; + + plugin->setFactory( this ); + m_plugins.push_back( plugin ); + } + + void PluginFactory::addPlugins( Plugin& plugin, const Tag* tag ) + { + if( !tag ) + return; + + ConstTagList::const_iterator it; + + PluginList::const_iterator itp = m_plugins.begin(); + for( ; itp != m_plugins.end(); ++itp ) + { + const ConstTagList& match = tag->findTagList( (*itp)->filterString() ); + it = match.begin(); + for( ; it != match.end(); ++it ) + { + Plugin* pl = (*itp)->newInstance( (*it) ); + if( pl ) + { + plugin.addPlugin( pl ); + } + } + } + } + + void PluginFactory::addPlugins( Session::Jingle& jingle, const Tag* tag ) + { + if( !tag ) + return; + + ConstTagList::const_iterator it; + + PluginList::const_iterator itp = m_plugins.begin(); + for( ; itp != m_plugins.end(); ++itp ) + { + const ConstTagList& match = tag->findTagList( (*itp)->filterString() ); + it = match.begin(); + for( ; it != match.end(); ++it ) + { + Plugin* pl = (*itp)->newInstance( (*it) ); + if( pl ) + { + jingle.addPlugin( pl ); + } + } + } + } + + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.h b/smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.h new file mode 100644 index 00000000..4d279c43 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglepluginfactory.h @@ -0,0 +1,82 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLEPLUGINFACTORY_H__ +#define JINGLEPLUGINFACTORY_H__ + +#include "jingleplugin.h" +#include "jinglesession.h" + +namespace gloox +{ + + class Tag; + + namespace Jingle + { + + /** + * @brief A factory for which creates Plugin instances based on Tags. This is part of Jingle (@xep{0166}). + * + * Used by Jingle::SessionManager. You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 1.0.7 + */ + class PluginFactory + { + friend class SessionManager; + + public: + /** + * Virtual destructor. + */ + virtual ~PluginFactory(); + + /** + * Registers an empty Plugin as a template with the factory. + * @param plugin The plugin to register. + */ + void registerPlugin( Plugin* plugin ); + + /** + * Based on the template plugins' filter string, this function checks the supplied tag for + * supported extensions and adds them as new plugins to the supplied Plugin instance. + * @param plugin The Plugin-derived object that will have the newly created plugins embedded. + * @param tag The Tag to check for supported extensions. + */ + void addPlugins( Plugin& plugin, const Tag* tag ); + + /** + * Based on the template plugins' filter string, this function checks the supplied tag for + * supported extensions and adds them as new plugins to the supplied Jingle instance. + * @param jingle The Jingle object that will have the newly created plugins embedded. + * @param tag The Tag to check for supported extensions. + */ + void addPlugins( Session::Jingle& jingle, const Tag* tag ); + + private: + /** + * Creates a new instance. + */ + PluginFactory(); + + PluginList m_plugins; + + }; + + } + +} + +#endif // JINGLEPLUGINFACTORY_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jinglesession.cpp b/smack/smack/src/main/cpp/gloox/src/jinglesession.cpp new file mode 100644 index 00000000..c53858f3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglesession.cpp @@ -0,0 +1,501 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "jinglesession.h" + +#include "clientbase.h" +#include "error.h" +#include "jinglecontent.h" +#include "jinglesessionhandler.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + namespace Jingle + { + + static const char* actionValues [] = { + "content-accept", + "content-add", + "content-modify", + "content-reject", + "content-remove", + "description-info", + "security-info", + "session-accept", + "session-info", + "session-initiate", + "session-terminate", + "transport-accept", + "transport-info", + "transport-reject", + "transport-replace" + }; + + static inline Action actionType( const std::string& type ) + { + return (Action)util::lookup( type, actionValues ); + } + + // ---- Session::Reason ---- + static const char* reasonValues [] = { + "alternative-session", + "busy", + "cancel", + "connectivity-error", + "decline", + "expired", + "failed-application", + "failed-transport", + "general-error", + "gone", + "incompatible-parameters", + "media-error", + "security-error", + "success", + "timeout", + "unsupported-applications", + "unsupported-transports" + }; + + static inline Session::Reason::Reasons reasonType( const std::string& type ) + { + return (Session::Reason::Reasons)util::lookup( type, reasonValues ); + } + + Session::Reason::Reason( Reasons reason, + const std::string& sid, + const std::string& text) + : Plugin( PluginReason ), m_reason( reason ), m_sid( sid ), m_text( text ) + { + } + + Session::Reason::Reason( const Tag* tag ) + : Plugin( PluginReason ) + { + if( !tag || tag->name() != "reason" ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "text" ) + m_text = (*it)->cdata(); + else if( (*it)->xmlns() == XMLNS_JINGLE ) + m_reason = reasonType( (*it)->name() ); + } + } + + Session::Reason::~Reason() + { + } + + const std::string& Session::Reason::filterString() const + { + static const std::string filter = "jingle/reason"; + return filter; + } + + Tag* Session::Reason::tag() const + { + if( m_reason == InvalidReason ) + return 0; + + Tag* t = new Tag( "reason" ); + Tag* r = new Tag( t, util::lookup( m_reason, reasonValues ) ); + if( m_reason == AlternativeSession && !m_sid.empty() ) + new Tag( r, "sid", m_sid ); + + if( !m_text.empty() ) + new Tag( t, "text", m_text ); + + return t; + } + + Plugin* Session::Reason::clone() const + { + return new Reason( *this ); + } + // ---- ~Session::Reason ---- + + // ---- Session::Jingle ---- + Session::Jingle::Jingle( Action action, const JID& initiator, const JID& responder, + const PluginList& plugins, const std::string& sid ) + : StanzaExtension( ExtJingle ), m_action( action ), m_sid( sid ), + m_initiator( initiator ), m_responder( responder ), m_plugins( plugins ), m_tag( 0 ) + { + } + +#ifdef JINGLE_TEST + Session::Jingle::Jingle( Action action, const JID& initiator, const JID& responder, + const Plugin* plugin, const std::string& sid ) + : StanzaExtension( ExtJingle ), m_action( action ), m_sid( sid ), + m_initiator( initiator ), m_responder( responder ), m_tag( 0 ) + { + if( plugin ) + m_plugins.push_back( plugin ); + } +#endif + + Session::Jingle::Jingle( const Tag* tag ) + : StanzaExtension( ExtJingle ), m_action( InvalidAction ), m_tag( 0 ) + { + if( !tag || tag->name() != "jingle" ) + return; + + m_action = actionType( tag->findAttribute( "action" ) ); + m_initiator.setJID( tag->findAttribute( "initiator" ) ); + m_responder.setJID( tag->findAttribute( "responder" ) ); + m_sid = tag->findAttribute( "sid" ); + + m_tag = tag->clone(); + } + +// Session::Jingle::Jingle( const Jingle& right ) +// : StanzaExtension( ExtJingle ), m_action( right.m_action ), +// m_sid( right.m_sid ), m_initiator( right.m_initiator ), +// m_responder( right.m_responder ) +// { +// PluginList::const_iterator it = right.m_plugins.begin(); +// for( ; it != right.m_plugins.end(); ++it ) +// m_plugins.push_back( (*it)->clone() ); +// } + + Session::Jingle::~Jingle() + { + util::clearList( m_plugins ); + } + + const std::string& Session::Jingle::filterString() const + { + static const std::string filter = "/iq/jingle[@xmlns='" + XMLNS_JINGLE + "']"; + return filter; + } + + Tag* Session::Jingle::tag() const + { + if( m_action == InvalidAction || m_sid.empty() ) + return 0; + + Tag* t = new Tag( "jingle" ); + t->setXmlns( XMLNS_JINGLE ); + t->addAttribute( "action", util::lookup( m_action, actionValues ) ); + + if( m_initiator && m_action == SessionInitiate ) + t->addAttribute( "initiator", m_initiator.full() ); + + if( m_responder && m_action == SessionAccept ) + t->addAttribute( "responder", m_responder.full() ); + + t->addAttribute( "sid", m_sid ); + + PluginList::const_iterator it = m_plugins.begin(); + for( ; it != m_plugins.end(); ++it ) + t->addChild( (*it)->tag() ); + + return t; + } + + StanzaExtension* Session::Jingle::clone() const + { + return new Jingle( *this ); + } + // ---- ~Session::Jingle ---- + + // ---- Session ---- + Session::Session( ClientBase* parent, const JID& callee, SessionHandler* jsh ) + : m_parent( parent ), m_state( Ended ), m_remote( callee ), + m_handler( jsh ), m_valid( false ) + { + if( !m_parent || !m_handler || !m_remote ) + return; + + m_initiator = m_parent->jid(); + m_sid = m_parent->getID(); + + m_valid = true; + } + + Session::Session( ClientBase* parent, const JID& callee, const Session::Jingle* jingle, SessionHandler* jsh ) + : m_parent( parent ), m_state( Ended ), m_handler( jsh ), m_valid( false ) + { + if( !m_parent || !m_handler || !callee /*|| jingle->action() != SessionInitiate*/ ) + return; + + m_remote = callee; + m_sid = jingle->sid(); + + m_valid = true; + } + + Session::~Session() + { + if( m_parent ) + m_parent->removeIDHandler( this ); + } + + bool Session::contentAccept( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( ContentAccept, content ); + } + + bool Session::contentAdd( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( ContentAdd, content ); + } + + bool Session::contentAdd( const PluginList& contents ) + { + if( m_state < Pending ) + return false; + + return doAction( ContentAdd, contents ); + } + + bool Session::contentModify( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( ContentModify, content ); + } + + bool Session::contentReject( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( ContentReject, content ); + } + + bool Session::contentRemove( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( ContentRemove, content ); + } + + bool Session::descriptionInfo( const Plugin* info ) + { + if( m_state < Pending ) + return false; + + return doAction( DescriptionInfo, info ); + } + + bool Session::securityInfo( const Plugin* info ) + { + if( m_state < Pending ) + return false; + + return doAction( SecurityInfo, info ); + } + + bool Session::sessionAccept( const Content* content ) + { + if( !content || m_state > Pending ) + return false; + + m_state = Active; + return doAction( SessionAccept, content ); + } + + bool Session::sessionAccept( const PluginList& plugins ) + { + if( plugins.empty() || m_state != Pending ) + return false; + + m_state = Active; + return doAction( SessionAccept, plugins ); + } + + bool Session::sessionInfo( const Plugin* info ) + { + if( m_state < Pending ) + return false; + + return doAction( SessionInfo, info ); + } + + bool Session::sessionInitiate( const Content* content ) + { + if( !content || !m_initiator || m_state >= Pending ) + return false; + + m_state = Pending; + return doAction( SessionInitiate, content ); + } + + bool Session::sessionInitiate( const PluginList& plugins ) + { + if( plugins.empty() || !m_initiator || m_state >= Pending ) + return false; + + m_state = Pending; + return doAction( SessionInitiate, plugins ); + } + + bool Session::sessionTerminate( Session::Reason* reason ) + { + if( m_state < Pending /*|| !m_initiator*/ ) + return false; + + m_state = Ended; + + return doAction( SessionTerminate, reason ); + } + + bool Session::transportAccept( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( TransportAccept, content ); + } + + bool Session::transportInfo( const Plugin* info ) + { + if( m_state < Pending ) + return false; + + return doAction( TransportInfo, info ); + } + + bool Session::transportReject( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( TransportReject, content ); + } + + bool Session::transportReplace( const Content* content ) + { + if( m_state < Pending ) + return false; + + return doAction( TransportReplace, content ); + } + + bool Session::doAction( Action action, const Plugin* plugin ) + { + PluginList pl; + pl.push_back( plugin ); + return doAction( action, pl ); + } + + bool Session::doAction( Action action, const PluginList& plugins ) + { + if( !m_valid || !m_parent ) + return false; + + IQ init( IQ::Set, m_remote, m_parent->getID() ); + init.addExtension( new Jingle( action, m_initiator, m_responder, plugins, m_sid ) ); + m_parent->send( init, this, action ); + + return true; + } + + bool Session::handleIq( const IQ& iq ) + { + const Jingle* j = iq.findExtension( ExtJingle ); + if( !j || j->sid() != m_sid || !m_handler || !m_parent ) + return false; + + switch( j->action() ) + { + case SessionAccept: + m_state = Active; + m_responder = j->responder(); + break; + case SessionInitiate: + m_state = Pending; + m_initiator = j->initiator(); + if( !m_responder ) + m_responder = m_parent->jid(); + break; + case SessionTerminate: + m_state = Ended; + break; + default: + break; + } + + IQ re( IQ::Result, iq.from(), iq.id() ); + m_parent->send( re ); + + m_handler->handleSessionAction( j->action(), this, j ); + + return true; + } + + void Session::handleIqID( const IQ& iq, int context ) + { + if( iq.subtype() == IQ::Error ) + { + + const Error* e = iq.findExtension( ExtError ); + m_handler->handleSessionActionError( (Action)context, this, e ); + + switch( context ) + { + case ContentAccept: + break; + case ContentAdd: + break; + case ContentModify: + break; + case ContentReject: + break; + case ContentRemove: + break; + case DescriptionInfo: + break; + case SessionAccept: + break; + case SessionInfo: + break; + case SessionInitiate: + m_state = Ended; + break; + case SessionTerminate: + break; + case TransportAccept: + break; + case TransportInfo: + break; + case TransportReject: + break; + case TransportReplace: + break; + case InvalidAction: + break; + default: + break; + } + } + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/jinglesession.h b/smack/smack/src/main/cpp/gloox/src/jinglesession.h new file mode 100644 index 00000000..719505fb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglesession.h @@ -0,0 +1,575 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLESESSION_H__ +#define JINGLESESSION_H__ + +#include "stanzaextension.h" +#include "tag.h" +#include "iqhandler.h" +#include "jingleplugin.h" + +#include + +namespace gloox +{ + + class ClientBase; + + /** + * @brief The namespace containing Jingle-related (@xep{0166} et. al.) classes. + * + * See @link gloox::Jingle::SessionManager SessionManager @endlink for more information + * about Jingle in gloox. + * + * @author Jakob Schröter + * @since 1.0.5 + */ + namespace Jingle + { + + class Description; + class Transport; + class SessionHandler; + class Content; + + /** + * Jingle Session actions. + */ + enum Action + { + ContentAccept, /**< Accept a content-add action received from another party. */ + ContentAdd, /**< Add one or more new content definitions to the session. */ + ContentModify, /**< Change the directionality of media sending. */ + ContentReject, /**< Reject a content-add action received from another party. */ + ContentRemove, /**< Remove one or more content definitions from the session. */ + DescriptionInfo, /**< Exchange information about parameters for an application type. */ + SecurityInfo, /**< Send information related to establishment or maintenance of security preconditions. */ + SessionAccept, /**< Definitively accept a session negotiation. */ + SessionInfo, /**< Send session-level information, such as a ping or a ringing message. */ + SessionInitiate, /**< Request negotiation of a new Jingle session. */ + SessionTerminate, /**< End an existing session. */ + TransportAccept, /**< Accept a transport-replace action received from another party. */ + TransportInfo, /**< Exchange transport candidates. */ + TransportReject, /**< Reject a transport-replace action received from another party. */ + TransportReplace, /**< Redefine a transport method or replace it with a different method. */ + InvalidAction /**< Invalid action. */ + }; + + /** + * @brief This is an implementation of a Jingle Session (@xep{0166}). + * + * See @link gloox::Jingle::SessionManager Jingle::SessionManager @endlink for info on how to use + * Jingle in gloox. + * + * XEP Version: 1.1 + * + * @author Jakob Schröter + * @since 1.0.5 + */ + class GLOOX_API Session : public IqHandler + { + + friend class SessionManager; + + public: + /** + * Session state. + */ + enum State + { + Ended, /**< The session has ended or was not active yet. */ + Pending, /**< The session has been initiated but has not yet been accepted by the remote party. */ + Active /**< The session is active. */ + }; + + /** + * @brief An abstraction of a Jingle (@xep{0166}) session terminate reason. + * + * XEP Version: 1.1 + * + * @author Jakob Schröter + * @since 1.0.5 + */ + class GLOOX_API Reason : public Plugin + { + public: + /** + * Defined reasons for terminating a Jingle Session. + */ + enum Reasons + { + AlternativeSession, /**< An alternative session exists that should be used. */ + Busy, /**< The terminating party is busy. */ + Cancel, /**< The session has been canceled. */ + ConnectivityError, /**< Connectivity error. */ + Decline, /**< The terminating party formally declines the request. */ + Expired, /**< The session has expired. */ + FailedApplication, /**< Application type setup failed. */ + FailedTransport, /**< Transport setup has failed. */ + GeneralError, /**< General error. */ + Gone, /**< Participant went away. */ + IncompatibleParameters, /**< Offered or negotiated application type parameters not supported. */ + MediaError, /**< Media error. */ + SecurityError, /**< Security error. */ + Success, /**< Session terminated after successful call. */ + Timeout, /**< A timeout occured. */ + UnsupportedApplications, /**< The terminating party does not support any of the offered application formats. */ + UnsupportedTransports, /**< The terminating party does not support any of the offered transport methods. */ + InvalidReason /**< Invalid reason. */ + }; + + /** + * Constructor. + * @param reason The reason for the termination of the session. + * @param sid An optional session ID (only used if reason is AlternativeSession). + * @param text An optional human-readable text explaining the reason for the session termination. + */ + Reason( Reasons reason, const std::string& sid = EmptyString, + const std::string& text = EmptyString ); + + /** + * Constructs a new element by parsing the given Tag. + * @param tag A tag to parse. + */ + Reason( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~Reason(); + + /** + * Returns the reason for the session termination. + * @return The reason for the session termination. + */ + Reasons reason() const { return m_reason; } + + /** + * Returns the session ID of the alternate session, if given (only applicable + * if reason() returns AlternativeSession). + * @return The session ID of the alternative session, or an empty string. + */ + const std::string& sid() const { return m_sid; } + + /** + * Returns the content of an optional, human-readable + * <text> element. + * @return An optional text describing the reason for the terminate action. + */ + const std::string& text() const { return m_text; } + + // reimplemented from Plugin + virtual const std::string& filterString() const; + + // reimplemented from Plugin + virtual Tag* tag() const; + + // reimplemented from Plugin + virtual Plugin* newInstance( const Tag* tag ) const { return new Reason( tag ); } + + // reimplemented from Plugin + virtual Plugin* clone() const; + + private: + Reasons m_reason; + std::string m_sid; + std::string m_text; + + }; + + /** + * @brief This is an abstraction of Jingle's (@xep{0166}) <jingle> element as a StanzaExtension. + * + * XEP Version: 1.1 + * @author Jakob Schröter + * @since 1.0.5 + */ + class Jingle : public StanzaExtension + { + + friend class Session; + + public: + /** + * Constructs a new object from the given Tag. + * @param tag The Tag to parse. + */ + Jingle( const Tag* tag = 0 ); + + /** + * Virtual Destructor. + */ + virtual ~Jingle(); + + /** + * Returns the session ID. + * @return The session ID. + */ + const std::string& sid() const { return m_sid; } + + /** + * Returns the 'session initiator'. This will usually be empty for any action other than 'session-initiate'. + * @return The 'session initiator'. + */ + const JID& initiator() const { return m_initiator; } + + /** + * Returns the 'session responder'. This will usually be empty for any action other than 'session-accept'. + * @return The 'session responder'. + */ + const JID& responder() const { return m_responder; } + + /** + * Returns this Jingle's action. + * @return The action. + */ + Action action() const { return m_action; } + + /** + * Adds a Plugin as child. + * @param plugin A plugin to be embedded. Will be owned by this instance and deleted in the destructor. + */ + void addPlugin( const Plugin* plugin ) { if( plugin ) m_plugins.push_back( plugin ); } + + /** + * Returns a reference to a list of embedded plugins. + * @return A reference to a list of embedded plugins. + */ + const PluginList& plugins() const { return m_plugins; } + + /** + * Returns the tag to build plugins from. + * @return The tag to build plugins from. + */ + Tag* embeddedTag() const { return m_tag; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Jingle( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const; + +#ifdef JINGLE_TEST + public: +#else + private: +#endif + /** + * Constructs a new object and fills it according to the parameters. + * @param action The Action to carry out. + * @param initiator The full JID of the initiator of the session flow. Will only be used for the SessionInitiate action. + * @param responder The full JID of the responder. Will only be used for the SessionAccept action. + * @param plugins A list of contents (plugins) for the <jingle> + * element. Usually, these will be Content objects, but can be any Plugin-derived objects. + * These objects will be owned and deleted by this Jingle instance. + * @param sid The session ID: + */ + Jingle( Action action, const JID& initiator, const JID& responder, + const PluginList& plugins, const std::string& sid ); + +#ifdef JINGLE_TEST + /** + * Constructs a new object and fills it according to the parameters. + * @param action The Action to carry out. + * @param initiator The full JID of the initiator of the session flow. Will only be used for the SessionInitiate action. + * @param responder The full JID of the responder. Will only be used for the SessionAccept action. + * @param plugin A single content (plugin) for the <jingle> + * element. Usually, this will be a Content object, but can be any Plugin-derived object. + * This object will be owned and deleted by this Jingle instance. + * @param sid The session ID: + */ + Jingle( Action action, const JID& initiator, const JID& responder, + const Plugin* plugin, const std::string& sid ); + #endif + +// /** +// * Copy constructor. +// * @param right The instance to copy. +// */ +// Jingle( const Jingle& right ); + + Action m_action; + std::string m_sid; + JID m_initiator; + JID m_responder; + PluginList m_plugins; + Tag* m_tag; + + }; + + /** + * Virtual Destructor. + */ + virtual ~Session(); + + /** + * Explicitely sets a new session initiator. The initiator defaults to the initiating entity's JID. + * Normally, you should not need to use this function. + * @param initiator The new initiator. + */ + void setInitiator( const JID& initiator ) { m_initiator = initiator; } + + /** + * Returns the session's initiator. + * @return The session's initiator. + */ + const JID& initiator() const { return m_initiator; } + + /** + * Returns the session's responder. This will only return something useful after the 'session-accept' action has been + * sent/received. + * @return The session's responder. + */ + const JID& responder() const { return m_responder; } + + /** + * Explicitely sets the 'session responder'. By default, the associated ClientBase's jid() will be used. + * You can change this here. + * @note Changing the session responder only affects the 'session-accept' action; it will have no effect after + * that action has been executed or if the local entity is the session initiator. + * @param jid The session responder's full JID. + */ + void setResponder( const JID& jid ) { m_responder = jid; } + + /** + * Explicitely sets a new handler for the session. + * @param handler The new handler. + */ + void setHandler( SessionHandler* handler ) { m_handler = handler; } + + /** + * Sends a 'content-accept' notification. + * @param content The accepted content. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool contentAccept( const Content* content ); + + /** + * Sends a 'content-add' request. + * @param content The proposed content to be added. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool contentAdd( const Content* content ); + + /** + * Sends a 'content-add' request. + * @param contents A list of proposed content to be added. + * These objects will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool contentAdd( const PluginList& contents ); + + /** + * Sends a 'content-modify' request. + * @param content The proposed content type to be modified. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool contentModify( const Content* content ); + + /** + * Sends a 'content-reject' reply. + * @param content The rejected content. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool contentReject( const Content* content ); + + /** + * Sends a 'content-remove' request. + * @param content The content type to be removed. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool contentRemove( const Content* content ); + + /** + * Sends a 'description-info' notice. + * @param info The payload. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool descriptionInfo( const Plugin* info ); + + /** + * Sends a 'security-info' notice. + * @param info A security pre-condition. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool securityInfo( const Plugin* info ); + + /** + * Accepts an incoming session with the given content. + * @param content A pair of application description and transport method wrapped in a Content that describes + * the accepted session parameters. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool sessionAccept( const Content* content ); + + /** + * Accepts an incoming session with the given list of contents. + * @param content A list of Content objects that describe the accepted session parameters. + * These objects will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool sessionAccept( const PluginList& plugins ); + + /** + * Sends a 'session-info' notice. + * @param info The payload. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool sessionInfo( const Plugin* info ); + + /** + * Initiates a session with a remote entity. + * @param content A Content object. You may use initiate( const PluginList& contents ) for more than one Content. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool sessionInitiate( const Content* content ); + + /** + * Initiates a session with a remote entity. + * @param plugins A list of Content objects. It is important to pass a (list of) Content objects here. + * Even though e.g. Jingle::ICEUDP are Plugin-derived, too, using anything other than Content here will result + * in erroneous behaviour at best. You may use sessionInitiate( const Content* content ) for just one Content. + * These objects will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool sessionInitiate( const PluginList& plugins ); + + /** + * Terminates the current session, if it is at least in Pending state, with the given reason. The sid parameter + * is ignored unless the reason is AlternativeSession. + * @param reason The reason for terminating the session. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool sessionTerminate( Session::Reason* reason ); + + /** + * Sends a 'transport-accept' reply. + * @param content The accepted transport wrapped in a Content. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool transportAccept( const Content* content ); + + /** + * Sends a 'transport-info' notice. + * @param info The payload. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool transportInfo( const Plugin* info ); + + /** + * Sends a 'transport-reject' reply. + * @param content The rejected transport wrapped in a Content. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool transportReject( const Content* content ); + + /** + * Sends a 'transport-replace' request. + * @param content The proposed transport to be replaced wrapped in a Content. + * This object will be owned and deleted by this Session instance. + * @return @b False if a prerequisite is not met, @b true otherwise. + */ + bool transportReplace( const Content* content ); + + /** + * Returns the session's state. + * @return The session's state. + */ + State state() const { return m_state; } + + /** + * Sets the session's ID. This will be initialized to a random value (or taken from an incoming session request) + * by default. You should not need to set the session ID manually. + * @param sid The session's id. + */ + void setSID( const std::string& sid ) { m_sid = sid; } + + /** + * Returns the session's ID. + * @return The session's ID. + */ + const std::string& sid() const { return m_sid; } + + // reimplemented from IqHandler + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler + virtual void handleIqID( const IQ& iq, int context ); + +#ifdef JINGLE_TEST + public: +#else + private: +#endif + /** + * Creates a new Jingle Session. + * @param parent The ClientBase to use for communication. + * @param callee The remote end of the session. + * @param jsh The handler to receive events and results. + */ + Session( ClientBase* parent, const JID& callee, SessionHandler* jsh ); + + /** + * Creates a new Session from the incoming Jingle object. + * This is a NOOP for Jingles that have an action() different from SessionInitiate. + * @param parent The ClientBase to use for communication. + * @param callee The remote entity. + * @param jingle The Jingle object to init the Session from. + * @param jsh The handler to receive events and results. + */ + Session( ClientBase* parent, const JID& callee, const Session::Jingle* jingle, + SessionHandler* jsh ); + + bool doAction( Action action, const Plugin* plugin ); + bool doAction( Action action, const PluginList& plugin ); + + ClientBase* m_parent; + State m_state; + JID m_remote; + JID m_initiator; + JID m_responder; + SessionHandler* m_handler; + std::string m_sid; + bool m_valid; + + }; + + } + +} + +#endif // JINGLESESSION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jinglesessionhandler.h b/smack/smack/src/main/cpp/gloox/src/jinglesessionhandler.h new file mode 100644 index 00000000..e6556521 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglesessionhandler.h @@ -0,0 +1,74 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLESESSIONHANDLER_H__ +#define JINGLESESSIONHANDLER_H__ + +#include "macros.h" +#include "jinglesession.h" + +namespace gloox +{ + + namespace Jingle + { + + /** + * @brief A Jingle session handler. + * + * @author Jakob Schröter + * @since 1.0.5 + */ + class GLOOX_API SessionHandler + { + public: + /** + * Virtual destructor. + */ + virtual ~SessionHandler() {} + + /** + * This function is called when the remote party requests an action to be taken. + * @param action The requested action. A convenience parameter, identical to jingle->action(). + * @param session The affected session. + * @param jingle The complete Jingle. + * @note Note that an action can cause a session state change. You may check using session->state(). + * @note Also note that you have to reply to most actions, usually with the *Accept or *Reject counterpart, + * using the similarly-named functions that Session offers. + */ + virtual void handleSessionAction( Action action, Session* session, const Session::Jingle* jingle ) = 0; + + /** + * This function is called when a request to a remote entity returns an error. + * @param action The Action that failed. + * @param session The affected session. + * @param error The error. May be 0 in special cases. + * @note Note that an action can cause a session state change. You may check using session->state(). + */ + virtual void handleSessionActionError( Action action, Session* session, const Error* error ) = 0; + + /** + * This function is called if a remote entity wants to establish a Jingle session. + * @param session The new Jingle session. + * @note Note that you have to explicitely accept or reject the session by calling either of session->sessionAccept() and + * session->sessionTerminate(), respectively. + */ + virtual void handleIncomingSession( Session* session ) = 0; + + }; + + } + +} + +#endif // JINGLESESSIONHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.cpp b/smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.cpp new file mode 100644 index 00000000..8311f018 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.cpp @@ -0,0 +1,104 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "jinglesessionmanager.h" + +#include "clientbase.h" +#include "jinglesession.h" +#include "jinglesessionhandler.h" +#include "disco.h" +#include "util.h" + +namespace gloox +{ + + namespace Jingle + { + + SessionManager::SessionManager( ClientBase* parent, SessionHandler* sh ) + : m_parent( parent ), m_handler( sh ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new Session::Jingle() ); + m_parent->registerIqHandler( this, ExtJingle ); + m_parent->disco()->addFeature( XMLNS_JINGLE ); + } + } + + SessionManager::~SessionManager() + { + util::clearList( m_sessions ); + } + + void SessionManager::registerPlugin( Plugin* plugin ) + { + if( !plugin ) + return; + + m_factory.registerPlugin( plugin ); + if( m_parent ) + { + StringList features = plugin->features(); + StringList::const_iterator it = features.begin(); + for( ; it != features.end(); ++it ) + m_parent->disco()->addFeature( (*it) ); + } + } + + Session* SessionManager::createSession( const JID& callee, SessionHandler* handler ) + { + if( !( handler || m_handler ) || !callee ) + return 0; + + Session* sess = new Session( m_parent, callee, handler ? handler : m_handler ); + m_sessions.push_back( sess ); + return sess; + } + + void SessionManager::discardSession( Session* session ) + { + if( !session ) + return; + + m_sessions.remove( session ); + delete session; + } + + bool SessionManager::handleIq( const IQ& iq ) + { + const Session::Jingle* j = iq.findExtension( ExtJingle ); + if( !j ) + return false; + + m_factory.addPlugins( const_cast( *j ), j->embeddedTag() ); + + SessionList::iterator it = m_sessions.begin(); + for( ; it != m_sessions.end() && (*it)->sid() != j->sid(); ++it ) ; + if( it == m_sessions.end() ) + { + Session* s = new Session( m_parent, iq.from(), j, m_handler ); + m_sessions.push_back( s ); + m_handler->handleIncomingSession( s ); + s->handleIq( iq ); + } + else + { + (*it)->handleIq( iq ); + } + return true; + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.h b/smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.h new file mode 100644 index 00000000..fd388bae --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/jinglesessionmanager.h @@ -0,0 +1,117 @@ +/* + Copyright (c) 2013-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef JINGLESESSIONMANAGER_H__ +#define JINGLESESSIONMANAGER_H__ + +#include "macros.h" +#include "iqhandler.h" +#include "jinglepluginfactory.h" + +#include + +namespace gloox +{ + + class ClientBase; + + namespace Jingle + { + + class Session; + class SessionHandler; + + /** + * @brief The SessionManager is responsible for creating and destroying Jingle sessions, as well as for delegating incoming + * IQs to their respective sessions. This is part of Jingle (@xep{0166}). + * + * @note The classes in the Jingle namespace implement the signaling part of Jingle only. + * Establishing connections to a remote entity or transfering data outside the XMPP channel + * is out of scope of gloox. + * + * To use Jingle with gloox you should first instantiate a Jingle::SessionManager. The SessionManager will + * let you create new Jingle sessions and notify the respective handler about incoming Jingle session requests. + * It will also announce generic Jingle support via Disco. You have to register any + * @link gloox::Jingle::Plugin Jingle plugins @endlink you want to use using registerPlugin(). + * These will automatically announce any additional features via Disco. + * + * Use createSession() to create a new Session. + * + * Implement SessionHandler::handleIncomingSession() to receive incoming session requests. + * + * Use discardSession() to get rid of a session. Do not delete a session manually. + * + * There is no limit to the number of concurrent sessions. + * + * @author Jakob Schröter + * @since 1.0.5 + */ + class GLOOX_API SessionManager : public IqHandler + { + public: + /** + * Creates new instance. There should be only one SessionManager per ClientBase. + * @param parent A ClientBase instance used for sending and receiving. + * @param sh A session handler that will be notified about incoming session requests. + * Only handleIncomingSession() will be called in that handler. + */ + SessionManager( ClientBase* parent, SessionHandler* sh ); + + /** + * Virtual destructor. + */ + virtual ~SessionManager(); + + /** + * Registers an empty Plugin as a template with the manager. + * @param plugin The plugin to register. + */ + void registerPlugin( Plugin* plugin ); + + /** + * Lets you create a new Jingle session. + * @param callee The remote entity's JID. + * @param handler The handler responsible for handling events assicoated with the new session. + * @return The new session. + * @note You should not delete a session yourself. Instead, pass it to discardSession(). + */ + Session* createSession( const JID& callee, SessionHandler* handler ); + + /** + * Removes a given session from the nternal queue and deletes it. + * @param session The session to delete. + */ + void discardSession( Session* session ); + + + // reimplemented from IqHandler + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler + virtual void handleIqID( const IQ& /*iq*/, int /*context*/ ) {} + + private: + typedef std::list SessionList; + + SessionList m_sessions; + ClientBase* m_parent; + SessionHandler* m_handler; + PluginFactory m_factory; + + }; + + } + +} + +#endif // JINGLESESSIONMANAGER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/lastactivity.cpp b/smack/smack/src/main/cpp/gloox/src/lastactivity.cpp new file mode 100644 index 00000000..8942f357 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/lastactivity.cpp @@ -0,0 +1,132 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "lastactivity.h" +#include "disco.h" +#include "discohandler.h" +#include "clientbase.h" +#include "error.h" +#include "lastactivityhandler.h" + +#include + +namespace gloox +{ + + // ---- LastActivity::Query ---- + LastActivity::Query::Query( const Tag* tag ) + : StanzaExtension( ExtLastActivity ), m_seconds( -1 ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_LAST ) + return; + + if( tag->hasAttribute( "seconds" ) ) + m_seconds = atoi( tag->findAttribute( "seconds" ).c_str() ); + + m_status = tag->cdata(); + } + + LastActivity::Query::Query( const std::string& _status, long _seconds ) + : StanzaExtension( ExtLastActivity ), m_seconds( _seconds ), + m_status( _status ) + { + } + + LastActivity::Query::~Query() + { + } + + const std::string& LastActivity::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_LAST + "']" + "|/presence/query[@xmlns='" + XMLNS_LAST + "']"; + return filter; + } + + Tag* LastActivity::Query::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_LAST ); + t->addAttribute( "seconds", m_seconds ); + t->setCData( m_status ); + return t; + } + // ---- ~LastActivity::Query ---- + + // ---- LastActivity ---- + LastActivity::LastActivity( ClientBase* parent ) + : m_lastActivityHandler( 0 ), m_parent( parent ), + m_active( time ( 0 ) ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new Query() ); + m_parent->registerIqHandler( this, ExtLastActivity ); + m_parent->disco()->addFeature( XMLNS_LAST ); + } + } + + LastActivity::~LastActivity() + { + if( m_parent ) + { + m_parent->disco()->removeFeature( XMLNS_LAST ); + m_parent->removeIqHandler( this, ExtLastActivity ); + m_parent->removeIDHandler( this ); + } + } + + void LastActivity::query( const JID& jid ) + { + IQ iq( IQ::Get, jid, m_parent->getID() ); + iq.addExtension( new Query() ); + m_parent->send( iq, this, 0 ); + } + + bool LastActivity::handleIq( const IQ& iq ) + { + const Query* q = iq.findExtension( ExtLastActivity ); + if( !q || iq.subtype() != IQ::Get ) + return false; + + IQ re( IQ::Result, iq.from(), iq.id() ); + re.addExtension( new Query( EmptyString, (long)( time( 0 ) - m_active ) ) ); + m_parent->send( re ); + + return true; + } + + void LastActivity::handleIqID( const IQ& iq, int /*context*/ ) + { + if( !m_lastActivityHandler ) + return; + + if( iq.subtype() == IQ::Result ) + { + const Query* q = iq.findExtension( ExtLastActivity ); + if( !q || q->seconds() < 0 ) + return; + + m_lastActivityHandler->handleLastActivityResult( iq.from(), q->seconds(), q->status() ); + } + else if( iq.subtype() == IQ::Error && iq.error() ) + m_lastActivityHandler->handleLastActivityError( iq.from(), iq.error()->error() ); + } + + void LastActivity::resetIdleTimer() + { + m_active = time( 0 ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/lastactivity.h b/smack/smack/src/main/cpp/gloox/src/lastactivity.h new file mode 100644 index 00000000..a40e6f4f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/lastactivity.h @@ -0,0 +1,166 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef LASTACTIVITY_H__ +#define LASTACTIVITY_H__ + +#include "iqhandler.h" + +#include + +namespace gloox +{ + + class JID; + class ClientBase; + class LastActivityHandler; + + /** + * @brief This is an implementation of @xep{0012} (Last Activity) for both clients and components. + * + * LastActivity can be used to query remote entities about their last activity time as well + * as answer incoming last-activity-queries. + * + * XEP Version: 2.0 + * + * @author Jakob Schröter + * @since 0.6 + */ + class GLOOX_API LastActivity : public IqHandler + { + public: + /** + * @brief This is an abstraction of a LastActivity Query that + * can be used in @xep{0012} as well as @xep{0256}. + * + * XEP-Version: 2.0 (@xep{0012}) + * XEP-Version: 0.1 (@xep{0256}) + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Query : public StanzaExtension + { + public: + /** + * Constructs a new Query object from the given Tag. + * @param tag The Tag to parse. + */ + Query( const Tag* tag = 0 ); + + /** + * Constructs a new Query object from the given long. + * @param status A status message. + * @param seconds The number of seconds since last activity. + */ + Query( const std::string& status, long seconds ); + + /** + * Virtual destructor. + */ + virtual ~Query(); + + /** + * Returns the number of seconds since last activity. + * @return The number of seconds since last activity. + * -1 if last activity is unknown. + */ + long seconds() const { return m_seconds; } + + /** + * Returns the last status message if the user is offline + * and specified a status message when logging off. + * @return The last status message, if any. + */ + const std::string& status() const { return m_status; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Query( *this ); + } + + private: + long m_seconds; + std::string m_status; + + }; + + /** + * Constructs a new LastActivity object. + * @param parent The ClientBase object to use for communication. + */ + LastActivity( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~LastActivity(); + + /** + * Queries the given JID for their last activity. The result can be received by reimplementing + * @ref LastActivityHandler::handleLastActivityResult() and + * @ref LastActivityHandler::handleLastActivityError(). + */ + void query( const JID& jid ); + + /** + * Use this function to register an object as handler for incoming results of Last-Activity queries. + * Only one handler is possible at a time. + * @param lah The object to register as handler. + */ + void registerLastActivityHandler( LastActivityHandler* lah ) { m_lastActivityHandler = lah; } + + /** + * Use this function to un-register the LastActivityHandler set earlier. + */ + void removeLastActivityHandler() { m_lastActivityHandler = 0; } + + /** + * Use this function to reset the idle timer. By default the number of seconds since the + * instantiation will be used. + */ + void resetIdleTimer(); + + // reimplemented from IqHandler + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef LASTACTIVITY_TEST + public: +#endif + LastActivityHandler* m_lastActivityHandler; + ClientBase* m_parent; + + time_t m_active; + + }; + +} + +#endif // LASTACTIVITY_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/lastactivityhandler.h b/smack/smack/src/main/cpp/gloox/src/lastactivityhandler.h new file mode 100644 index 00000000..3518123a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/lastactivityhandler.h @@ -0,0 +1,58 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef LASTACTIVITYHANDLER_H__ +#define LASTACTIVITYHANDLER_H__ + +#include "gloox.h" +#include "jid.h" + +namespace gloox +{ + + /** + * @brief This is an virtual interface that, once reimplemented, allows to receive the + * results of Last-Activity-queries to other entities. + * + * @author Jakob Schröter + * @since 0.6 + */ + class GLOOX_API LastActivityHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~LastActivityHandler() {} + + /** + * This function is called when a positive result of a query arrives. + * @param jid The JID of the queried contact. + * @param seconds The idle time or time of last presence of the contact. (Depends + * on the JID, check the spec.) + * @param status If the contact is offline, this is the last presence status message. May be empty. + */ + virtual void handleLastActivityResult( const JID& jid, long seconds, const std::string& status ) = 0; + + /** + * This function is called when an error is returned by the queried antity. + * @param jid The queried entity's address. + * @param error The reported error. + */ + virtual void handleLastActivityError( const JID& jid, StanzaError error ) = 0; + + }; + +} + +#endif // LASTACTIVITYHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/linklocal.h b/smack/smack/src/main/cpp/gloox/src/linklocal.h new file mode 100644 index 00000000..c5082883 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/linklocal.h @@ -0,0 +1,79 @@ +/* + Copyright (c) 2012-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef LINKLOCAL_H__ +#define LINKLOCAL_H__ + +#include "config.h" + +#ifdef HAVE_MDNS + +#include +#include + +namespace gloox +{ + + /** + * @brief Namespace holding all the Link-local-related structures and definitions. + * + * See @ref gloox::LinkLocal::Manager for more information on how to implement + * link-local messaging. + */ + namespace LinkLocal + { + + class Client; + + /** + * Used in conjunction with Service to indicate whether a service has been added (newly advertised) or removed. + */ + enum Flag + { + AddService, /**< A service has been added. */ + RemoveService /**< A service has been removed. */ + }; + + /** + * @brief An abstraction of the parameters of a single link-local service. + * + * @author Jakob Schröter + * @since 1.0.x + */ + struct Service + { + friend class Manager; + + private: + Service( Flag _flag, const std::string& _service, const std::string& _regtype, const std::string& _domain, int _interface ) + : flag( _flag ), service( _service ), regtype( _regtype ), domain( _domain ), iface( _interface ) {} + + public: + Flag flag; + std::string service; + std::string regtype; + std::string domain; + int iface; + }; + + /** + * A list of services. + */ + typedef std::list ServiceList; + + } + +} + +#endif // HAVE_MDNS + +#endif // LINKLOCAL_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/linklocalclient.cpp b/smack/smack/src/main/cpp/gloox/src/linklocalclient.cpp new file mode 100644 index 00000000..237f6b5e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/linklocalclient.cpp @@ -0,0 +1,219 @@ +/* + Copyright (c) 2012-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "linklocalclient.h" + +#ifdef HAVE_MDNS + +#include "gloox.h" +#include "tag.h" +#include "util.h" +#include "connectiontcpclient.h" + +#include + +#if ( !defined( _WIN32 ) && !defined( _WIN32_WCE ) ) || defined( __SYMBIAN32__ ) +# include +#endif + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# include +#elif defined( _WIN32_WCE ) +# include +#endif + +namespace gloox +{ + + namespace LinkLocal + { + + Client::Client( const JID& jid ) + : gloox::Client( jid, EmptyString ), m_qRef( 0 ), m_rRef( 0 ), m_currentRef( 0 ), + m_interface( 0 ), m_port( 0 ), m_streamSent( false ) + { + } + + Client::~Client() + { + } + + bool Client::connect() + { + return ClientBase::connect( false ); + } + + bool Client::connect( const std::string& service, const std::string& type, + const std::string& domain, int iface ) + { + m_interface = interface; + return resolve( service, type, domain ); + } + + ConnectionError Client::recv( int timeout ) + { + if( m_connection && m_connection->state() == StateConnected ) + return ClientBase::recv( timeout ); + else + { + if( !m_currentRef ) + return ConnNoError; + + struct timeval tv; + + fd_set fds; + FD_ZERO( &fds ); + // the following causes a C4127 warning in VC++ Express 2008 and possibly other versions. + // however, the reason for the warning can't be fixed in gloox. + FD_SET( DNSServiceRefSockFD( m_currentRef ), &fds ); + + tv.tv_sec = timeout / 1000000; + tv.tv_usec = timeout % 1000000; + + if( select( FD_SETSIZE, &fds, 0, 0, timeout == -1 ? 0 : &tv ) > 0 ) + { + if( FD_ISSET( DNSServiceRefSockFD( m_currentRef ), &fds ) != 0 ) + DNSServiceProcessResult( m_currentRef ); + } + + return ConnNoError; + } + } + + + bool Client::resolve( const std::string& service, const std::string& type, + const std::string& domain ) + { + m_to = service; + m_rRef = 0; + DNSServiceErrorType e = DNSServiceResolve( &m_rRef, 0, m_interface, service.c_str(), type.c_str(), + domain.c_str(), (DNSServiceResolveReply)&handleResolveReply, this ); + if( e != kDNSServiceErr_NoError ) + { + DNSServiceRefDeallocate( m_rRef ); + m_rRef = 0; + return false; + } + m_currentRef = m_rRef; + + return true; + } + + void Client::handleResolveReply( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceErrorType errorCode, const char* fullname, const char* hosttarget, + uint16_t port, uint16_t txtLen, const unsigned char* txtRecord, void* context ) + { + if( !context || errorCode != kDNSServiceErr_NoError ) + return; + + // printf("Client::handleResolveReply susccessful, querying %s\n", hosttarget ); + + static_cast( context )->query( hosttarget, ntohs( port ) ); + } + + bool Client::query( const std::string& hostname, int port ) + { + m_port = port; + m_qRef = 0; + DNSServiceErrorType e = DNSServiceQueryRecord( &m_qRef, 0, m_interface, hostname.c_str(), kDNSServiceType_A, + kDNSServiceClass_IN, (DNSServiceQueryRecordReply)&handleQueryReply, this ); + if( e != kDNSServiceErr_NoError ) + { + // printf( "Client::query() failed\n" ); + DNSServiceRefDeallocate( m_qRef ); + m_qRef = 0; + return false; + } + m_currentRef = m_qRef; + + return true; + } + + void Client::handleQueryReply( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, + uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, + void *context ) + { + // printf("Client::handleQueryReply returned\n" ); + + if( !context || errorCode != kDNSServiceErr_NoError ) + return; + + const unsigned char* rd = static_cast( rdata ); + std::string addr = util::int2string( rd[0] ); + addr += '.'; + addr += util::int2string( rd[1] ); + addr += '.'; + addr += util::int2string( rd[2] ); + addr += '.'; + addr += util::int2string( rd[3] ); + // printf( "host %s is at %s\n", fullname, addr.c_str() ); + static_cast( context )->handleQuery( addr ); + } + + void Client::handleQuery( const std::string& addr ) + { + if( m_rRef ) + { + DNSServiceRefDeallocate( m_rRef ); + m_rRef = 0; + } + + ConnectionTCPClient* connection = new ConnectionTCPClient( this, logInstance(), addr, m_port ); + // printf( "LinkLocal::Client: connecting to %s:%d\n", addr.c_str(), m_port ); + ConnectionError e = connection->connect(); + if( e != ConnNoError ) + { + // printf( "connection error: %d\n", e ); + delete connection; + } + } + + void Client::handleConnect( const ConnectionBase* connection ) + { + if( m_qRef ) + { + DNSServiceRefDeallocate( m_qRef ); + m_qRef = 0; + m_currentRef = 0; + } + + // printf( "LinkLocal::Client::handleConnect()!!!\n" ); + ConnectionBase* cb = const_cast( connection ); + gloox::Client::setConnectionImpl( cb ); + gloox::Client::connect( false ); + sendStart( m_to ); + } + + void Client::handleStartNode( const Tag* start ) + { + // printf( "LinkLocal::Client::handleStartNode()\n" ); + if( start && !m_streamSent ) + sendStart( start->findAttribute( "from" ) ); + } + + void Client::sendStart( const std::string& to ) + { + m_streamSent = true; + std::string s = ""; + send( s ); + } + + } + +} + +#endif // HAVE_MDNS diff --git a/smack/smack/src/main/cpp/gloox/src/linklocalclient.h b/smack/smack/src/main/cpp/gloox/src/linklocalclient.h new file mode 100644 index 00000000..027c11af --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/linklocalclient.h @@ -0,0 +1,125 @@ +/* + Copyright (c) 2012-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef LINKLOCALCLIENT_H__ +#define LINKLOCALCLIENT_H__ + +#include "config.h" + +#ifdef HAVE_MDNS + +#include "client.h" +#include "jid.h" + +#include + +#include + +namespace gloox +{ + + class Tag; + + namespace LinkLocal + { + + /** + * @brief An implementation of a link-local client. + * + * See @ref gloox::LinkLocal::Manager for more information on how to implement + * link-local messaging. + * + * @author Jakob Schröter + * @since 1.0.x + */ + class Client : public gloox::Client + { + public: + /** + * Constructs a new instance. + * @param jid The local JID to use. + */ + Client( const JID& jid ); + + /** + * Virtual destructor. + */ + virtual ~Client(); + + /** + * Internally sets up an already connected connection. + * @note Use this function only on a Client instance that you created for an @b incoming connection. + */ + bool connect(); + + /** + * Starts resolving the given service. Use values from Handler::handleBrowseReply(). + * @param service The service to connect to. + * @param type The service type. + * @param domain The service's domain. + * @param interface The network interface the service was found on. May be 0 to try + * to resolve the service on all available interfaces. + * @return @b True if resolving the service could be started successfully, @b false otherwise. + * @note Use this function only for @b outgoing connections. + */ + bool connect( const std::string& service, const std::string& type, const std::string& domain, int iface = 0 ); + + /** + * Call this periodically to receive data from the underlying socket. + * @param timeout An optional timeout in microseconds. Default of -1 means blocking + * until data was available. + * @return The state of the underlying connection. + */ + virtual ConnectionError recv( int timeout = -1 ); + + // reimplemented from ConnectionDataHandler, overwriting ClientBase::handleConnect() + virtual void handleConnect( const ConnectionBase* connection ); + + protected: + // reimplemented from ClientBase + virtual void handleStartNode( const Tag* start ); + + private: + static void handleResolveReply( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceErrorType errorCode, const char *fullname, const char *hosttarget, + uint16_t port, uint16_t txtLen, const unsigned char *txtRecord, void *context ); + static void handleQueryReply( DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype, + uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, + void *context ); + + bool resolve( const std::string& serviceName, const std::string& regtype, const std::string& replyDomain ); + bool query( const std::string& hostname, int port ); + void handleQuery( const std::string& addr ); + void sendStart( const std::string& to ); + + DNSServiceRef m_qRef; + DNSServiceRef m_rRef; + DNSServiceRef m_currentRef; + + std::string m_to; + + int m_interface; + int m_port; + + bool m_streamSent; + + }; + + } + +} + +#endif // HAVE_MDNS + +#endif // LINKLOCALCLIENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/linklocalhandler.h b/smack/smack/src/main/cpp/gloox/src/linklocalhandler.h new file mode 100644 index 00000000..c82684d5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/linklocalhandler.h @@ -0,0 +1,66 @@ +/* + Copyright (c) 2012-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef LINKLOCALHANDLER_H__ +#define LINKLOCALHANDLER_H__ + +#ifdef HAVE_MDNS + +#include "linklocal.h" +#include "macros.h" +#include "gloox.h" + +#include + +namespace gloox +{ + + namespace LinkLocal + { + +// class Client; + + /** + * @brief A base class that gets informed about advertised or removed XMPP services on the local network. + * + * See @ref gloox::LinkLocal::Manager for more information on how to implement + * link-local messaging. + * + * @author Jakob Schröter + * @since 1.0.x + */ + class GLOOX_API Handler + { + public: + /** + * Reimplement this function to be notified about services available on (or removed from) + * the local network. + * @param services A list of services. + * @note Make a copy of the service list as the list will not be valid after the function + * returned. + */ + virtual void handleBrowseReply( const ServiceList& services ) = 0; + +// /** +// * +// */ +// virtual void handleClient( Client* client ) = 0; + + }; + + } + +} + +#endif // HAVE_MDNS + +#endif // LINKLOCALHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/linklocalmanager.cpp b/smack/smack/src/main/cpp/gloox/src/linklocalmanager.cpp new file mode 100644 index 00000000..353f3322 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/linklocalmanager.cpp @@ -0,0 +1,255 @@ +/* + Copyright (c) 2012-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "linklocalmanager.h" + +#ifdef HAVE_MDNS + +#include "linklocalhandler.h" +#include "connectiontcpclient.h" +#include "jid.h" +#include "util.h" + +#include + +#if ( !defined( _WIN32 ) && !defined( _WIN32_WCE ) ) || defined( __SYMBIAN32__ ) +# include +# include +#endif + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# include +#elif defined( _WIN32_WCE ) +# include +#endif + +#define LINKLOCAL_SERVICE_PORT 5562 + +const std::string LINKLOCAL_SERVICE_TYPE = "_presence._tcp"; + +namespace gloox +{ + + namespace LinkLocal + { + + Manager::Manager( const std::string& user, ConnectionHandler* connHandler, const LogSink &logInstance ) + : m_publishRef( 0 ), m_browseRef( 0 ), m_user( user ), m_interface( 0 ), m_port( 0 ), + m_logInstance( logInstance ), m_browseFd( 0 ), m_server( connHandler, m_logInstance, EmptyString, LINKLOCAL_SERVICE_PORT ), + m_linkLocalHandler( 0 ), m_connectionHandler( connHandler ) + { + + setPort( LINKLOCAL_SERVICE_PORT ); // does more than just setting m_port + addTXTData( "node", GLOOX_CAPS_NODE ); + } + + Manager::~Manager() + { + deregisterService(); + stopBrowsing(); + } + + void Manager::addTXTData( const std::string& key, const std::string& value ) + { + if( value.empty() || key.empty() || key == "txtvers" ) + return; + + m_txtData[key] = value; + } + + void Manager::removeTXTData( const std::string& key ) + { + m_txtData.erase( key ); + } + + void Manager::registerService() + { + if( m_publishRef ) + deregisterService(); + + m_server.connect(); + + std::string txtRecord; + txtRecord += (char)9; // length of mandatory txtvers=1 + txtRecord += "txtvers=1"; // this is here because it SHOULD be the first entry + StringMap::const_iterator it = m_txtData.begin(); + for( ; it != m_txtData.end(); ++it ) + { + txtRecord += (char)( (*it).first.length() + (*it).second.length() + 1 ); + txtRecord += (*it).first; + txtRecord += '='; + txtRecord += (*it).second; + } + + std::string service = m_user + "@"; + if( m_host.empty() ) + { + char host[65]; + gethostname( host, 65 ); + service += host; + } + else + service += m_host; + + /*DNSServiceErrorType e =*/ DNSServiceRegister( &m_publishRef, + 0, // flags + m_interface, // interface, 0 = any, -1 = local only + service.c_str(), // service name, 0 = local computer name + LINKLOCAL_SERVICE_TYPE.c_str(), // service type + m_domain.c_str(), // domain, 0 = default domain(s) + m_host.c_str(), // host, 0 = default host name(s) + htons( m_port ), // port + (short unsigned int)txtRecord.length(), // TXT record length + (const void*)txtRecord.c_str(), // TXT record + 0, // callback + 0 ); // context + } + + void Manager::deregisterService() + { + if( m_publishRef ) + { + DNSServiceRefDeallocate( m_publishRef ); + m_publishRef = 0; + } + } + + bool Manager::startBrowsing() + { + if( !m_linkLocalHandler ) + return false; + + if( m_browseRef ) + stopBrowsing(); + + DNSServiceErrorType e = DNSServiceBrowse( &m_browseRef, + 0, // flags, currently ignored + m_interface, // interface, 0 = any, -1 = local only + LINKLOCAL_SERVICE_TYPE.c_str(), // service type + m_domain.c_str(), // domain, 0 = default domain(s) + &handleBrowseReply, // callback + this ); // context + if ( e != kDNSServiceErr_NoError ) + return false; + + return true; + } + + void Manager::stopBrowsing() + { + if( m_browseRef ) + { + DNSServiceRefDeallocate( m_browseRef ); + m_browseRef = 0; + } + } + + void Manager::recv( int timeout ) + { + if( !m_browseRef ) + return; + + struct timeval tv; + + fd_set fds; + FD_ZERO( &fds ); + // the following causes a C4127 warning in VC++ Express 2008 and possibly other versions. + // however, the reason for the warning can't be fixed in gloox. + FD_SET( DNSServiceRefSockFD( m_browseRef ), &fds ); + + tv.tv_sec = timeout / 1000000; + tv.tv_usec = timeout % 1000000; + + if( select( FD_SETSIZE, &fds, 0, 0, timeout == -1 ? 0 : &tv ) > 0 ) + { + if( FD_ISSET( DNSServiceRefSockFD( m_browseRef ), &fds ) != 0 ) + DNSServiceProcessResult( m_browseRef ); + } + + m_server.recv( timeout ); + } + + + void Manager::handleBrowseReply( DNSServiceRef /*sdRef*/, DNSServiceFlags flags, uint32_t interfaceIndex, + DNSServiceErrorType errorCode, const char* serviceName, const char* regtype, + const char* replyDomain, void* context ) + { + if( !context || errorCode != kDNSServiceErr_NoError ) + return; + + Flag f = ( flags & kDNSServiceFlagsAdd ) == kDNSServiceFlagsAdd + ? AddService + : RemoveService; + + Manager* m = static_cast( context ); + m->handleBrowse( f, serviceName, regtype, replyDomain, interfaceIndex, ( flags & kDNSServiceFlagsMoreComing ) == kDNSServiceFlagsMoreComing ); + + } + + void Manager::handleBrowse( Flag flag, const std::string& service, const std::string& regtype, const std::string& domain, int iface, bool moreComing ) + { + Service s( flag, service, regtype, domain, interface ); + m_tmpServices.push_back( s ); + +// switch( flag ) +// { +// case AddService: +// { +// m_services.push_back( s ); +// break; +// } +// case RemoveService: +// { +// ServiceList::iterator it = m_services.begin(); +// for( ; it != m_services.end(); ++it ) +// { +// if( (*it)->service == service && (*it)->regtype == regtype && (*it)->domain == domain ) +// { +// m_services.erase( it ); +// } +// } +// break; +// } +// } + + if( !moreComing ) + { + m_linkLocalHandler->handleBrowseReply( m_tmpServices ); + m_tmpServices.clear(); + } + } + + +// const StringMap Manager::decodeTXT( const std::string& txt ) +// { +// StringMap result; +// if( txt.empty() ) +// return result; +// +// std::string::const_iterator it = txt.begin(); +// while( it < txt.end() ) +// { +// int len = (int)(*it); +// std::string tmp( ++it, it + len + 1 ); +// it += len; +// size_t pos = tmp.find( '=' ); +// result.insert( std::make_pair( tmp.substr( 0, pos ), tmp.substr( pos + 1 ) ) ); +// } +// +// return result; +// } + + } + +} + +#endif // HAVE_MDNS diff --git a/smack/smack/src/main/cpp/gloox/src/linklocalmanager.h b/smack/smack/src/main/cpp/gloox/src/linklocalmanager.h new file mode 100644 index 00000000..44af24e3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/linklocalmanager.h @@ -0,0 +1,356 @@ +/* + Copyright (c) 2012-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef LINKLOCALMANAGER_H___ +#define LINKLOCALMANAGER_H___ + +#include "config.h" + +#ifdef HAVE_MDNS + +#include "linklocal.h" +#include "macros.h" +#include "gloox.h" +#include "util.h" +#include "logsink.h" +#include "connectiontcpserver.h" +#include "mutex.h" +#include "jid.h" + +#include + +#include + +namespace gloox +{ + + class ConnectionHandler; + class ConnectionTCPClient; + + namespace LinkLocal + { + + class Handler; + + /** + * @brief This is a manager for server-less messaging (@xep{0174}). + * + * Enable compilation of this code with the @c \-\-enable-mdns switch to @c configure, or add + * @c \#define @c HAVE_MDNS to your platform's @c config.h. @c dns_sd.h, @c libdns_sd.so, as well + * as the @c mdnsd daemon from Apple's bonjour distribution are required. The @c mdnsd daemon has + * to be running on the local host. + * + * ### Browsing the local network for XMPP services + * + * You can use the Manager to browse the local network for XMPP services. + * First, create a new instance, register a LinkLocal::Handler, and call startBrowsing(). + * @code + * m_mdns = new LinkLocal::Manager( ... ); + * m_mdns->registerLinkLocalHandler( yourHandler ); + * m_mdns->startBrowsing(); + * @endcode + * + * Then you will need to call @c recv() periodcally. The handler will then receive lists of available + * or removed services. Check the @c flag member of the Service struct. + * + * @code + * void MyClass::handleBrowseReply( const Service& service ) + * { + * LinkLocal::ServiceList::const_iterator it = services.begin(); + * for( ; it != services.end(); ++it ) + * { + * if( (*it).flag == LinkLocal::AddService ) + * { + * // new service + * } + * else + * { + * // service removed + * } + * } + * } + * @endcode + * + * @note Note that your own service may show up in the list, too. + * + * ### Connecting to an XMPP service + * + * Using the info from the Service struct you can initiate a connection to the remote entity. + * First, create a new instance of LinkLocal::Client and register some basic handlers like you + * would with a normal gloox::Client: + * + * @code + * LinkLocal::Client c( JID( "romeo@montague.net" ) ); + * c.logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); // optional + * c.registerConnectionListener( yourConnectionListener ); + * @endcode + * + * Then call @link gloox::LinkLocal::Client::connect( const std::string&, const std::string&, const std::string&, int ) connect() @endlink + * and pass the paramters from the Service struct that you received in handleBrowseReply(). + * + * @code + * c.connect( "juliet@laptop", "_presence._tcp", ".local", 4 ); // don't use literal values + * @endcode + * + * Put your LinkLocal::Client instance in your event loop (or in a separate thread) and call + * @link gloox::LinkLocal::Client::recv() recv() @endlink periodically. + * + * ### Advertising an XMPP service on the local network + * + * To advertise your own XMPP service you can (re-)use the same Manager instance from 'browsing the local network' + * above. + * + * You can publish some basic info about your service in a DNS TXT record. The Manager offers the addTXTData() function + * for that. See http://xmpp.org/registrar/linklocal.html for a list of official parameters. + * + * @code + * m_mdns->addTXTData("nick","July"); + * m_mdns->addTXTData("1st","Juliet"); + * m_mdns->addTXTData("last","Capulet"); + * m_mdns->addTXTData("msg","Hanging out"); + * m_mdns->addTXTData("jid","julia@capulet.com"); + * m_mdns->addTXTData("status","avail"); + * @endcode + * + * Then, to start publishing the availability of your service as well as the TXT record with the additional info + * you just call @c registerService(). + * + * @code + * m_mdns->registerService(); + * @endcode + * + * Other entities on the network will now be informed about the availability of your service. + * + * ### Listening for incoming connections + * + * The second argument to Manager's constructor is a ConnectionHandler-derived class that + * will receive incoming connections. + * + * When registerService() gets called, the Manager will also start a local server that will + * accept incoming connections. By default, it will listen on port 5562. + * + * In @link gloox::ConnectionHandler::handleIncomingConnection() handleIncomingConnection() @endlink + * you should create a new LinkLocal::Client and register some basic handlers: + * + * @code + * LinkLocal::Client c( JID( "romeo@desktop" ) ); + * c.logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + * c.registerMessageHandler( this ); + * c.registerConnectionListener( this ); + * @endcode + * + * Finally you have to attach the incoming connection to the Client instance, and call connect(). + * + * @code + * connection->registerConnectionDataHandler( &c ); + * c.setConnectionImpl( connection ); + * c.connect(); + * @endcode + * + * Add the Client to your event loop to call recv() periodically. + * + * @see @c linklocal_example.cpp in @c src/examples/ for a (very) simple implementation of a bot + * handling both incoming and outgoing connections. + * + * @author Jakob Schröter + * @since 1.0.x + */ + class GLOOX_API Manager + { + + public: + + /** + * Creates a new Link-local Manager instance. You can call @c registerService() and/or @c startBrowsing() + * immediately on a new Manager object, it will use sane defaults. + * @param user The username to advertise, preferably (as per @xep{0174}) the locally + * logged-in user. This is just the local part of the local JID. + * @param connHandler A pointer to a ConnectionHandler that will receive incoming connections. + * @param logInstance The log target. Obtain it from ClientBase::logInstance(). + */ + Manager( const std::string& user, ConnectionHandler* connHandler, const LogSink &logInstance ); + + /** + * Virtual destructor. + * @note @c deregisterService() and @c stopBrowsing() will be called automatically if necessary. + */ + virtual ~Manager(); + + /** + * Lets you add additional data to the published TXT record. + * @note The @c txtvers=1 parameter is included by default and cannot be changed. + * @param key The key of a key=value parameter pair. Must be non-empty. If the given key + * has been set before, its value will be overwritten by the new value. + * @param value The value of a @c key=value parameter pair. Must be non-empty. + * @note If either parameter is empty, this function is a NOOP. + * @note The additional data will not be automatically published if you have already called + * @c registerService(). You will have to call @c registerService() again to update the + * TXT record. + */ + void addTXTData( const std::string& key, const std::string& value ); + + /** + * Lets you remove TXT record data by key. + * @note The @c txtvers=1 parameter is included by default and cannot be removed. + * @param key The key of the @c key=value parameter pair that should be removed. Must be non-empty. + * @note A published TXT record will not be automatically updated if you have already called + * @c registerService(). You will have to call @c registerService() again to update the TXT record. + */ + void removeTXTData( const std::string& key ); + + /** + * Starts advertising link-local messaging capabilities by publishing a number of DNS records, + * as per @xep{0174}. + * You can call this function again to publish any values you updated after the first call. + */ + void registerService(); + + /** + * Removes the published DNS records and thereby stops advertising link-local messaging + * capabilities. + */ + void deregisterService(); + + /** + * Lets you specify a new username. + * @param user The new username. + * @note The new username will not be automatically advertised if you have already called + * @c registerService(). You will have to call @c registerService() again to update the username. + */ + void setUser( const std::string& user ) { m_user = user; } + + /** + * Lets you specify an alternate host name to advertise. By default the local machine's hostname + * as returned by @c gethostname() will be used. + * @param host The hostname to use. + * @note The new hostname will not be automatically advertised if you have already called + * @c registerService(). You will have to call @c registerService() again to update the hostname. + */ + void setHost( const std::string& host ) { m_host = host; } + + /** + * This function lets you set an alternate browse domain. The default domain should work in most cases. + * @param domain The browse domain to set. + * @note The new domain will not be automatically used if you have already called + * @c registerService(). You will have to call @c registerService() again to update the domain. + * The same applies to @c startBrowsing(). + */ + void setDomain( const std::string& domain ) { m_domain = domain; } + + /** + * Lets you specifiy a port to listen on for incoming server-less XMPP connections. Default + * for this implementation is port 5562, but any unused port can be used. + * @note In addition to the SRV record, the port will also be published in the TXT record + * automaticlly, you do not have to add it manually. That is, you should not call + * @c addTXTData() with a key of @c "port.p2pj". + * @param port The port to use. + * @note The new port will not be automatically advertised if you have already called + * @c registerService(). You will have to call @c registerService() again to update the port. + */ + void setPort( const int port ) { m_port = port; addTXTData( "port.p2pj", util::int2string( m_port ) ); } + + /** + * This function can be used to set a non-default interface. Use @c if_nametoindex() to + * find the index for a specific named device. + * By default DNS records will be broadcast on all available interfaces, and all available + * interfaces will be used or browsing services. + * @param iface The interface to use. If you set an interface here, and want to change it + * back to 'any', use @b 0. Use @b -1 to broadcast only on the local machine. + * @note The new interface will not be automatically used if you have already called + * @c registerService(). You will have to call @c registerService() again to use the new + * interface. The same applies to @c startBrowsing(). + */ + void setInterface( unsigned iface ) { m_interface = iface; } + + /** + * Starts looking for other entities of type @c _presence. You have to set a handler for + * results using @c registerLinkLocalHandler() before calling this function. + * You can call this function again to re-start browsing with updated parameters. + * @return Returns @b true if browsing could be started successfully, @b false otherwise. + */ + bool startBrowsing(); + + /** + * Stops the browsing. + */ + void stopBrowsing(); + + /** + * Exposes the socket used for browsing so you can have it checked in your own event loop, + * if desired. If your event loop signals new data on the socket, you should NOT + * try to read from it directly. Instead you should call @c recv(). + * As an alternative to using the raw socket you could also put the Manager in a + * separate thread and call @c recv() repeatedly, or achieve this in any other way. + */ + int socket() const { return m_browseFd; } + + /** + * Checks once for new data on the socket used for browsing. + * @param timeout The timeout for @c select() in microseconds. Use @b -1 if blocking behavior + * is acceptable. + */ + void recv( int timeout ); + + /** + * Registers a handler that will be notfied about entities found on the network that match + * the given browse criteria. + * @param handler The handler to register. + */ + void registerLinkLocalHandler( Handler* handler ) { m_linkLocalHandler = handler; } + +// /** +// * +// */ +// static const StringMap decodeTXT( const std::string& txt ); + + private: + static void handleBrowseReply( DNSServiceRef sdRef, DNSServiceFlags flags, unsigned interfaceIndex, + DNSServiceErrorType errorCode, const char* serviceName, const char* regtype, + const char* replyDomain, void* context ); + + void handleBrowse( Flag flag, const std::string& service, const std::string& regtype, const std::string& domain, int iface, bool moreComing ); + + typedef std::list ConnectionList; + typedef std::map ConnectionMap; + + DNSServiceRef m_publishRef; + DNSServiceRef m_browseRef; + + ServiceList m_tmpServices; +// ServiceList m_services; + + std::string m_user; + std::string m_host; + std::string m_domain; + unsigned m_interface; + int m_port; + + const LogSink& m_logInstance; + + int m_browseFd; + + StringMap m_txtData; + + ConnectionTCPServer m_server; + + Handler* m_linkLocalHandler; + ConnectionHandler* m_connectionHandler; + + }; + + } + +} + +#endif // HAVE_MDNS + +#endif // LINKLOCALMANAGER_H___ diff --git a/smack/smack/src/main/cpp/gloox/src/loghandler.h b/smack/smack/src/main/cpp/gloox/src/loghandler.h new file mode 100644 index 00000000..732957f1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/loghandler.h @@ -0,0 +1,53 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef LOGHANDLER_H__ +#define LOGHANDLER_H__ + +#include "gloox.h" + +#include + +namespace gloox +{ + + /** + * @brief A virtual interface which can be reimplemented to receive debug and log messages. + * + * @ref handleLog() is called for log messages. + * + * @author Jakob Schröter + * @since 0.5 + */ + class GLOOX_API LogHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~LogHandler() {} + + /** + * Reimplement this function if you want to receive the chunks of the conversation + * between gloox and server or other debug info from gloox. + * @param level The log message's severity. + * @param area The log message's origin. + * @param message The log message. + */ + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) = 0; + }; + +} + +#endif // LOGHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/logsink.cpp b/smack/smack/src/main/cpp/gloox/src/logsink.cpp new file mode 100644 index 00000000..15773045 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/logsink.cpp @@ -0,0 +1,49 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "logsink.h" + +namespace gloox +{ + + LogSink::LogSink() + { + } + + LogSink::~LogSink() + { + } + + void LogSink::log( LogLevel level, LogArea area, const std::string& message ) const + { + LogHandlerMap::const_iterator it = m_logHandlers.begin(); + for( ; it != m_logHandlers.end(); ++it ) + { + if( (*it).first && ( (*it).second.level <= level ) && ( (*it).second.areas & area ) ) + (*it).first->handleLog( level, area, message ); + } + } + + void LogSink::registerLogHandler( LogLevel level, int areas, LogHandler* lh ) + { + LogInfo info = { level, areas }; + m_logHandlers[lh] = info; + } + + void LogSink::removeLogHandler( LogHandler* lh ) + { + m_logHandlers.erase( lh ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/logsink.h b/smack/smack/src/main/cpp/gloox/src/logsink.h new file mode 100644 index 00000000..872a26ca --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/logsink.h @@ -0,0 +1,118 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef LOGSINK_H__ +#define LOGSINK_H__ + +#include "gloox.h" +#include "loghandler.h" + +#include +// #include + +namespace gloox +{ + + /** + * @brief An implementation of log sink and source. + * + * To log the output of your Client or Component, use ClientBase's + * @link ClientBase::logInstance() logInstance() @endlink to get hold of the LogSink + * object for that ClientBase. Register your LogHandler with that instance. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API LogSink + { + public: + /** + * Constructor. + */ + LogSink(); + + /** + * Virtual destructor. + */ + virtual ~LogSink(); + + /** + * Use this function to log a message with given LogLevel and LogIdentifier. + * dbg(), warn(), and err() are alternative shortcuts. + * @param level The severity of the logged event. + * @param area The part of the program/library the message comes from. + * @param message The actual log message. + */ + void log( LogLevel level, LogArea area, const std::string& message ) const; + + /** + * Use this function to log a debug message with given LogIdentifier. + * This is a convenience wrapper around log(). + * @param area The part of the program/library the message comes from. + * @param message The actual log message. + */ + void dbg( LogArea area, const std::string& message ) const + { log( LogLevelDebug, area, message ); } + + /** + * Use this function to log a warning message with given LogIdentifier. + * This is a convenience wrapper around log(). + * @param area The part of the program/library the message comes from. + * @param message The actual log message. + */ + void warn( LogArea area, const std::string& message ) const + { log( LogLevelWarning, area, message ); } + + /** + * Use this function to log a error message with given LogIdentifier. + * This is a convenience wrapper around log(). + * @param area The part of the program/library the message comes from. + * @param message The actual log message. + */ + void err( LogArea area, const std::string& message ) const + { log( LogLevelError, area, message ); } + + /** + * Registers @c lh as object that receives all debug messages of the specified type. + * Suitable for logging to a file, etc. + * @param level The LogLevel for this handler. + * @param areas Bit-wise ORed LogAreas the LogHandler wants to be informed about. + * @param lh The object to receive exchanged data. + */ + void registerLogHandler( LogLevel level, int areas, LogHandler* lh ); + + /** + * Removes the given object from the list of log handlers. + * @param lh The object to remove from the list. + */ + void removeLogHandler( LogHandler* lh ); + + private: + struct LogInfo + { + LogLevel level; + int areas; + }; + + LogSink( const LogSink& /*copy*/ ); + + typedef std::map LogHandlerMap; + LogHandlerMap m_logHandlers; + + }; + +} + +#endif // LOGSINK_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/macros.h b/smack/smack/src/main/cpp/gloox/src/macros.h new file mode 100644 index 00000000..752fe3b4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/macros.h @@ -0,0 +1,49 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef GLOOX_MACROS_H__ +#define GLOOX_MACROS_H__ + +#if defined( _MSC_VER ) || defined( _WIN32_WCE ) +# pragma warning( disable:4251 ) +# pragma warning( disable:4786 ) +#endif + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# if defined( GLOOX_EXPORTS ) || defined( DLL_EXPORT ) +# define GLOOX_API __declspec( dllexport ) +# else +# if defined( GLOOX_IMPORTS ) || defined( DLL_IMPORT ) +# define GLOOX_API __declspec( dllimport ) +# endif +# endif +#endif + +#ifndef GLOOX_API +# define GLOOX_API +#endif + + +#if defined( __GNUC__ ) && ( __GNUC__ - 0 > 3 || ( __GNUC__ - 0 == 3 && __GNUC_MINOR__ - 0 >= 2 ) ) +# define GLOOX_DEPRECATED __attribute__ ( (__deprecated__) ) +# define GLOOX_DEPRECATED_CTOR explicit GLOOX_DEPRECATED +#elif defined( _MSC_VER ) && ( _MSC_VER >= 1300 ) +# define GLOOX_DEPRECATED __declspec( deprecated ) +# define GLOOX_DEPRECATED_CTOR explicit GLOOX_DEPRECATED +#else +# define GLOOX_DEPRECATED +# define GLOOX_DEPRECATED_CTOR +#endif + + +#endif // GLOOX_MACROS_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/md5.cpp b/smack/smack/src/main/cpp/gloox/src/md5.cpp new file mode 100644 index 00000000..af540a09 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/md5.cpp @@ -0,0 +1,466 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +/* + This class is based on a C implementation of the MD5 algorithm written by + L. Peter Deutsch. + The full notice as shipped with the original verson is included below. +*/ + +/* + Copyright (C) 1999, 2000, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ +/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321, whose + text is available at + http://www.ietf.org/rfc/rfc1321.txt + The code is derived from the text of the RFC, including the test suite + (section A.5) but excluding the rest of Appendix A. It does not include + any code or documentation that is identified in the RFC as being + copyrighted. + + The original and principal author of md5.c is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order + either statically or dynamically; added missing #include + in library. + 2002-03-11 lpd Corrected argument list for main(), and added int return + type, in test program and T value program. + 2002-02-21 lpd Added missing #include in test program. + 2000-07-03 lpd Patched to eliminate warnings about "constant is + unsigned in ANSI C, signed in traditional"; made test program + self-checking. + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5). + 1999-05-03 lpd Original version. + */ + +#include "config.h" + +#include "md5.h" + +#include +#include + +#include // [s]print[f] + +namespace gloox +{ +// #undef BYTE_ORDER /* 1 = big-endian, -1 = little-endian, 0 = unknown */ +// #ifdef ARCH_IS_BIG_ENDIAN +// # define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) +// #else +// # define BYTE_ORDER 0 +// #endif + +#undef BYTE_ORDER +#define BYTE_ORDER 0 + +#define T_MASK ((unsigned int)~0) +#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) +#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) +#define T3 0x242070db +#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) +#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) +#define T6 0x4787c62a +#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) +#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) +#define T9 0x698098d8 +#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) +#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) +#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) +#define T13 0x6b901122 +#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) +#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) +#define T16 0x49b40821 +#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) +#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) +#define T19 0x265e5a51 +#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) +#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) +#define T22 0x02441453 +#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) +#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) +#define T25 0x21e1cde6 +#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) +#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) +#define T28 0x455a14ed +#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) +#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) +#define T31 0x676f02d9 +#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) +#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) +#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) +#define T35 0x6d9d6122 +#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) +#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) +#define T38 0x4bdecfa9 +#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) +#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) +#define T41 0x289b7ec6 +#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) +#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) +#define T44 0x04881d05 +#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) +#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) +#define T47 0x1fa27cf8 +#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) +#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) +#define T50 0x432aff97 +#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) +#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) +#define T53 0x655b59c3 +#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) +#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) +#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) +#define T57 0x6fa87e4f +#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) +#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) +#define T60 0x4e0811a1 +#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) +#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) +#define T63 0x2ad7d2bb +#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) + + + const unsigned char MD5::pad[64] = + { + 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + + MD5::MD5() + : m_finished( false ) + { + init(); + } + + MD5::~MD5() + { + } + + void MD5::process( const unsigned char* data /*[64]*/ ) + { + unsigned int a = m_state.abcd[0]; + unsigned int b = m_state.abcd[1]; + unsigned int c = m_state.abcd[2]; + unsigned int d = m_state.abcd[3]; + unsigned int t; +#if BYTE_ORDER > 0 + /* Define storage only for big-endian CPUs. */ + unsigned int X[16]; +#else + /* Define storage for little-endian or both types of CPUs. */ + unsigned int xbuf[16]; + const unsigned int *X; +#endif + + { +#if BYTE_ORDER == 0 + /* + * Determine dynamically whether this is a big-endian or + * little-endian machine, since we can use a more efficient + * algorithm on the latter. + */ + static const int w = 1; + + if( *((const unsigned char *)&w) ) /* dynamic little-endian */ +#endif +#if BYTE_ORDER <= 0 /* little-endian */ + { + /* + * On little-endian machines, we can process properly aligned + * data without copying it. + */ + if( !((data - (const unsigned char*)0) & 3) ) + { + /* data are properly aligned */ + X = (const unsigned int*)data; + } + else + { + /* not aligned */ + memcpy( xbuf, data, 64 ); + X = xbuf; + } + } +#endif +#if BYTE_ORDER == 0 + else // dynamic big-endian +#endif +#if BYTE_ORDER >= 0 // big-endian + { + /* + * On big-endian machines, we must arrange the bytes in the + * right order. + */ + const unsigned char* xp = data; + int i; + +# if BYTE_ORDER == 0 + X = xbuf; // (dynamic only) +# else +# define xbuf X /* (static only) */ +# endif + for( i = 0; i < 16; ++i, xp += 4 ) + xbuf[i] = xp[0] + ( xp[1] << 8 ) + ( xp[2] << 16 ) + ( xp[3] << 24 ); + } +#endif + } + +#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) + + /* Round 1. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ +#define F(x, y, z) (((x) & (y)) | (~(x) & (z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + F(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 7, T1); + SET(d, a, b, c, 1, 12, T2); + SET(c, d, a, b, 2, 17, T3); + SET(b, c, d, a, 3, 22, T4); + SET(a, b, c, d, 4, 7, T5); + SET(d, a, b, c, 5, 12, T6); + SET(c, d, a, b, 6, 17, T7); + SET(b, c, d, a, 7, 22, T8); + SET(a, b, c, d, 8, 7, T9); + SET(d, a, b, c, 9, 12, T10); + SET(c, d, a, b, 10, 17, T11); + SET(b, c, d, a, 11, 22, T12); + SET(a, b, c, d, 12, 7, T13); + SET(d, a, b, c, 13, 12, T14); + SET(c, d, a, b, 14, 17, T15); + SET(b, c, d, a, 15, 22, T16); +#undef SET + + /* Round 2. */ + /* Let [abcd k s i] denote the operation + a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ +#define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + G(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 1, 5, T17); + SET(d, a, b, c, 6, 9, T18); + SET(c, d, a, b, 11, 14, T19); + SET(b, c, d, a, 0, 20, T20); + SET(a, b, c, d, 5, 5, T21); + SET(d, a, b, c, 10, 9, T22); + SET(c, d, a, b, 15, 14, T23); + SET(b, c, d, a, 4, 20, T24); + SET(a, b, c, d, 9, 5, T25); + SET(d, a, b, c, 14, 9, T26); + SET(c, d, a, b, 3, 14, T27); + SET(b, c, d, a, 8, 20, T28); + SET(a, b, c, d, 13, 5, T29); + SET(d, a, b, c, 2, 9, T30); + SET(c, d, a, b, 7, 14, T31); + SET(b, c, d, a, 12, 20, T32); +#undef SET + + /* Round 3. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + H(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 5, 4, T33); + SET(d, a, b, c, 8, 11, T34); + SET(c, d, a, b, 11, 16, T35); + SET(b, c, d, a, 14, 23, T36); + SET(a, b, c, d, 1, 4, T37); + SET(d, a, b, c, 4, 11, T38); + SET(c, d, a, b, 7, 16, T39); + SET(b, c, d, a, 10, 23, T40); + SET(a, b, c, d, 13, 4, T41); + SET(d, a, b, c, 0, 11, T42); + SET(c, d, a, b, 3, 16, T43); + SET(b, c, d, a, 6, 23, T44); + SET(a, b, c, d, 9, 4, T45); + SET(d, a, b, c, 12, 11, T46); + SET(c, d, a, b, 15, 16, T47); + SET(b, c, d, a, 2, 23, T48); +#undef SET + + /* Round 4. */ + /* Let [abcd k s t] denote the operation + a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ +#define I(x, y, z) ((y) ^ ((x) | ~(z))) +#define SET(a, b, c, d, k, s, Ti)\ + t = a + I(b,c,d) + X[k] + Ti;\ + a = ROTATE_LEFT(t, s) + b + /* Do the following 16 operations. */ + SET(a, b, c, d, 0, 6, T49); + SET(d, a, b, c, 7, 10, T50); + SET(c, d, a, b, 14, 15, T51); + SET(b, c, d, a, 5, 21, T52); + SET(a, b, c, d, 12, 6, T53); + SET(d, a, b, c, 3, 10, T54); + SET(c, d, a, b, 10, 15, T55); + SET(b, c, d, a, 1, 21, T56); + SET(a, b, c, d, 8, 6, T57); + SET(d, a, b, c, 15, 10, T58); + SET(c, d, a, b, 6, 15, T59); + SET(b, c, d, a, 13, 21, T60); + SET(a, b, c, d, 4, 6, T61); + SET(d, a, b, c, 11, 10, T62); + SET(c, d, a, b, 2, 15, T63); + SET(b, c, d, a, 9, 21, T64); +#undef SET + + /* Then perform the following additions. (That is increment each + of the four registers by the value it had before this block + was started.) */ + m_state.abcd[0] += a; + m_state.abcd[1] += b; + m_state.abcd[2] += c; + m_state.abcd[3] += d; + } + + void MD5::init() + { + m_finished = false; + m_state.count[0] = 0; + m_state.count[1] = 0; + m_state.abcd[0] = 0x67452301; + m_state.abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; + m_state.abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; + m_state.abcd[3] = 0x10325476; + } + + void MD5::feed( const std::string& data ) + { + feed( (const unsigned char*)data.c_str(), (int)data.length() ); + } + + void MD5::feed( const unsigned char* data, int bytes ) + { + const unsigned char* p = data; + int left = bytes; + int offset = ( m_state.count[0] >> 3 ) & 63; + unsigned int nbits = (unsigned int)( bytes << 3 ); + + if( bytes <= 0 ) + return; + + /* Update the message length. */ + m_state.count[1] += bytes >> 29; + m_state.count[0] += nbits; + if( m_state.count[0] < nbits ) + m_state.count[1]++; + + /* Process an initial partial block. */ + if( offset ) + { + int copy = ( offset + bytes > 64 ? 64 - offset : bytes ); + + memcpy( m_state.buf + offset, p, copy ); + if( offset + copy < 64 ) + return; + p += copy; + left -= copy; + process( m_state.buf ); + } + + /* Process full blocks. */ + for( ; left >= 64; p += 64, left -= 64 ) + process( p ); + + /* Process a final partial block. */ + if( left ) + memcpy( m_state.buf, p, left ); + } + + void MD5::finalize() + { + if( m_finished ) + return; + + unsigned char data[8]; + + /* Save the length before padding. */ + for( int i = 0; i < 8; ++i ) + data[i] = (unsigned char)( m_state.count[i >> 2] >> ( ( i & 3 ) << 3 ) ); + + /* Pad to 56 bytes mod 64. */ + feed( pad, ( ( 55 - ( m_state.count[0] >> 3 ) ) & 63 ) + 1 ); + + /* Append the length. */ + feed( data, 8 ); + + m_finished = true; + } + + const std::string MD5::hex() + { + if( !m_finished ) + finalize(); + + char buf[33]; + + for( int i = 0; i < 16; ++i ) + sprintf( buf + i * 2, "%02x", (unsigned char)( m_state.abcd[i >> 2] >> ( ( i & 3 ) << 3 ) ) ); + + return std::string( buf, 32 ); + } + + const std::string MD5::binary() + { + if( !m_finished ) + finalize(); + + unsigned char digest[16]; + for( int i = 0; i < 16; ++i ) + digest[i] = (unsigned char)( m_state.abcd[i >> 2] >> ( ( i & 3 ) << 3 ) ); + + return std::string( (char*)digest, 16 ); + } + + void MD5::reset() + { + init(); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/md5.h b/smack/smack/src/main/cpp/gloox/src/md5.h new file mode 100644 index 00000000..dd5ef50c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/md5.h @@ -0,0 +1,137 @@ +/* + Copyright (C) 1999, 2002 Aladdin Enterprises. All rights reserved. + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + L. Peter Deutsch + ghost@aladdin.com + + */ +/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */ +/* + Independent implementation of MD5 (RFC 1321). + + This code implements the MD5 Algorithm defined in RFC 1321, whose + text is available at + http://www.ietf.org/rfc/rfc1321.txt + The code is derived from the text of the RFC, including the test suite + (section A.5) but excluding the rest of Appendix A. It does not include + any code or documentation that is identified in the RFC as being + copyrighted. + + The original and principal author of md5.h is L. Peter Deutsch + . Other authors are noted in the change history + that follows (in reverse chronological order): + + 2002-04-13 lpd Removed support for non-ANSI compilers; removed + references to Ghostscript; clarified derivation from RFC 1321; + now handles byte order either statically or dynamically. + 1999-11-04 lpd Edited comments slightly for automatic TOC extraction. + 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5); + added conditionalization for C++ compilation from Martin + Purschke . + 1999-05-03 lpd Original version. + */ + +#ifndef MD5_H__ +#define MD5_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + /** + * @brief An MD% implementation. + * + * This is an implementation of the Message Digest Algorithm as decribed in RFC 1321. + * The original code has been taken from an implementation by L. Peter Deutsch. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API MD5 + { + public: + /** + * Constructs a new MD5 object. + */ + MD5(); + + /** + * Virtual Destructor. + */ + virtual ~MD5(); + + /** + * Use this function to feed the hash. + * @param data The data to hash. + * @param bytes The size of @c data in bytes. + */ + void feed( const unsigned char* data, int bytes ); + + /** + * Use this function to feed the hash. + * @param data The data to hash. + */ + void feed( const std::string& data ); + + /** + * This function is used to finalize the hash operation. Use it after the last feed() and + * before calling hex(). + */ + void finalize(); + + /** + * Use this function to retrieve the hash value in hex. + * @return The hash in hex notation. + */ + const std::string hex(); + + /** + * Use this function to retrieve the raw binary hash. + * @return The raw binary hash. + */ + const std::string binary(); + + /** + * Use this function to reset the hash. + */ + void reset(); + + private: + struct MD5State + { + unsigned int count[2]; /* message length in bits, lsw first */ + unsigned int abcd[4]; /* digest buffer */ + unsigned char buf[64]; /* accumulate block */ + } m_state; + + void init(); + void process( const unsigned char* data ); + + static const unsigned char pad[64]; + + bool m_finished; + + }; + +} + +#endif // MD5_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/message.cpp b/smack/smack/src/main/cpp/gloox/src/message.cpp new file mode 100644 index 00000000..813c7754 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/message.cpp @@ -0,0 +1,96 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "util.h" +#include "message.h" + +namespace gloox +{ + + static const char* msgTypeStringValues[] = + { + "chat", "error", "groupchat", "headline", "normal" + }; + + static inline const std::string typeString( Message::MessageType type ) + { + return util::lookup2( type, msgTypeStringValues ); + } + + Message::Message( Tag* tag ) + : Stanza( tag ), m_subtype( Invalid ), m_bodies( 0 ), m_subjects( 0 ) + { + if( !tag || tag->name() != "message" ) + return; + + const std::string& typestring = tag->findAttribute( TYPE ); + if( typestring.empty() ) + m_subtype = Normal; + else + m_subtype = (MessageType)util::lookup2( typestring, msgTypeStringValues ); + + const TagList& c = tag->children(); + TagList::const_iterator it = c.begin(); + for( ; it != c.end(); ++it ) + { + if( (*it)->name() == "body" ) + setLang( &m_bodies, m_body, (*it) ); + else if( (*it)->name() == "subject" ) + setLang( &m_subjects, m_subject, (*it) ); + else if( (*it)->name() == "thread" ) + m_thread = (*it)->cdata(); + } + } + + Message::Message( MessageType type, const JID& to, + const std::string& body, const std::string& subject, + const std::string& thread, const std::string& xmllang ) + : Stanza( to ), m_subtype( type ), m_bodies( 0 ), m_subjects( 0 ), m_thread( thread ) + { + setLang( &m_bodies, m_body, body, xmllang ); + setLang( &m_subjects, m_subject, subject, xmllang ); + } + + Message::~Message() + { + delete m_bodies; + delete m_subjects; + } + + Tag* Message::tag() const + { + if( m_subtype == Invalid ) + return 0; + + Tag* t = new Tag( "message", XMLNS, XMLNS_CLIENT ); + if( m_to ) + t->addAttribute( "to", m_to.full() ); + if( m_from ) + t->addAttribute( "from", m_from.full() ); + if( !m_id.empty() ) + t->addAttribute( "id", m_id ); + t->addAttribute( TYPE, typeString( m_subtype ) ); + + getLangs( m_bodies, m_body, "body", t ); + getLangs( m_subjects, m_subject, "subject", t ); + + if( !m_thread.empty() ) + new Tag( t, "thread", m_thread ); + + StanzaExtensionList::const_iterator it = m_extensionList.begin(); + for( ; it != m_extensionList.end(); ++it ) + t->addChild( (*it)->tag() ); + + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/message.h b/smack/smack/src/main/cpp/gloox/src/message.h new file mode 100644 index 00000000..2c486bf3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/message.h @@ -0,0 +1,159 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef MESSAGE_H__ +#define MESSAGE_H__ + +#include "delayeddelivery.h" +#include "stanza.h" + +#include + +namespace gloox +{ + + class JID; + + /** + * @brief An abstraction of a message stanza. + * + * @author Vincent Thomasset + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Message : public Stanza + { + + friend class ClientBase; + friend class Forward; + + public: + + /** + * Describes the different valid message types. + */ + enum MessageType + { + Chat = 1, /**< A chat message. */ + Error = 2, /**< An error message. */ + Groupchat = 4, /**< A groupchat message. */ + Headline = 8, /**< A headline message. */ + Normal = 16, /**< A normal message. */ + Invalid = 32 /**< The message stanza is invalid. */ + }; + + /** + * Creates a Message. + * @param type The message type. + * @param to The intended receiver. + * @param body The message's body text. + * @param subject The message's optional subject. + * @param thread The message's optional thread ID. + * @param xmllang An optional xml:lang for the message body. + */ + Message( MessageType type, const JID& to, + const std::string& body = EmptyString, const std::string& subject = EmptyString, + const std::string& thread = EmptyString, const std::string& xmllang = EmptyString ); + + /** + * Destructor. + */ + virtual ~Message(); + + /** + * Returns the message's type. + * @return The message's type. + */ + MessageType subtype() const { return m_subtype; } + + /** + * Returns the message body for the given language if available. + * If the requested language is not available, the default body (without a xml:lang + * attribute) will be returned. + * @param lang The language identifier for the desired language. It must conform to + * section 2.12 of the XML specification and RFC 3066. If empty, the default body + * will be returned, if any. + * @return The message body. + */ + const std::string body( const std::string& lang = "default" ) const + { + return findLang( m_bodies, m_body, lang ); + } + + /** + * Returns the message subject for the given language if available. + * If the requested language is not available, the default subject (without a xml:lang + * attribute) will be returned. + * @param lang The language identifier for the desired language. It must conform to + * section 2.12 of the XML specification and RFC 3066. If empty, the default subject + * will be returned, if any. + * @return The message subject. + */ + const std::string subject( const std::string& lang = "default" ) const + { + return findLang( m_subjects, m_subject, lang ); + } + + /** + * Returns the thread ID of a message stanza. + * @return The thread ID of a message stanza. Empty for non-message stanzas. + */ + const std::string& thread() const { return m_thread; } + + /** + * Sets the thread ID. + * @param thread The thread ID. + */ + void setThread( const std::string& thread ) { m_thread = thread; } + + /** + * Sets the message's ID. Optional. + * @param id The ID. + */ + void setID( const std::string& id ) { m_id = id; } + + /** + * Convenience function that returns a pointer to a DelayedDelivery StanzaExtension, if the + * message contains one. + * Make sure you have registered a DelayedDelivery instance with your ClientBase (this is not done automatically), + * otherwise this method will always return 0. + * @return A pointer to a DelayedDelivery object, or 0. + */ + const DelayedDelivery* when() const + { + return static_cast( findExtension( ExtDelay ) ); + } + + // reimplemented from Stanza + virtual Tag* tag() const; + + private: +#ifdef MESSAGE_TEST + public: +#endif + /** + * Creates a message Stanza from the given Tag. The original Tag will be ripped off. + * @param tag The Tag to parse. + */ + Message( Tag* tag ); + + MessageType m_subtype; + std::string m_body; + std::string m_subject; + StringMap* m_bodies; + StringMap* m_subjects; + std::string m_thread; + }; + +} + +#endif // MESSAGE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/messageevent.cpp b/smack/smack/src/main/cpp/gloox/src/messageevent.cpp new file mode 100644 index 00000000..a7787506 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messageevent.cpp @@ -0,0 +1,68 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "messageevent.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + /* chat state type values */ + static const char* eventValues [] = { + "offline", + "delivered", + "displayed", + "composing" + }; + + MessageEvent::MessageEvent( const Tag* tag ) + : StanzaExtension( ExtMessageEvent ), m_event( MessageEventCancel ) + { + if( !tag ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + int event = 0; + for( ; it != l.end(); ++it ) + event |= util::lookup2( (*it)->name(), eventValues ); + if( event ) + m_event = event; + } + + const std::string& MessageEvent::filterString() const + { + static const std::string filter = "/message/x[@xmlns='" + XMLNS_X_EVENT + "']"; + return filter; + } + + Tag* MessageEvent::tag() const + { + Tag* x = new Tag( "x", XMLNS, XMLNS_X_EVENT ); + + if( m_event & MessageEventOffline ) + new Tag( x, "offline" ); + if( m_event & MessageEventDelivered ) + new Tag( x, "delivered" ); + if( m_event & MessageEventDisplayed ) + new Tag( x, "displayed" ); + if( m_event & MessageEventComposing ) + new Tag( x, "composing" ); + + if( !m_id.empty() ) + new Tag( x, "id", m_id ); + + return x; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/messageevent.h b/smack/smack/src/main/cpp/gloox/src/messageevent.h new file mode 100644 index 00000000..0cbb3a35 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messageevent.h @@ -0,0 +1,88 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef MESSAGEEVENT_H__ +#define MESSAGEEVENT_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief An implementation of Message Events (@xep{0022}) as a StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API MessageEvent : public StanzaExtension + { + public: + + /** + * Constructs a new object from the given Tag. + * @param tag A Tag to parse. + */ + MessageEvent( const Tag* tag ); + + /** + * Constructs a new object of the given type, with an optional message ID. + * @param type One or more @link gloox::MessageEventType MessageEventType @endlink. + * @param id An optional message ID. Links this Event to the message it is generated for. + */ + MessageEvent( int type, const std::string& id = EmptyString ) + : StanzaExtension( ExtMessageEvent ), m_id( id ), m_event( type ) + {} + + /** + * Virtual destructor. + */ + virtual ~MessageEvent() {} + + /** + * Returns the object's event or events. + * @return The object's event or events. + */ + int event() const { return m_event; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new MessageEvent( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new MessageEvent( *this ); + } + + private: + std::string m_id; + int m_event; + + }; + +} + +#endif // MESSAGEEVENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/messageeventfilter.cpp b/smack/smack/src/main/cpp/gloox/src/messageeventfilter.cpp new file mode 100644 index 00000000..f9a91118 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messageeventfilter.cpp @@ -0,0 +1,112 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "messageeventfilter.h" +#include "messageeventhandler.h" +#include "messagesession.h" +#include "message.h" +#include "messageevent.h" +#include "error.h" + +namespace gloox +{ + + MessageEventFilter::MessageEventFilter( MessageSession* parent ) + : MessageFilter( parent ), m_messageEventHandler( 0 ), m_requestedEvents( 0 ), + m_lastSent( MessageEventCancel ), m_disable( false ) + { + } + + MessageEventFilter::~MessageEventFilter() + { + } + + void MessageEventFilter::filter( Message& msg ) + { + if( m_disable || !m_messageEventHandler ) + return; + + if( msg.subtype() == Message::Error ) + { + if( msg.error() && msg.error()->error() == StanzaErrorFeatureNotImplemented ) + m_disable = true; + + return; + } + + const MessageEvent* me = msg.findExtension( ExtMessageEvent ); + if( !me ) + { + m_requestedEvents = 0; + m_lastID = EmptyString; + return; + } + + if( msg.body().empty() ) + m_messageEventHandler->handleMessageEvent( msg.from(), (MessageEventType)me->event() ); + else + { + m_lastID = msg.id(); + m_requestedEvents = 0; + m_requestedEvents = me->event(); + } + } + + void MessageEventFilter::raiseMessageEvent( MessageEventType event ) + { + if( m_disable || ( !( m_requestedEvents & event ) && ( event != MessageEventCancel ) ) ) + return; + + switch( event ) + { + case MessageEventOffline: + case MessageEventDelivered: + case MessageEventDisplayed: + m_requestedEvents &= ~event; + break; + case MessageEventComposing: + if( m_lastSent == MessageEventComposing ) + return; + break; + case MessageEventCancel: + default: + break; + } + + m_lastSent = event; + Message m( Message::Normal, m_parent->target() ); + m.addExtension( new MessageEvent( event, m_lastID ) ); + send( m ); + } + + void MessageEventFilter::decorate( Message& msg ) + { + if( m_disable ) + return; + + msg.addExtension( new MessageEvent( MessageEventOffline | MessageEventDelivered | + MessageEventDisplayed | MessageEventComposing ) ); + m_lastSent = MessageEventCancel; + } + + void MessageEventFilter::registerMessageEventHandler( MessageEventHandler* meh ) + { + m_messageEventHandler = meh; + } + + void MessageEventFilter::removeMessageEventHandler() + { + m_messageEventHandler = 0; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/messageeventfilter.h b/smack/smack/src/main/cpp/gloox/src/messageeventfilter.h new file mode 100644 index 00000000..33825308 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messageeventfilter.h @@ -0,0 +1,95 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MESSAGEVENTFILTER_H__ +#define MESSAGEVENTFILTER_H__ + +#include "messagefilter.h" +#include "gloox.h" + +namespace gloox +{ + + class Tag; + class Message; + class MessageEventHandler; + class MessageSession; + + /** + * @brief This class adds Message Event (@xep{0022}) support to a MessageSession. + * + * This implementation of Message Events is fully transparent to the user of the class. + * If the remote entity does not request message events, MessageEventFilter will not send + * any, even if the user requests it. (This is required by the protocol specification.) + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API MessageEventFilter : public MessageFilter + { + public: + /** + * Contstructs a new Message Event filter for a MessageSession. + * @param parent The MessageSession to decorate. + */ + MessageEventFilter( MessageSession* parent ); + + /** + * Virtual destructor. + */ + virtual ~MessageEventFilter(); + + /** + * Use this function to raise an event as defined in @xep{0022}. + * @note The Spec states that Message Events shall not be sent to an entity + * which did not request them. Reasonable effort is taken in this function to + * avoid spurious event sending. You should be safe to call this even if Message + * Events were not requested by the remote entity. However, + * calling raiseMessageEvent( MESSAGE_EVENT_COMPOSING ) for every keystroke still is + * discouraged. ;) + * @param event The event to raise. + */ + void raiseMessageEvent( MessageEventType event ); + + /** + * The MessageEventHandler registered here will receive Message Events according + * to @xep{0022}. + * @param meh The MessageEventHandler to register. + */ + void registerMessageEventHandler( MessageEventHandler* meh ); + + /** + * This function clears the internal pointer to the MessageEventHandler. + * Message Events will not be delivered anymore after calling this function until another + * MessageEventHandler is registered. + */ + void removeMessageEventHandler(); + + // reimplemented from MessageFilter + virtual void decorate( Message& msg ); + + // reimplemented from MessageFilter + virtual void filter( Message& msg ); + + private: + MessageEventHandler* m_messageEventHandler; + std::string m_lastID; + int m_requestedEvents; + MessageEventType m_lastSent; + bool m_disable; + + }; + +} + +#endif // MESSAGEVENTFILTER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/messageeventhandler.h b/smack/smack/src/main/cpp/gloox/src/messageeventhandler.h new file mode 100644 index 00000000..55a355d5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messageeventhandler.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MESSAGEEVENTHANDLER_H__ +#define MESSAGEEVENTHANDLER_H__ + +#include "gloox.h" + +namespace gloox +{ + + class JID; + + /** + * @brief A virtual interface that enables an object to be notified about + * Message Events (@xep{0022}). + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API MessageEventHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~MessageEventHandler() {} + + /** + * Notifies the MessageEventHandler that an event has been raised by the remote + * contact. + * @param from The originator of the Event. + * @param event The Event which has been raised. + */ + virtual void handleMessageEvent( const JID& from, MessageEventType event ) = 0; + + }; + +} + +#endif // MESSAGEEVENTHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/messagefilter.cpp b/smack/smack/src/main/cpp/gloox/src/messagefilter.cpp new file mode 100644 index 00000000..c5b59690 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messagefilter.cpp @@ -0,0 +1,42 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "messagefilter.h" + + +namespace gloox +{ + + MessageFilter::MessageFilter( MessageSession* parent ) + : m_parent( 0 ) + { + if( parent ) + attachTo( parent ); + } + + MessageFilter::~MessageFilter() + { + } + + void MessageFilter::attachTo( MessageSession* session ) + { + if( m_parent ) + m_parent->removeMessageFilter( this ); + + if( session ) + session->registerMessageFilter( this ); + + m_parent = session; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/messagefilter.h b/smack/smack/src/main/cpp/gloox/src/messagefilter.h new file mode 100644 index 00000000..76428f5a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messagefilter.h @@ -0,0 +1,84 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MESSAGEFILTER_H__ +#define MESSAGEFILTER_H__ + +#include "messagesession.h" + +namespace gloox +{ + + class Message; + + /** + * @brief Virtual base class for message filters. + * + * A message filter is fed with all messages passing through a MessageSession. It can + * modify the XML/XMPP structure and/or the message content at will. Messages arriving + * from the server as well as messages sent to the server can be altered. + * + * Messages to be sent out are presented to the filter via the decorate() function, incoming + * messages can be filtered in the -- filter() method. + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API MessageFilter + { + + public: + /** + * Constructor. + * @param parent The MessageSession to attach to. + */ + MessageFilter( MessageSession* parent ); + + /** + * Virtual Destructor. + */ + virtual ~MessageFilter(); + + /** + * Attaches this MessageFilter to the given MessageSession and hooks it into + * the session's filter chain. + * If this filter was attached to a different MessageSession before, it is + * unregistered there prior to registering it with the new session. + * @param session The MessageSession to hook into. + */ + virtual void attachTo( MessageSession* session ); + + /** + * This function receives a message right before it is sent out (there may be other filters + * which get to see the message after this filter, though). + * @param msg The tag to decorate. It contains the message to be sent. + */ + virtual void decorate( Message& msg ) = 0; + + /** + * This function receives a message stanza right after it was received (there may be other filters + * which got to see the stanza before this filter, though). + * @param msg The complete message stanza. + */ + virtual void filter( Message& msg ) = 0; + + protected: + void send( Message& msg ) { if( m_parent ) m_parent->send( msg ); } + + MessageSession* m_parent; + + }; + +} + +#endif // MESSAGEFILTER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/messagehandler.h b/smack/smack/src/main/cpp/gloox/src/messagehandler.h new file mode 100644 index 00000000..bda2faa4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messagehandler.h @@ -0,0 +1,58 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MESSAGEHANDLER_H__ +#define MESSAGEHANDLER_H__ + +#include "macros.h" + +namespace gloox +{ + + class MessageSession; + class Message; + + /** + * @brief A virtual interface which can be reimplemented to receive incoming message stanzas. + * + * Derived classes can be registered as MessageHandlers with a ClientBase or MessageSession instance. + * Upon an incoming Message packet @ref handleMessage() will be called. If registered with a + * ClientBase this happens for every incoming message, regardless of the sender. With a MessageSession + * the registered handler will receive all messages originating from the Session's contact. See + * MessageSession for more details. + * + * @author Jakob Schröter + */ + class GLOOX_API MessageHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~MessageHandler() {} + + /** + * Reimplement this function if you want to be notified about + * incoming messages. + * @param msg The complete Message. + * @param session If this MessageHandler is used with a MessageSession, this parameter + * holds a pointer to that MessageSession. + * @since 1.0 + */ + virtual void handleMessage( const Message& msg, MessageSession* session = 0 ) = 0; + + }; + +} + +#endif // MESSAGEHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/messagesession.cpp b/smack/smack/src/main/cpp/gloox/src/messagesession.cpp new file mode 100644 index 00000000..ae88e231 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messagesession.cpp @@ -0,0 +1,115 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "messagesession.h" +#include "messagefilter.h" +#include "messagehandler.h" +#include "clientbase.h" +#include "disco.h" +#include "message.h" +#include "util.h" + +namespace gloox +{ + + MessageSession::MessageSession( ClientBase* parent, const JID& jid, bool wantResourceTracking, int types, bool honorTID ) + : m_parent( parent ), m_target( jid ), m_messageHandler( 0 ), + m_types( types ), m_wantResourceTracking( wantResourceTracking ), m_hadMessages( false ), m_honorThreadID( honorTID ) + { + if( m_parent ) + m_parent->registerMessageSession( this ); + } + + MessageSession::~MessageSession() + { + util::clearList( m_messageFilterList ); + } + + void MessageSession::handleMessage( Message& msg ) + { + if( m_wantResourceTracking && msg.from().resource() != m_target.resource() ) + setResource( msg.from().resource() ); + + if( !m_hadMessages ) + { + m_hadMessages = true; + if( msg.thread().empty() ) + { + m_thread = "gloox" + m_parent->getID(); + msg.setThread( m_thread ); + } + else + m_thread = msg.thread(); + } + + MessageFilterList::const_iterator it = m_messageFilterList.begin(); + for( ; it != m_messageFilterList.end(); ++it ) + (*it)->filter( msg ); + + if( m_messageHandler ) + m_messageHandler->handleMessage( msg, this ); + } + + void MessageSession::send( const std::string& message ) + { + send( message, EmptyString ); + } + + void MessageSession::send( const std::string& message, const std::string& subject, const StanzaExtensionList& sel ) + { + if( !m_hadMessages ) + { + m_thread = "gloox" + m_parent->getID(); + m_hadMessages = true; + } + + Message m( Message::Chat, m_target.full(), message, subject, m_thread ); + m.setID( m_parent->getID() ); + decorate( m ); + + if( sel.size() ) + { + StanzaExtensionList::const_iterator it = sel.begin(); + for( ; it != sel.end(); ++it ) + m.addExtension( (*it)); + } + + m_parent->send( m ); + } + + void MessageSession::send( const Message& msg ) + { + m_parent->send( msg ); + } + + void MessageSession::decorate( Message& msg ) + { + util::ForEach( m_messageFilterList, &MessageFilter::decorate, msg ); + } + + void MessageSession::resetResource() + { + m_target.setResource( EmptyString ); + } + + void MessageSession::setResource( const std::string& resource ) + { + m_target.setResource( resource ); + } + + void MessageSession::disposeMessageFilter( MessageFilter* mf ) + { + removeMessageFilter( mf ); + delete mf; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/messagesession.h b/smack/smack/src/main/cpp/gloox/src/messagesession.h new file mode 100644 index 00000000..724631d9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messagesession.h @@ -0,0 +1,318 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MESSAGESESSION_H__ +#define MESSAGESESSION_H__ + +#include "jid.h" +#include "gloox.h" + +#include +#include + +namespace gloox +{ + + class ClientBase; + class MessageFilter; + class MessageHandler; + class Message; + + /** + * @brief An abstraction of a message session between any two entities. + * + * This is an alternative interface to unmanaged messaging. The original interface, using the simple + * MessageHandler-derived interface, is based on an all-or-nothing approach. Once registered with + * ClientBase, a handler receives all message stanzas sent to this client and has to do any filtering + * on its own. + * + * MessageSession adds an abstraction to a chat conversation. A MessageSession is responsible for + * communicating with exactly one (full) JID. It is extensible with so-called MessageFilters, which can + * provide additional features such as Message Events, or Chat State Notifications. + * + * You can still use the old MessageHandler in parallel, but messages will not be relayed to both + * the generic MessageHandler and a MessageSession established for the sender's JID. The MessageSession + * takes precedence. + * + * Using MessageSessions has the following advantages over the plain old MessageHandler: + * @li automatic creation of MessageSessions + * @li filtering by JID + * @li automatic handling of threading (i.e., XMPP message threads) + * @li simpler sending of messages + * @li support for MessageFilters. + * + * @b Usage:
    + * Derive an object from MessageSessionHandler and reimplement handleMessageSession() to store your + * shiny new sessions somewhere, or to create a new chat window, or whatever. Register your + * object with a ClientBase instance using registerMessageSessionHandler(). In code: + * @code + * void MyClass::myFunc() + * { + * JID jid( "abc@example.org/gloox" ); + * j = new Client( jid, "password" ); + * [...] + * j->registerMessageSessionHandler( this, 0 ); + * } + * @endcode + * MyClass is a MessageSessionHandler here. + * + * In this example, MyClass needs to be MessageHandler, MessageEventHandler and + * ChatStateHandler, too. The handlers are registered with the session to receive the + * respective events. + * @code + * virtual void MyClass::handleMessageSession( MessageSession* session ) + * { + * // for this example only, we delete any earlier session + * if( m_session ) + * j->disposeMessageSession( m_session ); + * m_session = session; + * m_session->registerMessageHandler( this ); + * + * // the following is optional + * m_messageEventFilter = new MessageEventFilter( m_session ); + * m_messageEventFilter->registerMessageEventHandler( this ); + * m_chatStateFilter = new ChatStateFilter( m_session ); + * m_chatStateFilter->registerChatStateHandler( this ); + * } + * @endcode + * + * MessageEventHandler::handleMessageEvent() and ChatStateHandler::handleChatState() are called + * for incoming Message Events and Chat States, respectively. + * @code + * virtual void MyClass::handleMessageEvent( const JID& from, MessageEventType event ) + * { + * // display contact's Message Event + * } + * + * virtual void MyClass::handleChatState( const JID& from, ChatStateType state ) + * { + * // display contact's Chat State + * } + * @endcode + * + * To let the chat partner now that the user is typing a message or has closed the chat window, use + * raiseMessageEvent() and setChatState(), respectively. For example: + * @code + * // user is typing a message + * m_messageEventFilter->raiseMessageEvent( MessageEventComposing ); + * + * // acknowledge receiving of a message + * m_messageEventFilter->raiseMessageEvent( MessageEventDelivered ); + * + * // user is not actively paying attention to the chat + * m_chatStateFilter->setChatState( ChatStateInactive ); + * + * // user has closed the chat window + * m_chatStateFilter->setChatState( ChatStateGone ); + * @endcode + * + * To send a message to the chat partner of the session, use + * @ref send( const std::string& message, const std::string& subject, const StanzaExtensionList& ). + * You don't have to care about + * receipient, thread id, etc., they are added automatically. + * + * @code + * m_session->send( "Hello World!", "No Subject" ); + * @endcode + * + * To initiate a new chat session, all you have to do is create a new MessageSession and register + * a MessageHandler with it: + * @code + * MessageSession* MyClass::newSession( const JID& to ) + * { + * MessageSession* session = new MessageSession( m_client, to ); + * session->registerMessageHandler( this ); + * return session; + * } + * @endcode + * + * @note You should never delete a MessageSession manually. Use ClientBase::disposeMessageSession() + * instead. + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API MessageSession + { + + friend class MessageFilter; + + public: + /** + * Constructs a new MessageSession for the given JID. + * It is recommended to supply a full JID, in other words, it should have a resource set. + * No resource can lead to unexpected behavior. A thread ID is generated and sent along + * with every message sent through this session. + * @param parent The ClientBase to use for communication. + * @param jid The remote contact's full JID. If you don't know the full JID (this is probably the + * most common case) but still want replies from the full JID to be handled by this MessageSession, + * set the @b wantUpgrade parameter to true (or leave it untouched). + * @param wantUpgrade This flag indicates whether gloox should try to match an incoming message + * from a full JID to this MessageSession. If unsure, use the default. You probably only want to use + * a non-default value if this MessageSession is supposed to talk directly to a server or component + * JID that has no resource. This 'upgrade' will only happen once. + * @param types ORed list of Message::MessageType values this MessageSession shall receive. + * Defaults to 0 which means any type is received. + * @param honorTID Indicates whether thread IDs should be honored when matching incoming messages to MessageSessions. + * The default (@b true) is usually fine. + */ + MessageSession( ClientBase* parent, const JID& jid, bool wantUpgrade = true, int types = 0, bool honorTID = true ); + + /** + * Virtual destructor. + * + * @note You should never delete a MessageSession manually. Use ClientBase::disposeMessageSession() + * instead. + */ + virtual ~MessageSession(); + + /** + * Use this function to find out where this session points at. + * @return The receipient's JID. + */ + const JID& target() const { return m_target; } + + /** + * By default, a thread ID is sent with every message to identify + * messages belonging together. + * @returns The thread ID for this session. + */ + const std::string& threadID() const { return m_thread; } + + /** + * Use this function to set the session's thread ID if e.g. a specific thread is + * continued. It should not normally be needed to set the thread ID manually. + * @param thread The new thread ID. + */ + void setThreadID( const std::string& thread ) { m_thread = thread; } + + /** + * Indicates whether thread IDs are honored when matching incoming + * messages to MessageSessions. + * @return Whether thread IDs are honored. + */ + bool honorThreadID() const { return m_honorThreadID; } + + /** + * Use this function to associate a MessageHandler with this MessageSession. + * The MessageHandler will receive all messages sent from this MessageSession's + * remote contact. + * @param mh The MessageHandler to register. + */ + void registerMessageHandler( MessageHandler* mh ) + { m_messageHandler = mh; } + + /** + * This function clears the internal pointer to the MessageHandler and therefore + * disables message delivery. + */ + void removeMessageHandler() + { m_messageHandler = 0; } + + /** + * A convenience function to quickly send a message. + * @param message The message to send. + */ + virtual void send( const std::string& message ); + + /** + * A convenience function to quickly send a message (optionally with subject). This is + * the preferred way to send a message from a MessageSession. + * @param message The message to send. + * @param subject The optional subject to send. + * @param sel An optional list of StanzaExtensions. The extensions will be owned by the message-to-be-sent; + * do not attempt to re-use or delete them. + */ + virtual void send( const std::string& message, const std::string& subject, + const StanzaExtensionList& sel = StanzaExtensionList() ); + + /** + * Use this function to hook a new MessageFilter into a MessageSession. + * The filter will be able to read and/or modify a message stanza's content. + * @note The MessageSession will become the owner of the filter, it will be + * deleted by MessageSession's destructor. To get rid of the filter before that, + * use disposeMessageFilter(). + * @param mf The MessageFilter to add. + */ + void registerMessageFilter( MessageFilter* mf ) + { m_messageFilterList.push_back( mf ); } + + /** + * Use this function to remove a MessageFilter from the MessageSession. + * @param mf The MessageFilter to remove. + * @note To remove and delete the MessageFilter in one step use disposeMessageFilter(). + */ + void removeMessageFilter( MessageFilter* mf ) + { m_messageFilterList.remove( mf ); } + + /** + * Use this function to remove and delete a MessageFilter from the MessageSession. + * @param mf The MessageFilter to remove and delete. + * @note To just remove (and not delete) the MessageFilter use removeMessageFilter(). + */ + void disposeMessageFilter( MessageFilter* mf ); + + /** + * Returns the message type this MessageSession wants to receive. + * @return ORed list of Message::MessageType values this MessageSession wants to receive. + */ + int types() const { return m_types; } + + /** + * This function resets the session's target JID to its bare form such that + * subsequently sent messages will be sent to that bare JID. The server will + * determine the best resource to deliver to. Useful if the target + * resource changed presence to e.g. away or offline. This does not automatically + * set the wantResourceTracking option. If you need escalation, be sure to set + * this option in the constructor. + */ + void resetResource(); + + /** + * This function can be used to feed a message into the session. Ususally, only + * ClientBase should call this function. + * @param msg A Message to feed into the session. + */ + virtual void handleMessage( Message& msg ); + + protected: + /** + * A wrapper around ClientBase::send(). You should @b not use this function to send a + * chat message because the Tag is not prepared accordingly (neither a thread ID is added nor is + * the message ran through the message filters). + * @param msg A Message to send. + */ + virtual void send( const Message& msg ); + void decorate( Message& msg ); + + ClientBase* m_parent; + JID m_target; + MessageHandler* m_messageHandler; + + private: + void setResource( const std::string& resource ); + + typedef std::list MessageFilterList; + MessageFilterList m_messageFilterList; + + std::string m_thread; + int m_types; + bool m_wantResourceTracking; + bool m_hadMessages; + bool m_honorThreadID; + + }; + +} + +#endif // MESSAGESESSION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/messagesessionhandler.h b/smack/smack/src/main/cpp/gloox/src/messagesessionhandler.h new file mode 100644 index 00000000..612564b0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/messagesessionhandler.h @@ -0,0 +1,67 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MESSAGESESSIONHANDLER_H__ +#define MESSAGESESSIONHANDLER_H__ + +#include "stanza.h" +#include "messagesession.h" + +namespace gloox +{ + + /** + * @brief A virtual interface which can be reimplemented to receive incoming message sessions. + * + * Derived classes can be registered as MessageSessionHandlers with the Client. + * If you have registered as a MessageSessionHandler by calling ClientBase::registerMessageSessionHandler(), + * handleMessageSession() will be called if a message stanza arrives for which there is no + * MessageSession yet. + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API MessageSessionHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~MessageSessionHandler() {} + + /** + * Reimplement this function if you want to be notified about + * incoming messages by means of automatically created MessageSessions. + * You receive ownership of the supplied session (@b not the stanza) and + * are responsible for deleting it at the end of its life. + * + * @note Make sure to read the note in ClientBase::registerMessageSessionHandler() + * regarding the feeding of decorators. + * + * @note You should never delete the MessageSession manually. Instead call + * ClientBase::disposeMessageSession() when you no longer need the session. + * + * @note If you don't need the MessageSession, you should not dispose it here. You will + * get an endless loop if you do. + * + * @note You should register your MessageHandler here, or else the first message + * (that caused the MessageSession to be created) may get lost. + * + * @param session The new MessageSession. + */ + virtual void handleMessageSession( MessageSession* session ) = 0; + }; + +} + +#endif // MESSAGESESSIONHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.cpp b/smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.cpp new file mode 100644 index 00000000..d9416f95 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.cpp @@ -0,0 +1,27 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "mucinvitationhandler.h" +#include "mucroom.h" + +namespace gloox +{ + + MUCInvitationHandler::MUCInvitationHandler( ClientBase* parent ) + { + if( parent ) + parent->registerStanzaExtension( new MUCRoom::MUCUser() ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.h b/smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.h new file mode 100644 index 00000000..1eb108ed --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucinvitationhandler.h @@ -0,0 +1,67 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef MUCINVITATIONHANDLER_H__ +#define MUCINVITATIONHANDLER_H__ + +#include "clientbase.h" +#include "macros.h" +#include "jid.h" + +#include + +namespace gloox +{ + + /** + * @brief A handler that can be used to receive invitations to MUC rooms. + * + * Register a derived class with ClientBase::registerMUCInvitationHandler(). + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API MUCInvitationHandler + { + public: + /** + * Constructor. Prepares the given ClientBase for receiving MUC invitations.. + * @param parent A ClientBase instance to prepare. + */ + MUCInvitationHandler( ClientBase* parent ); + + /** + * Virtual Destructor. + */ + virtual ~MUCInvitationHandler() {} + + /** + * This function is called for incoming invitations to MUC rooms. + * @param room The JID of the room you're being invited to. + * @param from The JID of the inviter. + * @param reason A reason for the invitation. + * @param body The body of the message. May contain a MUC-service generated invitation message. + * @param password Optionally, a password for the room. + * @param cont Indicates whether or not the multi-user chat is a continuation of a private chat. + * @param thread An optional thread identifier in case this is a + * continued chat. + */ + virtual void handleMUCInvitation( const JID& room, const JID& from, const std::string& reason, + const std::string& body, const std::string& password, + bool cont, const std::string& thread ) = 0; + }; + +} + +#endif // MUCINVITATIONHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/mucmessagesession.cpp b/smack/smack/src/main/cpp/gloox/src/mucmessagesession.cpp new file mode 100644 index 00000000..86869109 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucmessagesession.cpp @@ -0,0 +1,54 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "mucmessagesession.h" +#include "clientbase.h" +#include "message.h" +#include "messagehandler.h" + +namespace gloox +{ + + MUCMessageSession::MUCMessageSession( ClientBase* parent, const JID& jid ) + : MessageSession( parent, jid, false, Message::Groupchat | Message::Chat + | Message::Normal | Message::Error, + false ) + { + } + + MUCMessageSession::~MUCMessageSession() + { + } + + void MUCMessageSession::handleMessage( Message& msg ) + { + if( m_messageHandler ) + m_messageHandler->handleMessage( msg ); + } + + void MUCMessageSession::send( const std::string& message ) + { + Message m( Message::Groupchat, m_target, message ); + +// decorate( m ); + + m_parent->send( m ); + } + + void MUCMessageSession::setSubject( const std::string& subject ) + { + Message m( Message::Groupchat, m_target.bareJID(), EmptyString, subject ); + m_parent->send( m ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/mucmessagesession.h b/smack/smack/src/main/cpp/gloox/src/mucmessagesession.h new file mode 100644 index 00000000..e97c3d9b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucmessagesession.h @@ -0,0 +1,66 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MUCMESSAGESESSION_H__ +#define MUCMESSAGESESSION_H__ + +#include "messagesession.h" + +namespace gloox +{ + + class ClientBase; + + /** + * @brief This is a MessageSession, adapted to be used in a MUC context. + * + * This class is used internally by MUCRoom. You should not need to use it directly. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API MUCMessageSession : public MessageSession + { + public: + /** + * Creates a new MUCMessageSession. + * @param parent The ClientBase to use for communication. + * @param jid The @b bare JID of the MUC room. + */ + MUCMessageSession( ClientBase* parent, const JID& jid ); + + /** + * Virtual Destructor. + */ + virtual ~MUCMessageSession(); + + /** + * Use this function to send a message to all room occupants. + * @param message The message to send. + */ + virtual void send( const std::string& message ); + + /** + * Use this function to set a new room subject. + * @param subject The new room subject. + */ + virtual void setSubject( const std::string& subject ); + + // reimplemented from MessageSession + virtual void handleMessage( Message& msg ); + + }; + +} + +#endif // MUCMESSAGESESSION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/mucroom.cpp b/smack/smack/src/main/cpp/gloox/src/mucroom.cpp new file mode 100644 index 00000000..880eb89f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucroom.cpp @@ -0,0 +1,1457 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "mucroom.h" +#include "clientbase.h" +#include "dataform.h" +#include "presence.h" +#include "disco.h" +#include "mucmessagesession.h" +#include "message.h" +#include "error.h" +#include "util.h" +#include "tag.h" +#include "../../log.h" + +namespace gloox +{ + + // ---- MUCRoom::MUCAdmin ---- + /* Error type values */ + static const char* affiliationValues [] = { + "none", + "outcast", + "member", + "owner", + "admin" + }; + + /* Stanza error values */ + static const char* roleValues [] = { + "none", + "visitor", + "participant", + "moderator", + }; + + /** Strings indicating the type of history to request. */ + const char* historyTypeValues[] = + { + "maxchars", "maxstanzas", "seconds", "since" + }; + + static inline MUCRoomAffiliation affiliationType( const std::string& type ) + { + return (MUCRoomAffiliation)util::lookup( type, affiliationValues ); + } + + static inline MUCRoomRole roleType( const std::string& type ) + { + return (MUCRoomRole)util::lookup( type, roleValues ); + } + + MUCRoom::MUCAdmin::MUCAdmin( MUCRoomRole role, const std::string& nick, + const std::string& reason ) + : StanzaExtension( ExtMUCAdmin ), m_affiliation( AffiliationInvalid ), m_role( role ) + { + m_list.push_back( MUCListItem( nick, role, reason ) ); + } + + MUCRoom::MUCAdmin::MUCAdmin( MUCRoomAffiliation affiliation, const std::string& nick, + const std::string& reason ) + : StanzaExtension( ExtMUCAdmin ), m_affiliation( affiliation ), m_role( RoleInvalid ) + { + m_list.push_back( MUCListItem( nick, affiliation, reason ) ); + } + + MUCRoom::MUCAdmin::MUCAdmin( MUCOperation operation, const MUCListItemList& jids ) + : StanzaExtension( ExtMUCAdmin ), m_list( jids ), m_affiliation( AffiliationInvalid ), + m_role( RoleInvalid ) + { + switch( operation ) + { + case StoreVoiceList: + case RequestVoiceList: + m_role = RoleParticipant; + break; + case StoreModeratorList: + case RequestModeratorList: + m_role = RoleModerator; + break; + case StoreBanList: + case RequestBanList: + m_affiliation = AffiliationOutcast; + break; + case StoreMemberList: + case RequestMemberList: + m_affiliation = AffiliationMember; + break; + case StoreOwnerList: + case RequestOwnerList: + m_affiliation = AffiliationOwner; + break; + case StoreAdminList: + case RequestAdminList: + m_affiliation = AffiliationAdmin; + break; + default: + return; + break; + } + + if( m_list.empty() ) + m_list.push_back( MUCListItem( JID() ) ); + } + + MUCRoom::MUCAdmin::MUCAdmin( const Tag* tag ) + : StanzaExtension( ExtMUCAdmin ), m_affiliation( AffiliationInvalid ), m_role( RoleInvalid ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_MUC_ADMIN ) + return; + + const TagList& items = tag->findChildren( "item" ); + TagList::const_iterator it = items.begin(); + for( ; it != items.end(); ++it ) + { + m_list.push_back( MUCListItem( JID( (*it)->findAttribute( "jid" ) ), + roleType( (*it)->findAttribute( "role" ) ), + affiliationType( (*it)->findAttribute( "affiliation" ) ), + (*it)->findAttribute( "nick" ) ) ); + if( m_role == RoleInvalid ) + m_role = roleType( (*it)->findAttribute( "role" ) ); + if( m_affiliation == AffiliationInvalid ) + m_affiliation = affiliationType( (*it)->findAttribute( "affiliation" ) ); + } + } + + MUCRoom::MUCAdmin::~MUCAdmin() + { + } + + const std::string& MUCRoom::MUCAdmin::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_MUC_ADMIN + "']"; + return filter; + } + + Tag* MUCRoom::MUCAdmin::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_MUC_ADMIN ); + + if( m_list.empty() || ( m_affiliation == AffiliationInvalid && m_role == RoleInvalid ) ) + return t; + + MUCListItemList::const_iterator it = m_list.begin(); + for( ; it != m_list.end(); ++it ) + { + Tag* i = new Tag( t, "item" ); + if( (*it).jid() ) + i->addAttribute( "jid", (*it).jid().bare() ); + if( !(*it).nick().empty() ) + i->addAttribute( "nick", (*it).nick() ); + + MUCRoomRole rol = RoleInvalid; + if( (*it).role() != RoleInvalid ) + rol = (*it).role(); + else if( m_role != RoleInvalid ) + rol = m_role; + if( rol != RoleInvalid ) + i->addAttribute( "role", util::lookup( rol, roleValues ) ); + + MUCRoomAffiliation aff = AffiliationInvalid; + if( (*it).affiliation() != AffiliationInvalid ) + aff = (*it).affiliation(); + else if( m_affiliation != AffiliationInvalid ) + aff = m_affiliation; + if( aff != AffiliationInvalid ) + i->addAttribute( "affiliation", util::lookup( aff, affiliationValues ) ); + if( !(*it).reason().empty() ) + new Tag( i, "reason", (*it).reason() ); + } + + return t; + } + // ---- ~MUCRoom::MUCAdmin ---- + + // ---- MUCRoom::MUCOwner ---- + MUCRoom::MUCOwner::MUCOwner( QueryType type, DataForm* form ) + : StanzaExtension( ExtMUCOwner ), m_type( type ), m_form( form ) + { + m_valid = true; + + if( m_form ) + return; + + switch( type ) + { + case TypeCancelConfig: + m_form = new DataForm( TypeCancel ); + break; + case TypeInstantRoom: + m_form = new DataForm( TypeSubmit ); + break; + default: + break; + } + } + + MUCRoom::MUCOwner::MUCOwner( const JID& alternate, const std::string& reason, + const std::string& password ) + : StanzaExtension( ExtMUCOwner ), m_type( TypeDestroy ), m_jid( alternate ), + m_reason( reason ), m_pwd( password ), m_form( 0 ) + { + m_valid = true; + } + + MUCRoom::MUCOwner::MUCOwner( const Tag* tag ) + : StanzaExtension( ExtMUCOwner ), m_type( TypeIncomingTag ), m_form( 0 ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_MUC_OWNER ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + const std::string& name = (*it)->name(); + if( name == "x" && (*it)->xmlns() == XMLNS_X_DATA ) + { + m_form = new DataForm( (*it) ); + break; + } + else if( name == "destroy" ) + { + m_type = TypeDestroy; + m_jid = (*it)->findAttribute( "jid" ); + m_pwd = (*it)->findCData( "/query/destroy/password" ); + m_reason = (*it)->findCData( "/query/destroy/reason" ); + break; + } + } + m_valid = true; + } + + MUCRoom::MUCOwner::~MUCOwner() + { + delete m_form; + } + + const std::string& MUCRoom::MUCOwner::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_MUC_OWNER + "']"; + return filter; + } + + Tag* MUCRoom::MUCOwner::tag() const + { + if( !m_valid ) + return 0; + + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_MUC_OWNER ); + + switch( m_type ) + { + case TypeInstantRoom: + case TypeSendConfig: + case TypeCancelConfig: + case TypeIncomingTag: + if( m_form ) + t->addChild( m_form->tag() ); + break; + case TypeDestroy: + { + Tag* d = new Tag( t, "destroy" ); + if( m_jid ) + d->addAttribute( "jid", m_jid.bare() ); + + if( !m_reason.empty() ) + new Tag( d, "reason", m_reason ); + + if( !m_pwd.empty() ) + new Tag( d, "password", m_pwd ); + + break; + } + case TypeRequestConfig: + case TypeCreate: + default: + break; + } + + return t; + } + // ---- ~MUCRoom::MUCOwner ---- + + // ---- MUCRoom::MUCUser ---- + MUCRoom::MUCUser::MUCUser( MUCUserOperation operation, const std::string& to, + const std::string& reason, const std::string& thread ) + : StanzaExtension( ExtMUCUser ), m_affiliation( AffiliationInvalid ), m_role( RoleInvalid ), + m_jid( new std::string( to ) ), m_actor( 0 ), + m_thread( thread.empty() ? 0 : new std::string( thread ) ), + m_reason( new std::string( reason ) ), m_newNick( 0 ), m_password( 0 ), m_alternate( 0 ), + m_operation( operation ), + m_flags( 0 ), m_del( false ), m_continue( !thread.empty() ) + { + } + + MUCRoom::MUCUser::MUCUser( const Tag* tag ) + : StanzaExtension( ExtMUCUser ), m_affiliation( AffiliationInvalid ), m_role( RoleInvalid ), + m_jid( 0 ), m_actor( 0 ), m_thread( 0 ), m_reason( 0 ), m_newNick( 0 ), + m_password( 0 ), m_alternate( 0 ), m_operation( OpNone ), + m_flags( 0 ), m_del( false ), m_continue( false ) + { + if( !tag || tag->name() != "x" || tag->xmlns() != XMLNS_MUC_USER ) + return; + + const Tag* t = 0; + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "item" ) + { + m_affiliation = getEnumAffiliation( (*it)->findAttribute( "affiliation" ) ); + m_role = getEnumRole( (*it)->findAttribute( "role" ) ); + + if( (*it)->hasAttribute( "jid" ) ) + m_jid = new std::string( (*it)->findAttribute( "jid" ) ); + + if( ( t = (*it)->findChild( "actor" ) ) ) + m_actor = new std::string( t->findAttribute( "jid" ) ); + + if( ( t = (*it)->findChild( "reason" ) ) ) + m_reason = new std::string( t->cdata() ); + + if( (*it)->hasAttribute( "nick" ) ) + m_newNick = new std::string( (*it)->findAttribute( "nick" ) ); + } + else if( (*it)->name() == "status" ) + { + const std::string& code = (*it)->findAttribute( "code" ); + if( code == "100" ) + m_flags |= FlagNonAnonymous; + else if( code == "101" ) + m_flags |= UserAffiliationChangedWNR; + else if( code == "110" ) + m_flags |= UserSelf; + else if( code == "170" ) + m_flags |= FlagPublicLogging; + else if( code == "201" ) + m_flags |= UserNewRoom; + else if( code == "210" ) + m_flags |= UserNickAssigned; + else if( code == "301" ) + m_flags |= UserBanned; + else if( code == "303" ) + m_flags |= UserNickChanged; + else if( code == "307" ) + m_flags |= UserKicked; + else if( code == "321" ) + m_flags |= UserAffiliationChanged; + else if( code == "322" ) + m_flags |= UserMembershipRequired; + else if( code == "332" ) + m_flags |= UserRoomShutdown; + } + else if( (*it)->name() == "destroy" ) + { + m_del = true; + if( (*it)->hasAttribute( "jid" ) ) + m_alternate = new std::string( (*it)->findAttribute( "jid" ) ); + + if( ( t = (*it)->findChild( "reason" ) ) ) + m_reason = new std::string( t->cdata() ); + + m_flags |= UserRoomDestroyed; + } + else if( (*it)->name() == "invite" ) + { + m_operation = OpInviteFrom; + m_jid = new std::string( (*it)->findAttribute( "from" ) ); + if( m_jid->empty() ) + { + m_operation = OpInviteTo; + m_jid->assign( (*it)->findAttribute( "to" ) ); + } + if( (*it)->hasChild( "reason" ) ) + m_reason = new std::string( (*it)->findChild( "reason" )->cdata() ); + if( (*it)->hasChild( "continue" ) ) + { + m_continue = true; + m_thread = new std::string( (*it)->findChild( "continue" )->findAttribute( "thread" ) ); + } + } + else if( (*it)->name() == "decline" ) + { + m_operation = OpDeclineFrom; + m_jid = new std::string( (*it)->findAttribute( "from" ) ); + if( m_jid->empty() ) + { + m_operation = OpDeclineTo; + m_jid->assign( (*it)->findAttribute( "from" ) ); + } + if( (*it)->hasChild( "reason" ) ) + m_reason = new std::string( (*it)->findChild( "reason" )->cdata() ); + } + else if( (*it)->name() == "password" ) + { + m_password = new std::string( (*it)->cdata() ); + } + } + } + + MUCRoom::MUCUser::~MUCUser() + { + delete m_jid; + delete m_actor; + delete m_thread; + delete m_reason; + delete m_newNick; + delete m_password; + delete m_alternate; + } + + MUCRoomRole MUCRoom::MUCUser::getEnumRole( const std::string& role ) + { + if( role == "moderator" ) + return RoleModerator; + if( role == "participant" ) + return RoleParticipant; + if( role == "visitor" ) + return RoleVisitor; + return RoleNone; + } + + MUCRoomAffiliation MUCRoom::MUCUser::getEnumAffiliation( const std::string& affiliation ) + { + if( affiliation == "owner" ) + return AffiliationOwner; + if( affiliation == "admin" ) + return AffiliationAdmin; + if( affiliation == "member" ) + return AffiliationMember; + if( affiliation == "outcast" ) + return AffiliationOutcast; + return AffiliationNone; + } + + const std::string& MUCRoom::MUCUser::filterString() const + { + static const std::string filter = "/presence/x[@xmlns='" + XMLNS_MUC_USER + "']" + "|/message/x[@xmlns='" + XMLNS_MUC_USER + "']"; + return filter; + } + + Tag* MUCRoom::MUCUser::tag() const + { + Tag* t = new Tag( "x" ); + t->setXmlns( XMLNS_MUC_USER ); + + if( m_affiliation != AffiliationInvalid || m_role != RoleInvalid ) + { + Tag* i = new Tag( t, "item" ); + if( m_jid ) + i->addAttribute( "jid", *m_jid ); + if( m_role != RoleInvalid ) + i->addAttribute( "role", util::lookup( m_role, roleValues ) ); + if( m_affiliation != AffiliationInvalid ) + i->addAttribute( "affiliation", util::lookup( m_affiliation, affiliationValues ) ); + + if( m_actor ) + new Tag( i, "actor", "jid", *m_actor ); + + if( m_flags & FlagNonAnonymous ) + new Tag( t, "status", "code", "100" ); + if( m_flags & UserAffiliationChangedWNR ) + new Tag( t, "status", "code", "101" ); + if( m_flags & UserSelf ) + new Tag( t, "status", "code", "110" ); + if( m_flags & FlagPublicLogging ) + new Tag( t, "status", "code", "170" ); + if( m_flags & UserNewRoom ) + new Tag( t, "status", "code", "201" ); + if( m_flags & UserNickAssigned ) + new Tag( t, "status", "code", "210" ); + if( m_flags & UserBanned ) + new Tag( t, "status", "code", "301" ); + if( m_flags & UserNickChanged ) + new Tag( t, "status", "code", "303" ); + if( m_flags & UserKicked ) + new Tag( t, "status", "code", "307" ); + if( m_flags & UserAffiliationChanged ) + new Tag( t, "status", "code", "321" ); + if( m_flags & UserMembershipRequired ) + new Tag( t, "status", "code", "322" ); + if( m_flags & UserRoomShutdown ) + new Tag( t, "status", "code", "332" ); + } + else if( m_del ) + { + Tag* d = new Tag( t, "destroy" ); + if( m_alternate ) + d->addAttribute( "jid", *m_alternate ); + if( m_reason ) + new Tag( d, "reason", *m_reason ); + } + else if( m_operation != OpNone && m_jid ) + { + Tag* d = 0; + if( m_operation == OpInviteTo ) + d = new Tag( t, "invite", "to", *m_jid ); + else if( m_operation == OpInviteFrom ) + d = new Tag( t, "invite", "from", *m_jid ); + else if( m_operation == OpDeclineTo ) + d = new Tag( t, "decline", "to", *m_jid ); + else if( m_operation == OpDeclineFrom ) + d = new Tag( t, "decline", "from", *m_jid ); + + if( m_reason ) + new Tag( d, "reason", *m_reason ); + + if( m_continue ) + { + Tag* c = new Tag( d, "continue" ); + if( m_thread ) + c->addAttribute( "thread", *m_thread ); + } + + if( m_password ) + new Tag( t, "password", *m_password ); + + } + + return t; + } + // ---- ~MUCRoom::MUCUser ---- + + // ---- MUCRoom::MUC ---- + MUCRoom::MUC::MUC( const std::string& password, + MUCRoom::HistoryRequestType historyType, + const std::string& historySince, + int historyValue ) + : StanzaExtension( ExtMUC ), + m_password( password.empty() ? 0 : new std::string( password ) ), + m_historySince( new std::string( historySince ) ), + m_historyType( historyType ), m_historyValue( historyValue ) + { + } + + MUCRoom::MUC::MUC( const Tag* tag ) + : StanzaExtension( ExtMUC ), + m_password( 0 ), m_historySince( 0 ), + m_historyType( HistoryUnknown ), m_historyValue( 0 ) + { + if( !tag || tag->name() != "x" || tag->xmlns() != XMLNS_MUC_USER ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "history" ) + { + if( (*it)->hasAttribute( "seconds" ) ) + m_historyValue = atoi( (*it)->findAttribute( "seconds" ).c_str() ); + else if( (*it)->hasAttribute( "maxstanzas" ) ) + m_historyValue = atoi( (*it)->findAttribute( "maxstanzas" ).c_str() ); + else if( (*it)->hasAttribute( "maxchars" ) ) + m_historyValue = atoi( (*it)->findAttribute( "maxchars" ).c_str() ); + else if( (*it)->hasAttribute( "since" ) ) + m_historySince = new std::string( (*it)->findAttribute( "since" ) ); + } + else if( (*it)->name() == "password" ) + { + m_password = new std::string( (*it)->cdata() ); + } + } + } + + MUCRoom::MUC::~MUC() + { + delete m_password; + delete m_historySince; + } + + const std::string& MUCRoom::MUC::filterString() const + { + static const std::string filter = "/presence/x[@xmlns='" + XMLNS_MUC + "']"; + return filter; + } + + Tag* MUCRoom::MUC::tag() const + { + Tag* t = new Tag( "x" ); + t->setXmlns( XMLNS_MUC ); + + if( m_historyType != HistoryUnknown ) + { + const std::string& histStr = util::lookup( m_historyType, historyTypeValues ); + Tag* h = new Tag( t, "history" ); + if( m_historyType == HistorySince && m_historySince ) + h->addAttribute( histStr, *m_historySince ); + else + h->addAttribute( histStr, m_historyValue ); + } + + if( m_password ) + new Tag( t, "password", *m_password ); + + return t; + } + // ---- ~MUCRoom::MUC ---- + + // --- MUCRoom ---- + MUCRoom::MUCRoom( ClientBase* parent, const JID& nick, MUCRoomHandler* mrh, + MUCRoomConfigHandler* mrch ) + : m_parent( parent ), m_nick( nick ), m_joined( false ), m_roomHandler( mrh ), + m_roomConfigHandler( mrch ), m_affiliation( AffiliationNone ), m_role( RoleNone ), + m_historyType( HistoryUnknown ), m_historyValue( 0 ), m_flags( 0 ), + m_creationInProgress( false ), m_configChanged( false ), + m_publishNick( false ), m_publish( false ), m_unique( false ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new MUCAdmin() ); + m_parent->registerStanzaExtension( new MUCOwner() ); + m_parent->registerStanzaExtension( new MUCUser() ); + m_parent->registerStanzaExtension( new MUC() ); + m_parent->registerStanzaExtension( new DelayedDelivery() ); + } + } + + MUCRoom::~MUCRoom() + { + if( m_joined ) + leave(); + + if( m_parent ) + { + if( m_publish ) + m_parent->disco()->removeNodeHandler( this, XMLNS_MUC_ROOMS ); + + m_parent->removeIDHandler( this ); +// m_parent->removeStanzaExtension( ExtMUCAdmin ); // don't remove, other rooms might need it +// m_parent->removeStanzaExtension( ExtMUCOwner ); + m_parent->removePresenceHandler( m_nick.bareJID(), this ); + m_parent->disco()->removeDiscoHandler( this ); + } + } + + void MUCRoom::join( Presence::PresenceType type, const std::string& status, int priority ) + { + if( m_joined || !m_parent ) + return; + + m_parent->registerPresenceHandler( m_nick.bareJID(), this ); + + m_session = new MUCMessageSession( m_parent, m_nick.bareJID() ); + m_session->registerMessageHandler( this ); + + Presence pres( type, m_nick.full(), status, priority ); + pres.addExtension( new MUC( m_password, m_historyType, m_historySince, m_historyValue ) ); + m_joined = true; + m_parent->send( pres ); + } + + void MUCRoom::leave( const std::string& msg ) + { + if( !m_joined ) + return; + + if( m_parent ) + { + Presence pres( Presence::Unavailable, m_nick.full(), msg ); + m_parent->send( pres ); + m_parent->removePresenceHandler( m_nick.bareJID(), this ); + m_parent->disposeMessageSession( m_session ); + } + + m_session = 0; + m_joined = false; + } + + void MUCRoom::destroy( const std::string& reason, const JID& alternate, const std::string& password ) + { + if( !m_parent ) + return; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, m_nick.bareJID(), id ); + iq.addExtension( new MUCOwner( alternate, reason, password ) ); + m_parent->send( iq, this, DestroyRoom ); + } + + void MUCRoom::send( const std::string& message ) + { + if( m_session && m_joined ) + m_session->send( message ); + } + + void MUCRoom::setSubject( const std::string& subject ) + { + if( m_session && m_joined ) + m_session->setSubject( subject ); + } + + void MUCRoom::setNick( const std::string& nick ) + { + if( m_parent && m_joined ) + { + m_newNick = nick; + + Presence p( Presence::Available, m_nick.bare() + "/" + m_newNick ); + m_parent->send( p ); + } + else + m_nick.setResource( nick ); + } + + void MUCRoom::getRoomInfo() + { + if( m_parent ) + m_parent->disco()->getDiscoInfo( m_nick.bare(), EmptyString, this, GetRoomInfo ); + } + + void MUCRoom::getRoomItems() + { + if( m_parent ) + m_parent->disco()->getDiscoItems( m_nick.bare(), EmptyString, this, GetRoomItems ); + } + + void MUCRoom::setPresence( Presence::PresenceType presence, const std::string& msg ) + { + if( m_parent && presence != Presence::Unavailable && m_joined ) + { + Presence p( presence, m_nick.full(), msg ); + m_parent->send( p ); + } + } + + void MUCRoom::invite( const JID& invitee, const std::string& reason, const std::string& thread ) + { + if( !m_parent || !m_joined ) + return; + + Message msg( Message::Normal, m_nick.bareJID() ); + msg.addExtension( new MUCUser( OpInviteTo, invitee.bare(), reason, thread ) ); + m_parent->send( msg ); + } + + Message* MUCRoom::declineInvitation( const JID& room, const JID& invitor, const std::string& reason ) + { + Message* msg = new Message( Message::Normal, room.bare() ); + msg->addExtension( new MUCUser( OpDeclineTo, invitor.bare(), reason ) ); + return msg; + } + + void MUCRoom::setPublish( bool publish, bool publishNick ) + { + m_publish = publish; + m_publishNick = publishNick; + + if( !m_parent ) + return; + + if( m_publish ) + m_parent->disco()->registerNodeHandler( this, XMLNS_MUC_ROOMS ); + else + m_parent->disco()->removeNodeHandler( this, XMLNS_MUC_ROOMS ); + } + + void MUCRoom::addHistory( const std::string& message, const JID& from, const std::string& stamp ) + { + if( !m_joined || !m_parent ) + return; + + Message m( Message::Groupchat, m_nick.bareJID(), message ); + m.addExtension( new DelayedDelivery( from, stamp ) ); + m_parent->send( m ); + } + + void MUCRoom::setRequestHistory( int value, MUCRoom::HistoryRequestType type ) + { + m_historyType = type; + m_historySince = EmptyString; + m_historyValue = value; + } + + void MUCRoom::setRequestHistory( const std::string& since ) + { + m_historyType = HistorySince; + m_historySince = since; + m_historyValue = 0; + } + + Message* MUCRoom::createDataForm( const JID& room, const DataForm* df ) + { + Message* m = new Message( Message::Normal, room.bare() ); + m->addExtension( df ); + return m; + } + + void MUCRoom::requestVoice() + { + if( !m_parent || !m_joined ) + return; + + DataForm* df = new DataForm( TypeSubmit ); + df->addField( DataFormField::TypeNone, "FORM_TYPE", XMLNS_MUC_REQUEST ); + df->addField( DataFormField::TypeTextSingle, "muc#role", "participant", "Requested role" ); + + Message m( Message::Normal, m_nick.bare() ); + m.addExtension( df ); + + m_parent->send( m ); + } + + void MUCRoom::setRole( const std::string& nick, MUCRoomRole role, + const std::string& reason ) + { + if( !m_parent || !m_joined || nick.empty() || role == RoleInvalid ) + return; + + MUCOperation action = InvalidOperation; + switch( role ) + { + case RoleNone: + action = SetRNone; + break; + case RoleVisitor: + action = SetVisitor; + break; + case RoleParticipant: + action = SetParticipant; + break; + case RoleModerator: + action = SetModerator; + break; + default: + break; + } + + IQ iq( IQ::Set, m_nick.bareJID() ); + iq.addExtension( new MUCAdmin( role, nick, reason ) ); + + m_parent->send( iq, this, action ); + } + void MUCRoom::setRoles( const std::string& nicks, MUCRoomRole role, + const std::string& reason ) + { + if( !m_parent || !m_joined || nicks.empty() || role == RoleInvalid ) + return; + + MUCOperation action = InvalidOperation; + switch( role ) + { + case RoleNone: + action = SetRNone; + break; + case RoleVisitor: + action = SetVisitor; + break; + case RoleParticipant: + action = SetParticipant; + break; + case RoleModerator: + action = SetModerator; + break; + default: + break; + } + + IQ iq( IQ::Set, m_nick.bareJID() ); + // iq.addExtension( new MUCAdmin( role, nick, reason ) ); + // m_parent->send( iq, this, action ); + + char *s = (char *) nicks.c_str(); + const char *d = ","; + char *p; + p = strtok(s,d); + int i=0; + MUCAdmin *admin = nullptr; + + while(p) + { + printf("%s\n",p); + LOGD("test setRoles %s ", p); + + if(admin == nullptr){ + LOGD("test setRoles 0 opr"); + if(strlen(p)>0){ + LOGD("test setRoles 1 opr"); + admin = new MUCAdmin( role, p, reason ); + } + }else if(strlen(p)>0){ + LOGD("test setRoles other opr"); + const_cast(admin->list()).push_back( MUCListItem( p, role, reason ) ); + } + p=strtok(NULL,d); + i++; + } + if(admin) + { + iq.addExtension( admin ); + m_parent->send( iq, this, action ); + } + + } + + void MUCRoom::setAffiliation( const std::string& nick, MUCRoomAffiliation affiliation, + const std::string& reason ) + { + if( !m_parent || !m_joined || nick.empty() || affiliation == AffiliationInvalid ) + return; + + MUCOperation action = InvalidOperation; + switch( affiliation ) + { + case AffiliationOutcast: + action = SetOutcast; + break; + case AffiliationNone: + action = SetANone; + break; + case AffiliationMember: + action = SetMember; + break; + case AffiliationAdmin: + action = SetAdmin; + break; + case AffiliationOwner: + action = SetOwner; + break; + default: + break; + } + + IQ iq( IQ::Set, m_nick.bareJID() ); + iq.addExtension( new MUCAdmin( affiliation, nick, reason ) ); + + m_parent->send( iq, this, action ); + } + + void MUCRoom::setAffiliations( const std::string& nicks, MUCRoomAffiliation affiliation, + const std::string& reason ) + { + if( !m_parent || !m_joined || nicks.empty() || affiliation == AffiliationInvalid ) + return; + + MUCOperation action = InvalidOperation; + switch( affiliation ) + { + case AffiliationOutcast: + action = SetOutcast; + break; + case AffiliationNone: + action = SetANone; + break; + case AffiliationMember: + action = SetMember; + break; + case AffiliationAdmin: + action = SetAdmin; + break; + case AffiliationOwner: + action = SetOwner; + break; + default: + break; + } + + LOGD("test setAffiliations 1"); + IQ iq( IQ::Set, m_nick.bareJID() ); + + char *s = (char *) nicks.c_str(); + const char *d = ","; + char *p; + p = strtok(s,d); + int i=0; + MUCAdmin *admin = nullptr; + + while(p) + { + printf("%s\n",p); + LOGD("test setAffiliations %s ", p); + + if(admin == nullptr){ + LOGD("test setAffiliations 0 opr"); + if(strlen(p)>0){ + LOGD("test setAffiliations 1 opr"); + admin = new MUCAdmin( affiliation, p, reason ); + } + }else if(strlen(p)>0){ + LOGD("test setAffiliations other opr"); + const_cast(admin->list()).push_back( MUCListItem( p, affiliation, reason ) ); + } + p=strtok(NULL,d); + i++; + } + if(admin) + { + iq.addExtension( admin ); + m_parent->send( iq, this, action ); + } + + // MUCAdmin *admin = new MUCAdmin( affiliation, "555", reason ); + // MUCListItemList& mlist = const_cast(admin->list()); + // mlist.push_back( MUCListItem( "test", affiliation, reason ) ); + // mlist.push_back( MUCListItem( "333", affiliation, reason ) ); + // iq.addExtension( admin ); + // m_parent->send( iq, this, action ); + } + + std::string MUCRoom::isJoined(){ + if(m_joined){ + return "1"; + }else{ + return "0"; + } + } + + void MUCRoom::requestList( MUCOperation operation ) + { + if( !m_parent || !m_joined || !m_roomConfigHandler ) + return; + + IQ iq( IQ::Get, m_nick.bareJID() ); + iq.addExtension( new MUCAdmin( operation ) ); + m_parent->send( iq, this, operation ); + } + + void MUCRoom::storeList( const MUCListItemList items, MUCOperation operation ) + { + if( !m_parent || !m_joined ) + return; + + IQ iq( IQ::Set, m_nick.bareJID() ); + iq.addExtension( new MUCAdmin( operation , items ) ); + m_parent->send( iq, this, operation ); + } + + void MUCRoom::handlePresence( const Presence& presence ) + { + if( ( presence.from().bare() != m_nick.bare() ) || !m_roomHandler ) + return; + + if( presence.subtype() == Presence::Error ) + { + if( m_newNick.empty() ) + { + m_parent->removePresenceHandler( m_nick.bareJID(), this ); + m_parent->disposeMessageSession( m_session ); + m_joined = false; + m_session = 0; + } + else + m_newNick = ""; + + m_roomHandler->handleMUCError( this, presence.error() + ? presence.error()->error() + : StanzaErrorUndefined ); + } + else + { + const MUCUser* mu = presence.findExtension( ExtMUCUser ); + if( !mu ) + return; + + MUCRoomParticipant party; + party.nick = new JID( presence.from() ); + party.status = presence.status(); + party.affiliation = mu->affiliation(); + party.role = mu->role(); + party.jid = mu->jid() ? new JID( *(mu->jid()) ) : 0; + party.actor = mu->actor() ? new JID( *(mu->actor()) ) : 0; + party.reason = mu->reason() ? *(mu->reason()) : EmptyString; + party.newNick = mu->newNick() ? *(mu->newNick()) : EmptyString; + party.alternate = mu->alternate() ? new JID( *(mu->alternate()) ) : 0; + party.flags = mu->flags(); + + if( party.flags & FlagNonAnonymous ) + setNonAnonymous(); + + if( party.flags & UserSelf ) + { + m_role = party.role; + m_affiliation = party.affiliation; + } + if( party.flags & UserNewRoom ) + { + m_creationInProgress = true; + if( instantRoomHook() || m_roomHandler->handleMUCRoomCreation( this ) ) + acknowledgeInstantRoom(); + } + if( party.flags & UserNickAssigned ) + m_nick.setResource( presence.from().resource() ); + + if( party.flags & UserNickChanged && !party.newNick.empty() + && m_nick.resource() == presence.from().resource() + && party.newNick == m_newNick ) + party.flags |= UserSelf; + + if( party.flags & UserNickChanged && party.flags & UserSelf && !party.newNick.empty() ) + m_nick.setResource( party.newNick ); + + if( m_roomHandler ) + m_roomHandler->handleMUCParticipantPresence( this, party, presence ); + + delete party.nick; + delete party.jid; + delete party.actor; + delete party.alternate; + } + } + + void MUCRoom::instantRoom( int context ) + { + if( !m_creationInProgress || !m_parent || !m_joined ) + return; + + IQ iq( IQ::Set, m_nick.bareJID() ); + iq.addExtension( new MUCOwner( context == CreateInstantRoom + ? MUCOwner::TypeInstantRoom : MUCOwner::TypeCancelConfig ) ); + + m_parent->send( iq, this, context ); + + m_creationInProgress = false; + } + + void MUCRoom::requestRoomConfig() + { + if( !m_parent || !m_joined ) + return; + + IQ iq( IQ::Get, m_nick.bareJID() ); + iq.addExtension( new MUCOwner( MUCOwner::TypeRequestConfig ) ); + + m_parent->send( iq, this, RequestRoomConfig ); + + if( m_creationInProgress ) + m_creationInProgress = false; + } + + void MUCRoom::setRoomConfig( DataForm* form ) + { + if( !m_parent || !m_joined ) + return; + + IQ iq( IQ::Set, m_nick.bareJID() ); + iq.addExtension( new MUCOwner( MUCOwner::TypeSendConfig, form ) ); + + m_parent->send( iq, this, SendRoomConfig ); + } + + void MUCRoom::setNonAnonymous() + { + m_flags |= FlagNonAnonymous; + m_flags &= ~( FlagSemiAnonymous | FlagFullyAnonymous ); + } + + void MUCRoom::setSemiAnonymous() + { + m_flags &= ~( FlagNonAnonymous | FlagFullyAnonymous ); + m_flags |= FlagSemiAnonymous; + } + + void MUCRoom::setFullyAnonymous() + { + m_flags &= ~( FlagNonAnonymous | FlagSemiAnonymous ); + m_flags |= FlagFullyAnonymous; + } + + void MUCRoom::handleMessage( const Message& msg, MessageSession* /*session*/ ) + { + if( !m_roomHandler ) + return; + + if( msg.subtype() == Message::Error ) + { + m_roomHandler->handleMUCError( this, msg.error() ? msg.error()->error() : StanzaErrorUndefined ); + } + else + { + const MUCUser* mu = msg.findExtension( ExtMUCUser ); + if( mu ) + { + const int flags = mu->flags(); + if( flags & FlagNonAnonymous ) + setNonAnonymous(); + if( flags & FlagPublicLogging ) + { + m_flags &= ~FlagPublicLoggingOff; + m_flags |= FlagPublicLogging; + } + if( flags & FlagPublicLoggingOff ) + { + m_flags &= ~FlagPublicLogging; + m_flags |= FlagPublicLoggingOff; + } + if( flags & FlagSemiAnonymous ) + setSemiAnonymous(); + if( flags & FlagFullyAnonymous ) + setFullyAnonymous(); + + if( mu->operation() == OpDeclineFrom && mu->jid() ) + m_roomHandler->handleMUCInviteDecline( this, JID( *(mu->jid()) ), + mu->reason() ? *(mu->reason()) : EmptyString ); + } + + const DataForm* df = msg.findExtension( ExtDataForm ); + if( m_roomConfigHandler && df ) + { + m_roomConfigHandler->handleMUCRequest( this, *df ); + return; + } + + if( !msg.subject().empty() ) + { + m_roomHandler->handleMUCSubject( this, msg.from().resource(), msg.subject() ); + } + else if( !msg.body().empty() ) + { + std::string when; + bool privMsg = false; + if( msg.when() ) + when = msg.when()->stamp(); + + if( msg.subtype() & ( Message::Chat | Message::Normal ) ) + privMsg = true; + + m_roomHandler->handleMUCMessage( this, msg, privMsg ); + } + } + } + + void MUCRoom::handleIqID( const IQ& iq, int context ) + { + if( !m_roomConfigHandler ) + return; + + switch( iq.subtype() ) + { + case IQ::Result: + handleIqResult( iq, context ); + break; + case IQ::Error: + handleIqError( iq, context ); + break; + default: + break; + } + } + + void MUCRoom::handleIqResult( const IQ& iq, int context ) + { + switch( context ) + { + case SetRNone: + case SetVisitor: + case SetParticipant: + case SetModerator: + case SetANone: + case SetOutcast: + case SetMember: + case SetAdmin: + case SetOwner: + case CreateInstantRoom: + case CancelRoomCreation: + case DestroyRoom: + case StoreVoiceList: + case StoreBanList: + case StoreMemberList: + case StoreModeratorList: + case StoreAdminList: + m_roomConfigHandler->handleMUCConfigResult( this, true, (MUCOperation)context ); + break; + case RequestRoomConfig: + { + const MUCOwner* mo = iq.findExtension( ExtMUCOwner ); + if( !mo ) + break; + + if( mo->form() ) + m_roomConfigHandler->handleMUCConfigForm( this, *(mo->form()) ); + break; + } + case RequestVoiceList: + case RequestBanList: + case RequestMemberList: + case RequestModeratorList: + case RequestOwnerList: + case RequestAdminList: + { + const MUCAdmin* ma = iq.findExtension( ExtMUCAdmin ); + if( !ma ) + break; + + m_roomConfigHandler->handleMUCConfigList( this, ma->list(), (MUCOperation)context ); + break; + } + default: + break; + } + } + + void MUCRoom::handleIqError( const IQ& /*iq*/, int context ) + { + switch( context ) + { + case SetRNone: + case SetVisitor: + case SetParticipant: + case SetModerator: + case SetANone: + case SetOutcast: + case SetMember: + case SetAdmin: + case SetOwner: + case CreateInstantRoom: + case CancelRoomCreation: + case RequestRoomConfig: + case DestroyRoom: + case RequestVoiceList: + case StoreVoiceList: + case RequestBanList: + case StoreBanList: + case RequestMemberList: + case StoreMemberList: + case RequestModeratorList: + case StoreModeratorList: + case RequestOwnerList: + case StoreOwnerList: + case RequestAdminList: + case StoreAdminList: + m_roomConfigHandler->handleMUCConfigResult( this, false, (MUCOperation)context ); + break; + } + } + + void MUCRoom::handleDiscoInfo( const JID& /*from*/, const Disco::Info& info, int context ) + { + switch( context ) + { + case GetRoomInfo: + { + int oldflags = m_flags; + m_flags = 0; + if( oldflags & FlagPublicLogging ) + m_flags |= FlagPublicLogging; + + std::string name; + const StringList& l = info.features(); + StringList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it) == "muc_hidden" ) + m_flags |= FlagHidden; + else if( (*it) == "muc_membersonly" ) + m_flags |= FlagMembersOnly; + else if( (*it) == "muc_moderated" ) + m_flags |= FlagModerated; + else if( (*it) == "muc_nonanonymous" ) + setNonAnonymous(); + else if( (*it) == "muc_open" ) + m_flags |= FlagOpen; + else if( (*it) == "muc_passwordprotected" ) + m_flags |= FlagPasswordProtected; + else if( (*it) == "muc_persistent" ) + m_flags |= FlagPersistent; + else if( (*it) == "muc_public" ) + m_flags |= FlagPublic; + else if( (*it) == "muc_semianonymous" ) + setSemiAnonymous(); + else if( (*it) == "muc_temporary" ) + m_flags |= FlagTemporary; + else if( (*it) == "muc_fullyanonymous" ) + setFullyAnonymous(); + else if( (*it) == "muc_unmoderated" ) + m_flags |= FlagUnmoderated; + else if( (*it) == "muc_unsecured" ) + m_flags |= FlagUnsecured; + } + + const Disco::IdentityList& il = info.identities(); + if( il.size() ) + name = il.front()->name(); + + if( m_roomHandler ) + m_roomHandler->handleMUCInfo( this, m_flags, name, info.form() ); + break; + } + default: + break; + } + } + + void MUCRoom::handleDiscoItems( const JID& /*from*/, const Disco::Items& items, int context ) + { + if( !m_roomHandler ) + return; + + switch( context ) + { + case GetRoomItems: + { + m_roomHandler->handleMUCItems( this, items.items() ); + break; + } + default: + break; + } + } + + void MUCRoom::handleDiscoError( const JID& /*from*/, const Error* /*error*/, int context ) + { + if( !m_roomHandler ) + return; + + switch( context ) + { + case GetRoomInfo: + m_roomHandler->handleMUCInfo( this, 0, EmptyString, 0 ); + break; + case GetRoomItems: + m_roomHandler->handleMUCItems( this, Disco::ItemList() ); + break; + default: + break; + } + } + + StringList MUCRoom::handleDiscoNodeFeatures( const JID& /*from*/, const std::string& /*node*/ ) + { + return StringList(); + } + + Disco::IdentityList MUCRoom::handleDiscoNodeIdentities( const JID& /*from*/, + const std::string& /*node*/ ) + { + return Disco::IdentityList(); + } + + Disco::ItemList MUCRoom::handleDiscoNodeItems( const JID& /*from*/, const JID& /*to*/, + const std::string& node ) + { + Disco::ItemList l; + if( node == XMLNS_MUC_ROOMS && m_publish ) + { + l.push_back( new Disco::Item( m_nick.bareJID(), EmptyString, + m_publishNick ? m_nick.resource() : EmptyString ) ); + } + return l; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/mucroom.h b/smack/smack/src/main/cpp/gloox/src/mucroom.h new file mode 100644 index 00000000..be1c6e97 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucroom.h @@ -0,0 +1,972 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef MUCROOM_H__ +#define MUCROOM_H__ + +#include "discohandler.h" +#include "disconodehandler.h" +#include "dataform.h" +#include "presencehandler.h" +#include "iqhandler.h" +#include "messagehandler.h" +#include "mucroomhandler.h" +#include "mucroomconfighandler.h" +#include "jid.h" +#include "stanzaextension.h" + +#include + +namespace gloox { + +class ClientBase; +class MUCMessageSession; +class Message; + +/** + * @brief This is an implementation of @xep{0045} (Multi-User Chat). + * + * Usage is pretty simple: + * + * Derrive an object from MUCRoomHandler and implement its virtuals: + * @code + * class MyClass : public MUCRoomHandler + * { + * ... + * }; + * @endcode + * + * Then create a new MUCRoom object and pass it a valid ClientBase, the desired full room JID, + * your MUCRoomHandler-derived object, and an optional MUCRoomConfigHandler-derived object. + * @code + * void MyOtherClass::joinRoom( const std::string& room, const std::string& service, + * const std::string& nick ) + * { + * MyClass* myHandler = new MyClass(...); + * JID roomJID( room + "@" + service + "/" + nick ); + * m_room = new MUCRoom( m_clientbase, roomJID, myHandler, 0 ); + * m_room->join(); + * } + * @endcode + * + * When joining the room was successful, the various MUCRoomHandler functions will start to + * be called. If joining was not successful, MUCRoomHandler::handleMUCError() will be called, + * giving a hint at the reason for the failure. + * + * To set up your own room, or to configure an existing room, you should also derive a + * class from MUCRoomConfigHandler and register it with the MUCRoom (either by using it + * with MUCRoom's constructor, or by calling registerMUCRoomConfigHandler()). + * + * To quickly create an instant room, see InstantMUCRoom. + * + * To quickly create an instant room to turn a one-to-one chat into a multi-user chat, + * see UniqueMUCRoom. + * + * To send a private message to a room participant, use + * @link MessageSession gloox::MessageSession @endlink with the participant's full room JID + * (room\@service/nick). + * + * XEP version: 1.21 + * @author Jakob Schröter + * @since 0.9 + */ +class GLOOX_API MUCRoom : private DiscoHandler, private PresenceHandler, public IqHandler, private MessageHandler, private DiscoNodeHandler { + public: + /** + * Allowable history request types. To disable sending of history, use any value except + * HistoryUnknown and specify a zero-length time span (using setRequestHistory()). + */ + enum HistoryRequestType { + HistoryMaxChars, /**< Limit the total number of characters in the history to "X" + * (where the character count is the characters of the complete + * XML stanzas, not only their XML character data). */ + HistoryMaxStanzas, /**< Limit the total number of messages in the history to "X". */ + HistorySeconds, /**< Send only the messages received in the last "X" seconds. */ + HistorySince, /**< Send only the messages received since the datetime specified + * (which MUST conform to the DateTime profile specified in Jabber + * Date and Time Profiles (@xep{0082})). */ + HistoryUnknown /**< It is up to the service to decide how much history to send. + * This is the default. */ + }; + + /** + * Available operations. + */ + enum MUCUserOperation { + OpNone, /**< No operation. */ + OpInviteTo, /**< Invitation being sent to soemone. */ + OpInviteFrom, /**< Invitation received from someone. */ + OpDeclineTo, /**< Someone's invitation declined. */ + OpDeclineFrom /**< Someone declined an invitation. */ + }; + + /** + * @brief An abstraction of a MUC query. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 1.0 + */ + class MUC : public StanzaExtension { + public: + /** + * Creates a new MUC object. + * @param password An optional room password. + * @param historyType The type of room history to request. + * @param historySince A string describing the amount of room history. + * @param historyValue The amount of requested room history. + */ + MUC(const std::string &password, HistoryRequestType historyType = HistoryUnknown, + const std::string &historySince = EmptyString, int historyValue = 0); + + /** + * Constructs a new MUCUser object from the given Tag. + * @param tag The Tag to parse. + */ + MUC(const Tag *tag = 0); + + /** + * Virtual destructor. + */ + virtual ~MUC(); + + /** + * Returns a pointer to the current password, or 0. + * @return A pointer to the current password, or 0. + */ + const std::string *password() const { return m_password; } + + /** + * Returns a pointer to the description of the amount of room history requested. + * @return A pointer to the description of the amount of room history requested. + */ + const std::string *historySince() const { return m_historySince; } + + // reimplemented from StanzaExtension + virtual const std::string &filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension *newInstance(const Tag *tag) const { + return new MUC(tag); + } + + // reimplemented from StanzaExtension + virtual Tag *tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension *clone() const { + MUC *m = new MUC(); + m->m_password = m_password ? new std::string(*m_password) : 0; + m->m_historySince = m_historySince ? new std::string(*m_historySince) : 0; + m->m_historyType = m_historyType; + m->m_historyValue = m_historyValue; + return m; + } + + private: + std::string *m_password; + std::string *m_historySince; + HistoryRequestType m_historyType; + int m_historyValue; + }; + + /** + * @brief An abstraction of a MUC user query. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 1.0 + */ + class MUCUser : public StanzaExtension { + public: + /** + * Constructor. + * @param operation An operation to perform. + * @param to The recipient. + * @param reason The reason for the operation. + * @param thread If this is an invitation, and if the invitation is part of + * a transformation of a one-to-one chat to a MUC, include the one-to-one chat's + * thread ID here. Defaults to the empty string (i.e. not a continuation). + */ + MUCUser(MUCUserOperation operation, const std::string &to, const std::string &reason, + const std::string &thread = EmptyString); + + /** + * Constructs a new MUCUser object from the given Tag. + * @param tag The Tag to parse. + */ + MUCUser(const Tag *tag = 0); + + /** + * Virtual destructor. + */ + virtual ~MUCUser(); + + /** + * Returns the current room flags. + * @return The current room flags. + */ + int flags() const { return m_flags; } + + /** + * Returns the user's current room affiliation. + * @return The user's current room affiliation. + */ + MUCRoomAffiliation affiliation() const { return m_affiliation; } + + /** + * Returns the user's current room role. + * @return The user's current room role. + */ + MUCRoomRole role() const { return m_role; } + + /** + * + */ + const std::string *jid() const { return m_jid; } + + /** + * + */ + const std::string *actor() const { return m_actor; } + + /** + * + */ + const std::string *password() const { return m_password; } + + /** + * + */ + const std::string *thread() const { return m_thread; } + + /** + * + */ + const std::string *reason() const { return m_reason; } + + /** + * + */ + const std::string *newNick() const { return m_newNick; } + + /** + * Returns an alternate venue, if set. + * @return An alternate venue, if set. + */ + const std::string *alternate() const { return m_alternate; } + + /** + * Whether or not the 'continue' flag is set. + * @return Whether or not the 'continue' flag is set. + */ + bool continued() const { return m_continue; } + + /** + * Returns the current operation. + * @return The current operation. + */ + MUCUserOperation operation() const { return m_operation; } + + // reimplemented from StanzaExtension + virtual const std::string &filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension *newInstance(const Tag *tag) const { + return new MUCUser(tag); + } + + // reimplemented from StanzaExtension + virtual Tag *tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension *clone() const { + MUCUser *m = new MUCUser(); + m->m_affiliation = m_affiliation; + m->m_role = m_role; + m->m_jid = m_jid ? new std::string(*m_jid) : 0; + m->m_actor = m_actor ? new std::string(*m_actor) : 0; + m->m_thread = m_thread ? new std::string(*m_thread) : 0; + m->m_reason = m_reason ? new std::string(*m_reason) : 0; + m->m_newNick = m_newNick ? new std::string(*m_newNick) : 0; + m->m_password = m_password ? new std::string(*m_password) : 0; + m->m_alternate = m_alternate ? new std::string(*m_alternate) : 0; + m->m_operation = m_operation; + m->m_flags = m_flags; + m->m_del = m_del; + m->m_continue = m_continue; + return m; + } + + private: + static MUCRoomAffiliation getEnumAffiliation(const std::string &affiliation); + static MUCRoomRole getEnumRole(const std::string &role); + + MUCRoomAffiliation m_affiliation; + MUCRoomRole m_role; + std::string *m_jid; + std::string *m_actor; + std::string *m_thread; + std::string *m_reason; + std::string *m_newNick; + std::string *m_password; + std::string *m_alternate; + MUCUserOperation m_operation; + int m_flags; + bool m_del; + bool m_continue; + }; + + /** + * Creates a new abstraction of a Multi-User Chat room. The room is not joined automatically. + * Use join() to join the room, use leave() to leave it. + * @param parent The ClientBase object to use for the communication. + * @param nick The room's name and service plus the desired nickname in the form + * room\@service/nick. + * @param mrh The MUCRoomHandler that will listen to room events. May be 0 and may be specified + * later using registerMUCRoomHandler(). However, without one, MUC is no joy. + * @param mrch The MUCRoomConfigHandler that will listen to room config result. Defaults to 0 + * initially. However, at the latest you need one when you create a new room which is not an + * instant room. You can set a MUCRoomConfigHandler using registerMUCRoomConfigHandler(). + */ + MUCRoom(ClientBase *parent, const JID &nick, MUCRoomHandler *mrh, MUCRoomConfigHandler *mrch = 0); + + /** + * Virtual Destructor. + */ + virtual ~MUCRoom(); + + /** + * Use this function to set a password to use when joining a (password protected) + * room. + * @param password The password to use for this room. + * @note This function does not password-protect a room. + */ + void setPassword(const std::string &password) { m_password = password; } + + /** + * A convenience function that returns the room's name. + * @return The room's name. + */ + const std::string name() const { return m_nick.username(); } + + /** + * A convenience function that returns the name/address of the MUC service the room is running on + * (e.g., conference.jabber.org). + * @return The MUC service's name/address. + */ + const std::string service() const { return m_nick.server(); } + + /** + * A convenience function that returns the user's nickname in the room. + * @return The user's nickname. + */ + const std::string nick() const { return m_nick.resource(); } + + /** + * Join this room. + * @param type The presence to join with, defaults to Available. + * @param status The presence's optional status text. + * @param priority The presence's optional priority, defaults to 0. + * ClientBase will automatically include the default Presence extensions added using + * @link gloox::ClientBase::addPresenceExtension() ClientBase::addPresenceExtension() @endlink. + */ + virtual void join(Presence::PresenceType type = Presence::Available, + const std::string &status = EmptyString, + int priority = 0); + + /** + * Leave this room. + * @param msg An optional msg indicating the reason for leaving the room. Default: empty. + */ + void leave(const std::string &msg = EmptyString); + + /** + * Sends a chat message to the room. + * @param message The message to send. + */ + void send(const std::string &message); + + /** + * Sets the subject of the room to the given string. + * The MUC service may decline the request to set a new subject. You should + * not assume the subject was set successfully util it is acknowledged via the MUCRoomHandler. + * @param subject The new subject. + */ + void setSubject(const std::string &subject); + + /** + * Returns the user's current affiliation with this room. + * @return The user's current affiliation. + */ + MUCRoomAffiliation affiliation() const { return m_affiliation; } + + /** + * Returns the user's current role in this room. + * @return The user's current role. + */ + MUCRoomRole role() const { return m_role; } + + /** + * Use this function to change the user's nickname in the room. + * The MUC service may decline the request to set a new nickname. You should not assume + * the nick change was successful until it is acknowledged via the MUCRoomHandler. + * @param nick The user's new nickname. + */ + void setNick(const std::string &nick); + + /** + * Use this function to set the user's presence in this room. It is not possible to + * use Unavailable with this function. + * @param presence The user's new presence. + * @param msg An optional status message. Default: empty. + */ + void setPresence(Presence::PresenceType presence, const std::string &msg = EmptyString); + + /** + * Use this function to invite another user to this room. + * @param invitee The (bare) JID of the user to invite. + * @param reason The user-supplied reason for the invitation. + * @param thread If this invitation is part of a transformation of a + * one-to-one chat to a MUC, include the one-to-one chat's thread ID here. Defaults + * to the empty string (i.e. not a continuation). + */ + void invite(const JID &invitee, const std::string &reason, const std::string &thread = EmptyString); + + /** + * Use this function to request basic room info, possibly prior to joining it. + * Results are announced using the MUCRoomHandler. + */ + void getRoomInfo(); + + /** + * Use this function to request information about the current room occupants, + * possibly prior to joining it. The room ay be configured not to disclose such + * information. + * Results are announced using the MUCRoomHandler. + */ + void getRoomItems(); + + /** + * The MUC spec enables other entities to discover via Service Discovery which rooms + * an entity is in. By default, gloox does not publish such info for privacy reasons. + * This function can be used to enable publishing the info for @b this room. + * @param publish Whether to enable other entities to discover the user's presence in + * @b this room. + * @param publishNick Whether to publish the nickname used in the room. This parameter + * is ignored if @c publish is @b false. + */ + void setPublish(bool publish, bool publishNick); + + /** + * Use this function to register a (new) MUCRoomHandler with this room. There can be only one + * MUCRoomHandler per room at any one time. + * @param mrl The MUCRoomHandler to register. + */ + void registerMUCRoomHandler(MUCRoomHandler *mrl) { m_roomHandler = mrl; } + + /** + * Use this function to remove the registered MUCRoomHandler. + */ + void removeMUCRoomHandler() { m_roomHandler = 0; } + + /** + * Use this function to register a (new) MUCRoomConfigHandler with this room. There can + * be only one MUCRoomConfigHandler per room at any one time. + * @param mrch The MUCRoomConfigHandler to register. + */ + void registerMUCRoomConfigHandler(MUCRoomConfigHandler *mrch) { m_roomConfigHandler = mrch; } + + /** + * Use this function to remove the registered MUCRoomConfigHandler. + */ + void removeMUCRoomConfigHandler() { m_roomConfigHandler = 0; } + + /** + * Use this function to add history to a (newly created) room. The use case from the MUC spec + * is to add history to a room that was created in the process of a transformation of a + * one-to-one chat to a multi-user chat. + * @param message A reason for declining the invitation. + * @param from The JID of the original author of this part of the history. + * @param stamp The datetime of the original message in the format: 20061224T12:15:23Z + * @note You should not attempt to use this function before + * MUCRoomHandler::handleMUCParticipantPresence() was called for the first time. + */ + void addHistory(const std::string &message, const JID &from, const std::string &stamp); + + /** + * Use this function to request room history. Set @c value to zero to disable the room + * history request. You should not use HistorySince type with this function. + * History is sent only once after entering a room. You should use this function before joining. + * @param value Represents either the number of requested characters, the number of requested + * message stanzas, or the number seconds, depending on the value of @c type. + * @param type + * @note If this function is not used to request a specific amount of room history, it is up + * to the MUC service to decide how much history to send. + */ + void setRequestHistory(int value, HistoryRequestType type); + + /** + * Use this function to request room history since specific datetime. + * History is sent only once after entering a room. You should use this function before joining. + * @param since A string representing a datetime conforming to the DateTime profile specified + * in Jabber Date and Time Profiles (@xep{0082}). + * @note If this function is not used to request a specific amount of room history, it is up + * to the MUC service to decide how much history to send. + */ + void setRequestHistory(const std::string &since); + + /** + * This static function allows to formally decline a MUC + * invitation received via the MUCInvitationListener. + * @param room The JID of the room the invitation came from. + * @param invitor The JID of the invitor. + * @param reason An optional reason for the decline. + * @return A pointer to a Message. You will have to send (and + * possibly delete) this Message manually. + */ + static Message *declineInvitation(const JID &room, const JID &invitor, + const std::string &reason = EmptyString); + + /** + * It is not possible for a visitor to speak in a moderated room. Use this function to request + * voice from the moderator. + */ + void requestVoice(); + + /** + * Use this function to kick a user from the room. + * Depending on service and/or room configuration and role/affiliation + * this may not always succeed. Usually, a role of 'moderator' is necessary. + * @note This is a convenience function. It directly uses setRole() with a MUCRoomRole of RoleNone. + * @param nick The nick of the user to be kicked. + * @param reason An optional reason for the kick. + */ + void kick(const std::string &nick, const std::string &reason = EmptyString) { setRole(nick, RoleNone, reason); } + + /** + * Use this function to ban a user from the room. + * Depending on service and/or room configuration and role/affiliation + * this may not always succeed. Usually, an affiliation of admin is necessary. + * @note This is a convenience function. It directly uses setAffiliation() with a MUCRoomAffiliation + * of RoleOutcast. + * @param nick The nick of the user to be banned. + * @param reason An optional reason for the ban. + */ + void ban(const std::string &nick, const std::string &reason) { setAffiliation(nick, AffiliationOutcast, reason); } + void bans(const std::string &nicks, const std::string &reason) { setAffiliations(nicks, AffiliationOutcast, reason); } + + /** + * Use this function to grant voice to a user in a moderated room. + * Depending on service and/or room configuration and role/affiliation + * this may not always succeed. Usually, a role of 'moderator' is necessary. + * @note This is a convenience function. It directly uses setRole() with a MUCRoomRole + * of RoleParticipant. + * @param nick The nick of the user to be granted voice. + * @param reason An optional reason for the grant. + */ + void grantVoice(const std::string &nick, const std::string &reason) { setRole(nick, RoleParticipant, reason); } + + /** + * Use this function to create a Tag that approves a voice request or registration request + * delivered via MUCRoomConfigHandler::handleMUCVoiceRequest(). You will need to send this + * Tag off manually using Client/ClientBase. + * @param room The room's JID. This is needed because you can use this function outside of + * room context (e.g, if the admin is not in the room). + * @param df The filled-in DataForm from the voice/registration request. The form object + * will be owned by the returned Message. + */ + static Message *createDataForm(const JID &room, const DataForm *df); + + /** + * Use this function to revoke voice from a user in a moderated room. + * Depending on service and/or room configuration and role/affiliation + * this may not always succeed. Usually, a role of 'moderator' is necessary. + * @note This is a convenience function. It directly uses setRole() with a MUCRoomRole + * of RoleVisitor. + * @param nick The nick of the user. + * @param reason An optional reason for the revoke. + */ + void revokeVoice(const std::string &nick, const std::string &reason) { setRole(nick, RoleVisitor, reason); } + + /** + * Use this function to change the role of a user in the room. + * Usually, at least moderator privileges are required to succeed. + * @param nick The nick of the user who's role shall be modfified. + * @param role The user's new role in the room. + * @param reason An optional reason for the role change. + */ + void setRole(const std::string &nick, MUCRoomRole role, const std::string &reason = EmptyString); + void setRoles( const std::string& nicks, MUCRoomRole role, const std::string& reason = EmptyString ); + /** + * Use this function to change the affiliation of a user in the room. + * Usually, at least admin privileges are required to succeed. + * @param nick The nick of the user who's affiliation shall be modfified. + * @param affiliation The user's new affiliation in the room. + * @param reason An optional reason for the affiliation change. + */ + void setAffiliation(const std::string &nick, MUCRoomAffiliation affiliation, + const std::string &reason); + + void setAffiliations(const std::string &nicks, MUCRoomAffiliation affiliation, + const std::string &reason); + + /** + * Use this function to request the room's configuration form. + * It can be used either after MUCRoomHandler::handleMUCRoomCreation() was called, + * or at any later time. + * + * Usually owner privileges are required for this action to + * succeed. + * + * Use setRoomConfig() to send the modified room config back. + */ + void requestRoomConfig(); + + /** + * After requesting (using requestRoomConfig()) and + * editing/filling in the room's configuration, + * use this function to send it back to the server. + * @param form The form to send. The function will delete the + * object pointed to. + */ + void setRoomConfig(DataForm *form); + std::string isJoined(); + /** + * Use this function to accept the room's default configuration. This function is useful + * only after MUCRoomHandler::handleMUCRoomCreation() was called. This is a NOOP at + * any other time. + */ + void acknowledgeInstantRoom() { instantRoom(CreateInstantRoom); } + + /** + * Use this function to cancel the creation of a room. This function is useful only after + * MUCRoomHandler::handleMUCRoomCreation() was called. This is a NOOP at any other time. + */ + void cancelRoomCreation() { instantRoom(CancelRoomCreation); } + + /** + * Use this function to destroy the room. All the occupants will be removed from the room. + * @param reason An optional reason for the destruction. + * @param alternate A pointer to a JID of an alternate venue (e.g., another MUC room). + * May be 0. + * @param password An optional password for the alternate venue. + * + * Usually owner privileges are required for this action to succeed. + */ + void destroy(const std::string &reason = EmptyString, + const JID &alternate = JID(), const std::string &password = EmptyString); + + /** + * Use this function to request a particluar list of room occupants. + * @note There must be a MUCRoomConfigHandler registered with this room for this + * function to be executed. + * @param operation The following types of lists are available: + * @li Voice List: List of people having voice in a moderated room. Use RequestVoiceList. + * @li Members List: List of members of a room. Use RequestMemberList. + * @li Ban List: List of people banned from the room. Use RequestBanList. + * @li Moderator List: List of room moderators. Use RequestModeratorList. + * @li Admin List: List of room admins. Use RequestAdminList. + * @li Owner List: List of room owners. Use RequestOwnerList. + * Any other value of @c operation will be ignored. + */ + void requestList(MUCOperation operation); + + /** + * Use this function to store a (modified) list for the room. + * @param items The list of items. Example:
    + * You want to set the Voice List. The privilege of Voice refers to the role of Participant. + * Furthermore, you only store the delta of the original (Voice)List. (Optionally, you could + * probably store the whole list, however, remeber to include those items that were modified, + * too.) + * You want to, say, add one occupant to the Voice List, and remove another one. + * Therefore you store: + * @li GuyOne, role participant -- this guy gets voice granted, he/she is now a participant. + * @li GuyTwo, role visitor -- this guy gets voice revoked, he/she is now a mere visitor + * (Visitor is the Role "below" Participant in the privileges hierarchy). + * + * For operations modifying Roles, you should specifiy only the new Role in the MUCListItem + * structure, for those modifying Affiliations, you should only specify the new Affiliation, + * respectively. The nickname is mandatory in the MUCListItem structure. Items without nickname + * will be ignored. + * + * You may specify a reason for the role/affiliation change in the MUCListItem structure. + * You should not specify a JID in the MUCListItem structure, it will be ignored. + * + * @param operation See requestList() for a list of available list types. Any other value will + * be ignored. + */ + void storeList(const MUCListItemList items, MUCOperation operation); + + /** + * Returns the currently known room flags. + * @return ORed MUCRoomFlag's describing the current room configuration. + */ + int flags() const { return m_flags; } + + // reimplemented from DiscoHandler + virtual void handleDiscoInfo(const JID &from, const Disco::Info &info, int context); + + // reimplemented from DiscoHandler + // reimplemented from DiscoHandler + virtual void handleDiscoItems(const JID &from, const Disco::Items &items, int context); + + // reimplemented from DiscoHandler + virtual void handleDiscoError(const JID &from, const Error *error, int context); + + // reimplemented from PresenceHandler + virtual void handlePresence(const Presence &presence); + + // reimplemented from MessageHandler + virtual void handleMessage(const Message &msg, MessageSession *session = 0); + + // reimplemented from IqHandler + virtual bool handleIq(const IQ &iq) { + (void)iq; + return false; + } + + // reimplemented from IqHandler + virtual void handleIqID(const IQ &iq, int context); + + // reimplemented from DiscoNodeHandler + virtual StringList handleDiscoNodeFeatures(const JID &from, const std::string &node); + + // reimplemented from DiscoNodeHandler + virtual Disco::IdentityList handleDiscoNodeIdentities(const JID &from, + const std::string &node); + + // reimplemented from DiscoNodeHandler + virtual Disco::ItemList handleDiscoNodeItems(const JID &from, const JID &to, + const std::string &node = EmptyString); + + protected: + /** + * Sets the room's name. + * @param name The room's name. + */ + void setName(const std::string &name) { m_nick.setUsername(name); } + + /** + * Acknowledges instant room creation w/o a call to the MUCRoomConfigHandler. + * @return Whether an instant room is being created. + */ + virtual bool instantRoomHook() const { return false; } + + ClientBase *m_parent; + JID m_nick; + + bool m_joined; + + private: +#ifdef MUCROOM_TEST + public: +#endif + /** + * @brief An abstraction of a MUC owner query. + * + * @author Jakob Schröter + * @since 1.0 + */ + class MUCOwner : public StanzaExtension { + public: + /** + * Describes available query types for the muc#owner namespace. + */ + enum QueryType { + TypeCreate, /**< Create a room. */ + TypeRequestConfig, /**< Request room config. */ + TypeSendConfig, /**< Submit configuration form to MUC service. */ + TypeCancelConfig, /**< Cancel room configuration. */ + TypeInstantRoom, /**< Request an instant room */ + TypeDestroy, /**< Destroy the room. */ + TypeIncomingTag /**< The Query has been created from an incoming Tag. */ + }; + + /** + * Creates a new MUCOwner object for the given query, possibly including + * the given DataForm. + * @param type The intended query type. + * @param form An optional pointer to a DataForm. Necessity depends on the query type. + */ + MUCOwner(QueryType type, DataForm *form = 0); + + /** + * Creates a new query that destroys the current room. + * @param alternate An optional alternate discussion venue. + * @param reason An optional reason for the room destruction. + * @param password An optional password for the new room. + */ + MUCOwner(const JID &alternate = JID(), const std::string &reason = EmptyString, + const std::string &password = EmptyString); + + /** + * Creates a new MUCOwner object from the given Tag. + * @param tag A Tag to parse. + */ + MUCOwner(const Tag *tag); + + /** + * Virtual destructor. + */ + virtual ~MUCOwner(); + + /** + * Returns a pointer to a DataForm, included in the MUCOwner object. May be 0. + * @return A pointer to a configuration form. + */ + const DataForm *form() const { return m_form; } + + // reimplemented from StanzaExtension + const std::string &filterString() const; + + // reimplemented from StanzaExtension + StanzaExtension *newInstance(const Tag *tag) const { + return new MUCOwner(tag); + } + + // reimplemented from StanzaExtension + Tag *tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension *clone() const { + MUCOwner *m = new MUCOwner(); + m->m_type = m_type; + m->m_jid = m_jid; + m->m_reason = m_reason; + m->m_pwd = m_pwd; + m->m_form = m_form ? new DataForm(*m_form) : 0; + return m; + } + + private: + QueryType m_type; + JID m_jid; + std::string m_reason; + std::string m_pwd; + DataForm *m_form; + }; + + /** + * @brief An abstraction of a MUC admin query. + * + * @author Jakob Schröter + * @since 1.0 + */ + class MUCAdmin : public StanzaExtension { + public: + /** + * Creates a new object that can be used to change the role of a room participant. + * @param role The participant's new role. + * @param nick The participant's nick. + * @param reason An optional reason for the role change. + */ + MUCAdmin(MUCRoomRole role, const std::string &nick, + const std::string &reason = EmptyString); + + /** + * Creates a new object that can be used to change the affiliation of a room participant. + * @param affiliation The participant's new affiliation. + * @param nick The participant's nick. + * @param reason An optional reason for the role change. + */ + MUCAdmin(MUCRoomAffiliation affiliation, const std::string &nick, + const std::string &reason = EmptyString); + + /** + * Creates a new object that can be used to request or store a role/affiliation + * list. + * @param operation The MUCOperation to carry out. Only the Request* and Store* + * operations are valid. Any other value will be ignored. + * @param jids A list of bare JIDs. Only the JID member of the MUCListItem + * structure should be set. The type of the list will be determined from the + * @c operation parameter. + */ + MUCAdmin(MUCOperation operation, const MUCListItemList &jids = MUCListItemList()); + + /** + * Constructs a new MUCAdmin object from the given Tag. + * @param tag The Tag to parse. + */ + MUCAdmin(const Tag *tag = 0); + + /** + * Virtual destructor. + */ + virtual ~MUCAdmin(); + + /** + * Returns the contained list of MUC items. + * @return The contained list of MUC items. + */ + const MUCListItemList &list() const { return m_list; } + + // reimplemented from StanzaExtension + const std::string &filterString() const; + + // reimplemented from StanzaExtension + StanzaExtension *newInstance(const Tag *tag) const { + return new MUCAdmin(tag); + } + + // reimplemented from StanzaExtension + Tag *tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension *clone() const { + return new MUCAdmin(*this); + } + + private: + MUCListItemList m_list; + MUCRoomAffiliation m_affiliation; + MUCRoomRole m_role; + }; + + void handleIqResult(const IQ &iq, int context); + void handleIqError(const IQ &iq, int context); + void setNonAnonymous(); + void setSemiAnonymous(); + void setFullyAnonymous(); + void acknowledgeRoomCreation(); + void instantRoom(int context); + + MUCRoomHandler *m_roomHandler; + MUCRoomConfigHandler *m_roomConfigHandler; + MUCMessageSession *m_session; + + typedef std::list ParticipantList; + ParticipantList m_participants; + + std::string m_password; + std::string m_newNick; + + MUCRoomAffiliation m_affiliation; + MUCRoomRole m_role; + + HistoryRequestType m_historyType; + + std::string m_historySince; + int m_historyValue; + int m_flags; + bool m_creationInProgress; + bool m_configChanged; + bool m_publishNick; + bool m_publish; + bool m_unique; +}; + +} // namespace gloox + +#endif // MUCROOM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/mucroomconfighandler.h b/smack/smack/src/main/cpp/gloox/src/mucroomconfighandler.h new file mode 100644 index 00000000..3a79cd01 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucroomconfighandler.h @@ -0,0 +1,226 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef MUCROOMCONFIGHANDLER_H__ +#define MUCROOMCONFIGHANDLER_H__ + +#include "gloox.h" +#include "jid.h" + +#include +#include + +namespace gloox +{ + + class MUCRoom; + class DataForm; + + /** + * An item in a list of MUC room users. Lists of these items are + * used when manipulating the lists of members, admins, owners, etc. + * of a room. + * + * @author Jakob Schröter + * @since 1.0 + */ + class MUCListItem + { + public: + /** + * Constructs a new object using the given JID. + * @param jid The item's JID. + */ + MUCListItem( const JID& jid ) + : m_jid( jid ), m_affiliation( AffiliationInvalid ), m_role( RoleInvalid ) + {} + + /** + * Creates a new object, setting JID, affiliation, role, and nick. + * @param jid The item's JID. + * @param role The item's role. + * @param affiliation The item's affiliation. + * @param nick The item's nick. + */ + MUCListItem( const JID& jid, MUCRoomRole role, MUCRoomAffiliation affiliation, + const std::string& nick ) + : m_jid( jid ), m_nick( nick ), m_affiliation( affiliation ), m_role( role ) + {} + + /** + * Creates a new object, using nick, affiliation and a reason. + * @param nick The item's nick. + * @param affiliation The item's affiliation. + * @param reason A reason. + */ + MUCListItem( const std::string& nick, MUCRoomAffiliation affiliation, const std::string& reason ) + : m_nick( nick ), m_affiliation( affiliation ), m_role( RoleInvalid ), + m_reason( reason ) + {} + + /** + * Creates a new object, using nick, role and a reason. + * @param nick The item's nick. + * @param role The item's role. + * @param reason A reason. + */ + MUCListItem( const std::string& nick, MUCRoomRole role, const std::string& reason ) + : m_nick( nick ), m_affiliation( AffiliationInvalid ), m_role( role ), + m_reason( reason ) + {} + + /** + * Destructor. Deletes the @c jid member. + */ + ~MUCListItem() {} + + /** + * Returns the item's JID. + * @return The item's JID. + */ + const JID& jid() const { return m_jid; } + + /** + * Returns the item's nick. + * @return The item's nick. + */ + const std::string& nick() const { return m_nick; } + + /** + * Returns the item's affiliation. + * @return The item's affiliation. + */ + MUCRoomAffiliation affiliation() const { return m_affiliation; } + + /** + * Returns the item's role. + * @return The item's role. + */ + MUCRoomRole role() const { return m_role; } + + /** + * Returns the reason. + * @return The reason. + */ + const std::string& reason() const { return m_reason; } + + private: + JID m_jid; /**< Pointer to the occupant's JID if available, 0 otherwise. */ + std::string m_nick; /**< The occupant's nick in the room. */ + MUCRoomAffiliation m_affiliation; /**< The occupant's affiliation. */ + MUCRoomRole m_role; /**< The occupant's role. */ + std::string m_reason; /**< Use this only when **setting** the item's role/affiliation to + * specify a reason for the role/affiliation change. This field is + * empty in items fetched from the MUC service. */ + }; + + /** + * A list of MUCListItems. + */ + typedef std::list MUCListItemList; + + /** + * Available operations on a room. + */ + enum MUCOperation + { + RequestUniqueName, /**< Request a unique room name. */ + CreateInstantRoom, /**< Create an instant room. */ + CancelRoomCreation, /**< Cancel room creation process. */ + RequestRoomConfig, /**< Request room configuration form. */ + SendRoomConfig, /**< Send room configuration */ + DestroyRoom, /**< Destroy room. */ + GetRoomInfo, /**< Fetch room info. */ + GetRoomItems, /**< Fetch room items (e.g., current occupants). */ + SetRNone, /**< Set a user's role to None. */ + SetVisitor, /**< Set a user's role to Visitor. */ + SetParticipant, /**< Set a user's role to Participant. */ + SetModerator, /**< Set a user's role to Moderator. */ + SetANone, /**< Set a user's affiliation to None. */ + SetOutcast, /**< Set a user's affiliation to Outcast. */ + SetMember, /**< Set a user's affiliation to Member. */ + SetAdmin, /**< Set a user's affiliation to Admin. */ + SetOwner, /**< Set a user's affiliation to Owner. */ + RequestVoiceList, /**< Request the room's Voice List. */ + StoreVoiceList, /**< Store the room's Voice List. */ + RequestBanList, /**< Request the room's Ban List. */ + StoreBanList, /**< Store the room's Ban List. */ + RequestMemberList, /**< Request the room's Member List. */ + StoreMemberList, /**< Store the room's Member List. */ + RequestModeratorList, /**< Request the room's Moderator List. */ + StoreModeratorList, /**< Store the room's Moderator List. */ + RequestOwnerList, /**< Request the room's Owner List. */ + StoreOwnerList, /**< Store the room's Owner List. */ + RequestAdminList, /**< Request the room's Admin List. */ + StoreAdminList, /**< Store the room's Admin List. */ + InvalidOperation /**< Invalid operation. */ + }; + + /** + * @brief An abstract interface that can be implemented for MUC room configuration. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API MUCRoomConfigHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~MUCRoomConfigHandler() {} + + /** + * This function is called in response to MUCRoom::requestList() if the list was + * fetched successfully. + * @param room The room for which the list arrived. + * @param items The requestd list's items. + * @param operation The type of the list. + */ + virtual void handleMUCConfigList( MUCRoom* room, const MUCListItemList& items, + MUCOperation operation ) = 0; + + /** + * This function is called when the room's configuration form arrives. This usually happens + * after a call to MUCRoom::requestRoomConfig(). Use + * MUCRoom::setRoomConfig() to send the configuration back to the + * room. + * @param room The room for which the config form arrived. + * @param form The configuration form. + */ + virtual void handleMUCConfigForm( MUCRoom* room, const DataForm& form ) = 0; + + /** + * This function is called in response to MUCRoom::kick(), MUCRoom::storeList(), + * MUCRoom::ban(), and others, to indcate the end of the operation. + * @param room The room for which the operation ended. + * @param success Whether or not the operation was successful. + * @param operation The finished operation. + */ + virtual void handleMUCConfigResult( MUCRoom* room, bool success, MUCOperation operation ) = 0; + + /** + * This function is called when a Voice request or a Registration request arrive through + * the room that need to be approved/rejected by the room admin. Use MUCRoom::createDataForm() + * to have a Tag created that answers the request. + * @param room The room the request arrived from. + * @param form A DataForm containing the request. + */ + virtual void handleMUCRequest( MUCRoom* room, const DataForm& form ) = 0; + + }; + +} + +#endif // MUCROOMCONFIGHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/mucroomhandler.h b/smack/smack/src/main/cpp/gloox/src/mucroomhandler.h new file mode 100644 index 00000000..594be700 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mucroomhandler.h @@ -0,0 +1,216 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef MUCROOMHANDLER_H__ +#define MUCROOMHANDLER_H__ + +#include "gloox.h" +#include "presence.h" +#include "disco.h" + +#include + +namespace gloox +{ + + class JID; + class MUCRoom; + class Message; + class DataForm; + + /** + * Describes a participant in a MUC room. + */ + struct MUCRoomParticipant + { + JID* nick; /**< Pointer to a JID holding the participant's full JID + * in the form @c room\@service/nick.
    + * @note The MUC server @b may change the chosen nickname. + * If the @b self member of this struct is true, one should + * check the resource of this member if the actual nickname + * is important. */ + MUCRoomAffiliation affiliation; /**< The participant's affiliation with the room. */ + MUCRoomRole role; /**< The participant's role with the room. */ + JID* jid; /**< Pointer to the occupant's full JID in a non-anonymous room or + * in a semi-anonymous room if the user (of gloox) has a role of + * moderator. + * 0 if the MUC service doesn't provide the JID. */ + int flags; /**< ORed MUCUserFlag values. Indicate conditions like: user has + * been kicked or banned from the room. Also may indicate that + * this struct refers to this instance's user. + * (MUC servers send presence to all room occupants, including + * the originator of the presence.) */ + std::string reason; /**< If the presence change is the result of an action where the + * actor can provide a reason for the action, this reason is stored + * here. Examples: Kicking, banning, leaving the room. */ + JID* actor; /**< If the presence change is the result of an action of a room + * member, a pointer to the actor's JID is stored here, if the + * actor chose to disclose his or her identity. Examples: Kicking + * and banning. + * 0 if the identity is not disclosed. */ + std::string newNick; /**< In case of a nickname change, this holds the new nick, while the + * nick member holds the old room nick (in JID form). @c newNick is only + * set if @c flags contains @b UserNickChanged. If @c flags contains + * @b UserSelf as well, a foregoing nick change request (using + * MUCRoom::setNick()) can be considered acknowledged. In any case + * the user's presence sent with the nick change acknowledgement + * is of type @c unavailable. Another presence of type @c available + * (or whatever the user's presence was at the time of the nick change + * request) will follow (not necessarily immediately) coming from the + * user's new nickname. Empty if there is no nick change in progress. */ + std::string status; /**< If the presence packet contained a status message, it is stored + * here. */ + JID* alternate; /**< If @c flags contains UserRoomDestroyed, and if the user who + * destroyed the room specified an alternate room, this member holds + * a pointer to the alternate room's JID, else it is 0. */ + }; + + /** + * @brief This interface enables inheriting classes to be notified about certain events in a MUC room. + * + * See MUCRoom for examples how to use this interface. + * + * @note This interface does not notify about room configuration related events. Use + * MUCRoomConfigHandler for that puprose. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API MUCRoomHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~MUCRoomHandler() {} + + /** + * This function is called whenever a room occupant enters the room, changes presence + * inside the room, or leaves the room. + * @note The MUCRoomParticipant struct, including pointers to JIDs, will be cleaned up after + * this function returned. + * @param room The room. + * @param participant A struct describing the occupant's status and/or action. + * @param presence The occupant's full presence. + */ + virtual void handleMUCParticipantPresence( MUCRoom* room, const MUCRoomParticipant participant, + const Presence& presence ) = 0; + + /** + * This function is called when a message arrives through the room. + * @note This may be a private message! If the message is private, and you want to answer + * it privately, you should create a new MessageSession to the user's full room nick and use + * that for any further private communication with the user. + * @param room The room the message came from. + * @param msg The entire Message. + * @param priv Indicates whether this is a private message. + * @note The sender's nick name can be obtained with this call: + * @code + * const std::string nick = msg.from().resource(); + * @endcode + * @note The message may contain an extension of type DelayedDelivery describing the + * date/time when the message was originally sent. The presence of such an extension + * usually indicates that the message is sent as part of the room history. This extension + * can be obtained with this call: + * @code + * const DelayedDelivery* dd = msg.when(); // may be 0 if no such extension exists + * @endcode + */ + virtual void handleMUCMessage( MUCRoom* room, const Message& msg, bool priv ) = 0; + + /** + * This function is called if the room that was just joined didn't exist prior to the attempted + * join. Therfore the room was created by MUC service. To accept the default configuration of + * the room assigned by the MUC service, return @b true from this function. The room will be opened + * by the MUC service and available for other users to join. If you don't want to accept the default + * room configuration, return @b false from this function. The room will stay locked until it is + * either fully configured, created as an instant room, or creation is canceled. + * + * If you returned false from this function you should use one of the following options: + * @li use MUCRoom::cancelRoomCreation() to abort creation and delete the room, + * @li use MUCRoom::acknowledgeInstantRoom() to accept the room's default configuration, or + * @li use MUCRoom::requestRoomConfig() to request the room's configuration form. + * + * @param room The room. + * @return @b True to accept the default room configuration, @b false to keep the room locked + * until configured manually by the room owner. + */ + virtual bool handleMUCRoomCreation( MUCRoom* room ) = 0; + + /** + * This function is called when the room subject has been changed. + * @param room The room. + * @param nick The nick of the occupant that changed the room subject. + * @note With some MUC services the nick may be empty when a room is first entered. + * @param subject The new room subject. + */ + virtual void handleMUCSubject( MUCRoom* room, const std::string& nick, + const std::string& subject ) = 0; + + /** + * This function is called when the user invited somebody (e.g., by using MUCRoom::invite()) + * to the room, but the invitation was declined by that person. + * @param room The room. + * @param invitee The JID if the person that declined the invitation. + * @param reason An optional reason for declining the invitation. + */ + virtual void handleMUCInviteDecline( MUCRoom* room, const JID& invitee, + const std::string& reason ) = 0; + + /** + * This function is called when an error occurs in the room or when entering the room. + * @note The following error conditions are specified for MUC: + * @li @b Not @b Authorized: Password required. + * @li @b Forbidden: Access denied, user is banned. + * @li @b Item @b Not @b Found: The room does not exist. + * @li @b Not @b Allowed: Room creation is restricted. + * @li @b Not @b Acceptable: Room nicks are locked down. + * @li @b Registration @b Required: User is not on the member list. + * @li @b Conflict: Desired room nickname is in use or registered by another user. + * @li @b Service @b Unavailable: Maximum number of users has been reached. + * + * Other errors might appear, depending on the service implementation. + * @param room The room. + * @param error The error. + */ + virtual void handleMUCError( MUCRoom* room, StanzaError error ) = 0; + + /** + * This function usually (see below) is called in response to a call to MUCRoom::getRoomInfo(). + * @param room The room. + * @param features ORed MUCRoomFlag's. + * @param name The room's name as returned by Service Discovery. + * @param infoForm A DataForm containing extended room information. May be 0 if the service + * doesn't support extended room information. See Section 15.5 of @xep{0045} for defined + * field types. You should not delete the form. + * + * @note This function may be called without a prior call to MUCRoom::getRoomInfo(). This + * happens if the room config is changed, e.g. by a room admin. + */ + virtual void handleMUCInfo( MUCRoom* room, int features, const std::string& name, + const DataForm* infoForm ) = 0; + + /** + * This function is called in response to a call to MUCRoom::getRoomItems(). + * @param room The room. + * @param items A map of room participants. The key is the name, the value is the occupant's + * room JID. The map may be empty if such info is private. + */ + virtual void handleMUCItems( MUCRoom* room, const Disco::ItemList& items ) = 0; + + }; + +} + +#endif// MUCROOMHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/mutex.cpp b/smack/smack/src/main/cpp/gloox/src/mutex.cpp new file mode 100644 index 00000000..1cf222d6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mutex.cpp @@ -0,0 +1,138 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "mutex.h" + +#include "config.h" + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) +# include +#endif + +#ifdef _WIN32_WCE +# include +#endif + +#ifdef HAVE_PTHREAD +# include +#endif + +namespace gloox +{ + + namespace util + { + + class Mutex::MutexImpl + { + public: + MutexImpl(); + ~MutexImpl(); + void lock(); + bool trylock(); + void unlock(); + private: + MutexImpl( const MutexImpl& ); + MutexImpl& operator=( const MutexImpl& ); + +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + CRITICAL_SECTION m_cs; +#elif defined( HAVE_PTHREAD ) + pthread_mutex_t m_mutex; +#endif + + }; + + Mutex::MutexImpl::MutexImpl() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + // NOTE: Critical sections by nature allow "recursive" + // (the same thread can get it again, and just bump the ref count). + InitializeCriticalSection( &m_cs ); +#elif defined( HAVE_PTHREAD ) + // For pthreads, configured the mutex to be recursive + // (the same thread can get it again, and just bump the ref count). + pthread_mutexattr_t mutexAttribute; + pthread_mutexattr_init( &mutexAttribute ); + pthread_mutexattr_settype( &mutexAttribute, PTHREAD_MUTEX_RECURSIVE ); + pthread_mutex_init( &m_mutex, &mutexAttribute ); + pthread_mutexattr_destroy( &mutexAttribute ); +#endif + } + + Mutex::MutexImpl::~MutexImpl() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + DeleteCriticalSection( &m_cs ); +#elif defined( HAVE_PTHREAD ) + pthread_mutex_destroy( &m_mutex ); +#endif + } + + void Mutex::MutexImpl::lock() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + EnterCriticalSection( &m_cs ); +#elif defined( HAVE_PTHREAD ) + pthread_mutex_lock( &m_mutex ); +#endif + } + + bool Mutex::MutexImpl::trylock() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + return TryEnterCriticalSection( &m_cs ) ? true : false; +#elif defined( HAVE_PTHREAD ) + return !( pthread_mutex_trylock( &m_mutex ) ); +#else + return true; +#endif + } + + void Mutex::MutexImpl::unlock() + { +#if defined( _WIN32 ) && !defined( __SYMBIAN32__ ) + LeaveCriticalSection( &m_cs ); +#elif defined( HAVE_PTHREAD ) + pthread_mutex_unlock( &m_mutex ); +#endif + } + + Mutex::Mutex() + : m_mutex( new MutexImpl() ) + { + } + + Mutex::~Mutex() + { + delete m_mutex; + } + + void Mutex::lock() + { + m_mutex->lock(); + } + + bool Mutex::trylock() + { + return m_mutex->trylock(); + } + + void Mutex::unlock() + { + m_mutex->unlock(); + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/mutex.h b/smack/smack/src/main/cpp/gloox/src/mutex.h new file mode 100644 index 00000000..e8b38ee3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mutex.h @@ -0,0 +1,77 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MUTEX_H__ +#define MUTEX_H__ + +#include "macros.h" + +namespace gloox +{ + + namespace util + { + /** + * @brief A simple implementation of mutex as a wrapper around a pthread mutex + * or a win32 critical section. + * + * If you locked a mutex you MUST unlock it within the same thread. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API Mutex + { + public: + /** + * Contructs a new simple mutex. + */ + Mutex(); + + /** + * Destructor + */ + ~Mutex(); + + /** + * Locks the mutex. + */ + void lock(); + + /** + * Tries to lock the mutex. + * @return @b True if the attempt was successful, @b false otherwise. + * @note This function also returns @b true if mutex support is not available, ie. if gloox + * is compiled without pthreads on non-Windows platforms. Make sure threads/mutexes are available + * if your code relies on trylock(). + */ + bool trylock(); + + /** + * Releases the mutex. + */ + void unlock(); + + private: + class MutexImpl; + + Mutex& operator=( const Mutex& ); + MutexImpl* m_mutex; + + }; + + } + +} + +#endif // MUTEX_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/mutexguard.h b/smack/smack/src/main/cpp/gloox/src/mutexguard.h new file mode 100644 index 00000000..12d3dd9c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/mutexguard.h @@ -0,0 +1,61 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef MUTEXGUARD_H__ +#define MUTEXGUARD_H__ + +#include "mutex.h" + +namespace gloox +{ + + namespace util + { + + /** + * @brief A simple implementation of a mutex guard. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API MutexGuard + { + public: + /** + * Contructs a new simple mutex guard and locks the supplied Mutex. + * @param mutex The Mutex to guard. + */ + MutexGuard( Mutex* mutex ) : m_mutex( *mutex ) { if( mutex ) m_mutex.lock(); } + + /** + * Contructs a new simple mutex guard and locks the supplied Mutex. + * @param mutex The Mutex to guard. + */ + MutexGuard( Mutex& mutex ) : m_mutex( mutex ) { m_mutex.lock(); } + + /** + * Destructor. Releases the guarded Mutex. + */ + ~MutexGuard() { m_mutex.unlock(); } + + private: + MutexGuard& operator=( const MutexGuard& ); + Mutex& m_mutex; + + }; + + } + +} + +#endif // MUTEXGUARD_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/nickname.cpp b/smack/smack/src/main/cpp/gloox/src/nickname.cpp new file mode 100644 index 00000000..3206a661 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/nickname.cpp @@ -0,0 +1,44 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "nickname.h" +#include "tag.h" + +namespace gloox +{ + + Nickname::Nickname( const Tag* tag ) + : StanzaExtension( ExtNickname ) + { + if( tag ) + m_nick = tag->cdata(); + } + + const std::string& Nickname::filterString() const + { + static const std::string filter = + "/presence/nick[@xmlns='" + XMLNS_NICKNAME + "']" + "|/message/nick[@xmlns='" + XMLNS_NICKNAME + "']"; + return filter; + } + + Tag* Nickname::tag() const + { + if( m_nick.empty() ) + return 0; + + Tag* n = new Tag( "nick", XMLNS, XMLNS_NICKNAME ); + n->setCData( m_nick ); + return n; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/nickname.h b/smack/smack/src/main/cpp/gloox/src/nickname.h new file mode 100644 index 00000000..a4095ce1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/nickname.h @@ -0,0 +1,87 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef NICKNAME_H__ +#define NICKNAME_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief An implementation of User Nickname (@xep{0172}) as a StanzaExtension. + * + * XEP version: 1.0 + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Nickname : public StanzaExtension + { + public: + + /** + * Constructs a new object from the given Tag. + * @param tag A Tag to parse. + */ + Nickname( const Tag* tag ); + + /** + * Constructs a new Nickname object. + * @param nick The nickname to include. + */ + Nickname( const std::string& nick ) + : StanzaExtension( ExtNickname ), m_nick( nick ) + {} + + /** + * Virtual destructor. + */ + virtual ~Nickname() {} + + /** + * Returns the extension's saved nickname. + * @return The nickname. + */ + const std::string nick() const { return m_nick; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Nickname( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Nickname( *this ); + } + + private: + std::string m_nick; + + }; + +} + +#endif // NICKNAME_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/nonsaslauth.cpp b/smack/smack/src/main/cpp/gloox/src/nonsaslauth.cpp new file mode 100644 index 00000000..7e3d6281 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/nonsaslauth.cpp @@ -0,0 +1,174 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "nonsaslauth.h" +#include "client.h" +#include "error.h" +#include "sha.h" + +#include + +namespace gloox +{ + + // ---- NonSaslAuth::Query ---- + NonSaslAuth::Query::Query( const std::string& user ) + : StanzaExtension( ExtNonSaslAuth ), m_user( user ), m_digest( true ) + { + } + + NonSaslAuth::Query::Query( const Tag* tag ) + : StanzaExtension( ExtNonSaslAuth ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_AUTH ) + return; + + m_digest = tag->hasChild( "digest" ); + } + + NonSaslAuth::Query* NonSaslAuth::Query::newInstance( const std::string& user, + const std::string& sid, + const std::string& pwd, + const std::string& resource ) const + { + Query* q = new Query( user ); + if( m_digest && !sid.empty() ) + { + SHA sha; + sha.feed( sid ); + sha.feed( pwd ); + q->m_pwd = sha.hex(); + } + else + q->m_pwd = pwd; + + q->m_resource = resource; + q->m_digest = m_digest; + return q; + } + + const std::string& NonSaslAuth::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_AUTH + "']"; + return filter; + } + + Tag* NonSaslAuth::Query::tag() const + { + if( m_user.empty() ) + return 0; + + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_AUTH ); + new Tag( t, "username", m_user ); + + if( !m_pwd.empty() && !m_resource.empty() ) + { + new Tag( t, m_digest ? "digest" : "password", m_pwd ); + new Tag( t, "resource", m_resource ); + } + + return t; + } + // ---- ~NonSaslAuth::Query ---- + + // ---- NonSaslAuth ---- + NonSaslAuth::NonSaslAuth( Client* parent ) + : m_parent( parent ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new Query() ); + m_parent->registerIqHandler( this, ExtNonSaslAuth ); + } + } + + NonSaslAuth::~NonSaslAuth() + { + if( m_parent ) + { + m_parent->removeStanzaExtension( ExtNonSaslAuth ); + m_parent->removeIqHandler( this, ExtNonSaslAuth ); + m_parent->removeIDHandler( this ); + } + } + + void NonSaslAuth::doAuth( const std::string& sid ) + { + m_sid = sid; + const std::string& id = m_parent->getID(); + + IQ iq( IQ::Get, m_parent->jid().server(), id ); + iq.addExtension( new Query( m_parent->username() ) ); + m_parent->send( iq, this, TrackRequestAuthFields ); + } + + void NonSaslAuth::handleIqID( const IQ& iq, int context ) + { + switch( iq.subtype() ) + { + case IQ::Error: + { + const Error* e = iq.error(); + if( e ) + { + switch( e->error() ) + { + case StanzaErrorConflict: + m_parent->setAuthFailure( NonSaslConflict ); + break; + case StanzaErrorNotAcceptable: + m_parent->setAuthFailure( NonSaslNotAcceptable ); + break; + case StanzaErrorNotAuthorized: + m_parent->setAuthFailure( NonSaslNotAuthorized ); + break; + default: + break; + } + } + m_parent->setAuthed( false ); + m_parent->disconnect( ConnAuthenticationFailed ); + break; + } + case IQ::Result: + switch( context ) + { + case TrackRequestAuthFields: + { + const Query* q = iq.findExtension( ExtNonSaslAuth ); + if( !q ) + return; + + const std::string& id = m_parent->getID(); + + IQ re( IQ::Set, JID(), id ); + re.addExtension( q->newInstance( m_parent->username(), m_sid, + m_parent->password(), + m_parent->jid().resource() ) ); + m_parent->send( re, this, TrackSendAuth ); + break; + } + case TrackSendAuth: + m_parent->setAuthed( true ); + m_parent->connected(); + break; + } + break; + + default: + break; + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/nonsaslauth.h b/smack/smack/src/main/cpp/gloox/src/nonsaslauth.h new file mode 100644 index 00000000..fce8711b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/nonsaslauth.h @@ -0,0 +1,147 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef NONSASLAUTH_H__ +#define NONSASLAUTH_H__ + +#include "iqhandler.h" + +#include + +namespace gloox +{ + + class Client; + class Stanza; + class Tag; + + /** + * @brief This class is an implementation of @xep{0078} (Non-SASL Authentication). + * + * It is invoked by @ref Client automatically if supported by the server and if SASL authentication + * is not supported. + * You should not need to use this class manually. + * + * XEP Version: 2.3 + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API NonSaslAuth : public IqHandler + { + public: + /** + * Constructor. + * @param parent The @ref ClientBase which is used to authenticate. + */ + NonSaslAuth( Client* parent ); + + /** + * Virtual Destructor. + */ + virtual ~NonSaslAuth(); + + /** + * Starts authentication by querying the server for the required authentication fields. + * Digest authentication is preferred over plain text passwords. + * @param sid The session ID given by the server with the stream opening tag. + */ + void doAuth( const std::string& sid ); + + // reimplemented from IqHandler + virtual bool handleIq( const IQ& iq ) { (void)iq; return false; } + + // reimplemented from IqHandler + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef NONSASLAUTH_TEST + public: +#endif + /** + * @brief An abstraction of an IQ extension used for Non-SASL authentication (@xep{0078}). + * + * @author Jakob Schröter + * @since 1.0 + */ + class Query : public StanzaExtension + { + public: + /** + * Creates a new object that can be used to query the server for + * authentication filds for the given user. + * @param user The user name to fetch authentication fields for. + */ + Query( const std::string& user ); + + /** + * Creates a now object from the given Tag. + * @param tag The Tag to parse. + */ + Query( const Tag* tag = 0 ); + + /** + * Creates a new object on the heap that can be used to + * authenticate, based on the current reply. + * @param user The uset o authenticate as. + * @param sid The stream's ID. + * @param pwd The password to use. + * @param resource The desired resource identifier. + */ + Query* newInstance( const std::string& user, const std::string& sid, + const std::string& pwd, const std::string& resource ) const; + + /** + * Virtual destructor. + */ + virtual ~Query() {} + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Query( *this ); + } + + private: + std::string m_user; + std::string m_pwd; + std::string m_resource; + bool m_digest; + + }; + + enum NonSaslAuthTrack + { + TrackRequestAuthFields, + TrackSendAuth + }; + + Client* m_parent; + std::string m_sid; + + }; + +} + +#endif // NONSASLAUTH_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/oob.cpp b/smack/smack/src/main/cpp/gloox/src/oob.cpp new file mode 100644 index 00000000..fc17f3db --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/oob.cpp @@ -0,0 +1,81 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "oob.h" +#include "tag.h" + +namespace gloox +{ + + OOB::OOB( const std::string& url, const std::string& description, bool iqext ) + : StanzaExtension( ExtOOB ), m_url( url ), m_desc( description ), m_iqext( iqext ), + m_valid( true ) + { + if( m_url.empty() ) + m_valid = false; + } + + OOB::OOB( const Tag* tag ) + : StanzaExtension( ExtOOB ), m_iqext( false ), m_valid( false ) + { + if( tag && ( ( tag->name() == "x" && tag->hasAttribute( XMLNS, XMLNS_X_OOB ) ) || + ( tag && tag->name() == "query" && tag->hasAttribute( XMLNS, XMLNS_IQ_OOB ) ) ) ) + { + if( tag->name() == "query" ) + m_iqext = true; + } + else + return; + + if( tag->hasChild( "url" ) ) + { + m_valid = true; + m_url = tag->findChild( "url" )->cdata(); + } + if( tag->hasChild( "desc" ) ) + m_desc = tag->findChild( "desc" )->cdata(); + } + + OOB::~OOB() + { + } + + const std::string& OOB::filterString() const + { + static const std::string filter = + "/presence/x[@xmlns='" + XMLNS_X_OOB + "']" + "|/message/x[@xmlns='" + XMLNS_X_OOB + "']" + "|/iq/query[@xmlns='" + XMLNS_IQ_OOB + "']"; + return filter; + } + + Tag* OOB::tag() const + { + if( !m_valid ) + return 0; + + Tag* t = 0; + + if( m_iqext ) + t = new Tag( "query", XMLNS, XMLNS_IQ_OOB ); + else + t = new Tag( "x", XMLNS, XMLNS_X_OOB ); + + new Tag( t, "url", m_url ); + if( !m_desc.empty() ) + new Tag( t, "desc", m_desc ); + + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/oob.h b/smack/smack/src/main/cpp/gloox/src/oob.h new file mode 100644 index 00000000..721de598 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/oob.h @@ -0,0 +1,101 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef OOB_H__ +#define OOB_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an abstraction of a jabber:x:oob namespace element or a jabber:iq:oob namespace element + * as specified in @xep{0066}. + * + * XEP version: 1.5 + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API OOB : public StanzaExtension + { + public: + /** + * Constructs an OOB StanzaExtension from teh given URL and description. + * @param url The out-of-band URL. + * @param description The URL's optional description. + * @param iqext Whether this object extends an IQ or a Presence/Message stanza (results in + * either jabber:iq:oob or jabber:x:oob namespaced element). + */ + OOB( const std::string& url, const std::string& description, bool iqext ); + + /** + * Constructs an OOB object from the given Tag. To be recognized properly, the Tag must + * have either a name of 'x' in the jabber:x:oob namespace, or a name of 'query' in the + * jabber:iq:oob namespace. + * @param tag The Tag to parse. + */ + OOB( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~OOB(); + + /** + * Returns the out-of-band URL. + * @return The out-of-band URL. + */ + const std::string& url() const { return m_url; } + + /** + * Returns the URL's description. + * @return The URL's description. + */ + const std::string& desc() const { return m_desc; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new OOB( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new OOB( *this ); + } + + private: + std::string m_xmlns; + std::string m_url; + std::string m_desc; + bool m_iqext; + bool m_valid; + + }; + +} + +#endif // OOB_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/parser.cpp b/smack/smack/src/main/cpp/gloox/src/parser.cpp new file mode 100644 index 00000000..976ad5ca --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/parser.cpp @@ -0,0 +1,809 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "gloox.h" +#include "util.h" +#include "parser.h" + +#include + +namespace gloox +{ + + Parser::Parser( TagHandler* ph, bool deleteRoot ) + : m_tagHandler( ph ), m_current( 0 ), m_root( 0 ), m_xmlnss( 0 ), m_state( Initial ), + m_preamble( 0 ), m_quote( false ), m_haveTagPrefix( false ), m_haveAttribPrefix( false ), + m_attribIsXmlns( false ), m_deleteRoot( deleteRoot ) + { + } + + Parser::~Parser() + { + delete m_root; + delete m_xmlnss; + } + + Parser::DecodeState Parser::decode( std::string::size_type& pos, const std::string& data ) + { + std::string::size_type p = data.find( ';', pos ); + std::string::size_type diff = p - pos; + + if( p == std::string::npos ) + { + m_backBuffer = data.substr( pos ); + return DecodeInsufficient; + } + + if( diff < 3 || diff > 9 ) + return DecodeInvalid; + + std::string rep; + switch( data[pos + 1] ) + { + case '#': + { + int base = 10; + int idx = 2; + + if( data[pos + 2] == 'x' || data[pos + 2] == 'X' ) + { + base = 16; + idx = 3; + } + + char* end; + const long int val = std::strtol( data.data() + pos + idx, &end, base ); + if( *end != ';' || val < 0 ) + return DecodeInvalid; + + if( val == 0x9 || val == 0xA || val == 0xD || ( val >= 0x20 && val <= 0x7F ) ) + { + rep += char( val ); + } + else if( val >= 0x80 && val <= 0x7FF ) + { + rep += char( 192 + ( val >> 6 ) ); + rep += char( 128 + ( val % 64 ) ); + } + else if( ( val >= 0x800 && val <= 0xD7FF ) || ( val >= 0xE000 && val <= 0xFFFD ) ) + { + rep += char( 224 + ( val >> 12 ) ); + rep += char( 128 + ( ( val >> 6 ) % 64 ) ); + rep += char( 128 + ( val % 64 ) ); + } + else if( val >= 0x100000 && val < 0x10FFFF ) + { + rep += char( 240 + ( val >> 18 ) ); + rep += char( 128 + ( ( val >> 12 ) % 64 ) ); + rep += char( 128 + ( ( val >> 6 ) % 64 ) ); + rep += char( 128 + ( val % 64 ) ); + } + else + return DecodeInvalid; + } + break; + case 'l': + if( diff == 3 && data[pos + 2] == 't' ) + rep += '<'; + else + return DecodeInvalid; + break; + case 'g': + if( diff == 3 && data[pos + 2] == 't' ) + rep += '>'; + else + return DecodeInvalid; + break; + case 'a': + if( diff == 5 && !data.compare( pos + 1, 5, "apos;" ) ) + rep += '\''; + else if( diff == 4 && !data.compare( pos + 1, 4, "amp;" ) ) + rep += '&'; + else + return DecodeInvalid; + break; + case 'q': + if( diff == 5 && !data.compare( pos + 1, 5, "quot;" ) ) + rep += '"'; + else + return DecodeInvalid; + break; + default: + return DecodeInvalid; + } + + switch( m_state ) + { + case InterTag: + case TagInside: + m_cdata += rep; + break; + case TagAttributeValue: + m_value += rep; + break; + default: + break; + } + pos += diff; + return DecodeValid; + } + + Parser::ForwardScanState Parser::forwardScan( std::string::size_type& pos, const std::string& data, + const std::string& needle ) + { + if( pos + needle.length() <= data.length() ) + { + if( !data.compare( pos, needle.length(), needle ) ) + { + pos += needle.length() - 1; + return ForwardFound; + } + else + { + return ForwardNotFound; + } + } + else + { + m_backBuffer = data.substr( pos ); + return ForwardInsufficientSize; + } + } + + int Parser::feed( std::string& data ) + { + if( !m_backBuffer.empty() ) + { + data.insert( 0, m_backBuffer ); + m_backBuffer = EmptyString; + } + + std::string::size_type count = data.length(); + for( std::string::size_type i = 0; i < count; ++i ) + { + const unsigned char c = data[i]; +// printf( "found char: %c, ", c ); + + switch( m_state ) + { + case Initial: +// printf( "Initial: %c\n", c ); + if( isWhitespace( c ) ) + break; + + switch( c ) + { + case '<': + m_state = TagOpening; + break; + default: + cleanup(); + return static_cast( i ); + break; + } + break; + case InterTag: +// printf( "InterTag: %c\n", c ); + m_tag = EmptyString; + if( isWhitespace( c ) ) + { + m_state = TagInside; + if( m_current ) + m_cdata += c; + break; + } + + switch( c ) + { + case '&': +// printf( "InterTag, calling decode\n" ); + switch( decode( i, data ) ) + { + case DecodeValid: + m_state = TagInside; + break; + case DecodeInvalid: + cleanup(); + return static_cast( i ); + case DecodeInsufficient: + return -1; + } + break; + case '<': + m_state = TagOpening; + break; + case '>': + default: + if( m_current ) + { + m_cdata += c; + m_state = TagInside; + } + break; + } + break; + case TagOpening: // opening '<' has been found before +// printf( "TagOpening: %c\n", c ); + if( isWhitespace( c ) ) + break; + + switch( c ) + { + case '<': + case '>': + case '&': + cleanup(); + return static_cast( i ); + break; + case '/': + m_state = TagClosingSlash; + break; + case '?': + m_state = TagNameCollect; + m_preamble = 1; + break; + case '!': + switch( forwardScan( i, data, "![CDATA[" ) ) + { + case ForwardFound: + m_state = TagCDATASection; + break; + case ForwardNotFound: + cleanup(); + return static_cast( i ); + case ForwardInsufficientSize: + return -1; + } + break; + default: + m_tag += c; + m_state = TagNameCollect; + break; + } + break; + case TagCDATASection: + switch( c ) + { + case ']': + switch( forwardScan( i, data, "]]>" ) ) + { + case ForwardFound: + m_state = TagInside; + break; + case ForwardNotFound: + m_cdata += c; + break; + case ForwardInsufficientSize: + return -1; + } + break; + default: + m_cdata += c; + break; + } + break; + case TagNameCollect: // we're collecting the tag's name, we have at least one octet already +// printf( "TagNameCollect: %c\n", c ); + if( isWhitespace( c ) ) + { + m_state = TagNameComplete; + break; + } + + switch( c ) + { + case '<': + case '?': + case '!': + case '&': + cleanup(); + return static_cast( i ); + break; + case '/': + m_state = TagOpeningSlash; + break; + case '>': + addTag(); + m_state = TagInside; + break; + case ':': + if( !m_haveTagPrefix ) + { + m_haveTagPrefix = true; + m_tagPrefix = m_tag; + m_tag = EmptyString; + } + else + { + cleanup(); + return static_cast( i ); + } + break; + default: + m_tag += c; + break; + } + break; + case TagInside: // we're inside a tag, expecting a child tag or cdata +// printf( "TagInside: %c\n", c ); + m_tag = EmptyString; + switch( c ) + { + case '<': + addCData(); + m_state = TagOpening; + break; + case '&': +// printf( "TagInside, calling decode\n" ); + switch( decode( i, data ) ) + { + case DecodeValid: + break; + case DecodeInvalid: + cleanup(); + return static_cast( i ); + case DecodeInsufficient: + return -1; + } + break; + default: + m_cdata += c; + break; + } + break; + case TagOpeningSlash: // a slash in an opening tag has been found, initing close of the tag +// printf( "TagOpeningSlash: %c\n", c ); + if( isWhitespace( c ) ) + break; + + if( c == '>' ) + { + addTag(); + if( !closeTag() ) + { +// printf( "noipe, here\n" ); + cleanup(); + return static_cast( i ); + } + + m_state = InterTag; + } + else + { + cleanup(); + return static_cast( i ); + } + break; + case TagClosingSlash: // we have found the '/' of a closing tag +// printf( "TagClosingSlash: %c\n", c ); + if( isWhitespace( c ) ) + break; + + switch( c ) + { + case '>': + case '<': + case '/': + cleanup(); + return static_cast( i ); + break; + default: + m_tag += c; + m_state = TagClosing; + break; + } + break; + case TagClosing: // we're collecting the name of a closing tag +// printf( "TagClosing: %c\n", c ); + switch( c ) + { + case '<': + case '/': + case '!': + case '?': + case '&': + cleanup(); + return static_cast( i ); + break; + case ':': + if( !m_haveTagPrefix ) + { + m_haveTagPrefix = true; + m_tagPrefix = m_tag; + m_tag = EmptyString; + } + else + { + cleanup(); + return static_cast( i ); + } + break; + case '>': + if( !closeTag() ) + { +// printf( "here\n" ); + cleanup(); + return static_cast( i ); + } + m_state = InterTag; + break; + default: + m_tag += c; + break; + } + break; + case TagNameComplete: // a tag name is complete, expect tag close or attribs +// printf( "TagNameComplete: %c\n", c ); + if( isWhitespace( c ) ) + break; + + switch( c ) + { + case '<': + case '!': + case '&': + cleanup(); + return static_cast( i ); + break; + case '/': + m_state = TagOpeningSlash; + break; + case '>': + if( m_preamble == 1 ) + { + cleanup(); + return static_cast( i ); + } + m_state = TagInside; + addTag(); + break; + case '?': + if( m_preamble == 1 ) + m_preamble = 2; + else + { + cleanup(); + return static_cast( i ); + } + break; + default: + m_attrib += c; + m_state = TagAttribute; + break; + } + break; + case TagAttribute: // we're collecting the name of an attribute, we have at least 1 octet +// printf( "TagAttribute: %c\n", c ); + if( isWhitespace( c ) ) + { + m_state = TagAttributeComplete; + break; + } + + switch( c ) + { + case '<': + case '/': + case '>': + case '?': + case '!': + case '&': + cleanup(); + return static_cast( i ); + break; + case '=': + m_state = TagAttributeEqual; + break; + case ':': + if( !m_haveAttribPrefix && m_attrib != XMLNS ) + { + m_haveAttribPrefix = true; + m_attribPrefix = m_attrib; + m_attrib = EmptyString; + } + else if( m_attrib == XMLNS ) + { + m_attribIsXmlns = true; + m_attrib = EmptyString; + } + else + { + cleanup(); + return static_cast( i ); + } + break; + default: + m_attrib += c; + } + break; + case TagAttributeComplete: // we're expecting an equals sign or ws +// printf( "TagAttributeComplete: %c\n", c ); + if( isWhitespace( c ) ) + break; + + switch( c ) + { + case '=': + m_state = TagAttributeEqual; + break; + default: + cleanup(); + return static_cast( i ); + break; + } + break; + case TagAttributeEqual: // we have found an equals sign +// printf( "TagAttributeEqual: %c\n", c ); + if( isWhitespace( c ) ) + break; + + switch( c ) + { + case '"': + m_quote = true; + case '\'': + m_state = TagAttributeValue; + break; + default: + cleanup(); + return static_cast( i ); + break; + } + break; + case TagAttributeValue: // we're expecting value data +// printf( "TagValue: %c\n", c ); + switch( c ) + { + case '<': + cleanup(); + return static_cast( i ); + break; + case '\'': + if( m_quote ) + { + m_value += c; + break; + } + case '"': + addAttribute(); + m_state = TagNameAlmostComplete; + m_quote = false; + break; + case '&': +// printf( "TagAttributeValue, calling decode\n" ); + switch( decode( i, data ) ) + { + case DecodeValid: + break; + case DecodeInvalid: + cleanup(); + return static_cast( i ); + case DecodeInsufficient: + return -1; + } + break; + case '>': + default: + m_value += c; + } + break; + case TagNameAlmostComplete: +// printf( "TagAttributeEqual: %c\n", c ); + if( isWhitespace( c ) ) + { + m_state = TagNameComplete; + break; + } + + switch( c ) + { + case '/': + m_state = TagOpeningSlash; + break; + case '>': + if( m_preamble == 1 ) + { + cleanup(); + return static_cast( i ); + } + m_state = TagInside; + addTag(); + break; + case '?': + if( m_preamble == 1 ) + m_preamble = 2; + else + { + cleanup(); + return static_cast( i ); + } + break; + default: + cleanup(); + return static_cast( i ); + break; + } + break; + default: +// printf( "default action!?\n" ); + break; + } +// printf( "parser state: %d\n", m_state ); + } + + return -1; + } + + void Parser::addTag() + { + if( !m_root ) + { +// printf( "created Tag named %s, ", m_tag.c_str() ); + m_root = new Tag( m_tag ); + m_current = m_root; + } + else + { +// printf( "created Tag named %s, ", m_tag.c_str() ); + m_current = new Tag( m_current, m_tag ); + } + + if( m_haveTagPrefix ) + { +// printf( "setting tag prefix: %s\n", m_tagPrefix.c_str() ); + m_current->setPrefix( m_tagPrefix ); + m_haveTagPrefix = false; + } + + if( m_attribs.size() ) + { + m_current->setAttributes( m_attribs ); +// printf( "added %d attributes, ", m_attribs.size() ); + m_attribs.clear(); + } + + if( m_xmlnss ) + { +// printf( "have ns decls\n" ); +// StringMap::const_iterator it = m_xmlnss->begin(); +// for( ; it != m_xmlnss->end(); ++it ) +// printf( "%s='%s'\n", (*it).first.c_str(), (*it).second.c_str() ); + m_current->setXmlns( m_xmlnss ); + m_xmlnss = 0; + } + + m_current->setXmlns( m_xmlns ); + m_xmlns = EmptyString; + + if( m_tag == "stream" && m_root->xmlns() == XMLNS_STREAM ) + { + streamEvent( m_root ); + cleanup( m_deleteRoot ); + return; + } +// else +// printf( "%s, ", m_root->xml().c_str() ); + + if( m_root && m_root == m_current && m_tagPrefix == "stream" ) + m_root->setXmlns( XMLNS_STREAM, m_tagPrefix ); + + if( m_tag == "xml" && m_preamble == 2 ) + cleanup(); + } + + void Parser::addAttribute() + { + Tag::Attribute* attr = new Tag::Attribute( m_attrib, m_value );; + if( m_attribIsXmlns ) + { + if( !m_xmlnss ) + m_xmlnss = new StringMap(); + + (*m_xmlnss)[m_attrib] = m_value; + attr->setPrefix( XMLNS ); + } + else + { +// printf( "adding attribute: %s:%s='%s'\n", m_attribPrefix.c_str(), m_attrib.c_str(), m_value.c_str() ); + if( !m_attribPrefix.empty() ) + attr->setPrefix( m_attribPrefix ); + if( m_attrib == XMLNS ) + m_xmlns = m_value; + } + m_attribs.push_back( attr ); + m_attrib = EmptyString; + m_value = EmptyString; + m_attribPrefix = EmptyString; + m_haveAttribPrefix = false; + m_attribIsXmlns = false; + } + + void Parser::addCData() + { + if( m_current && !m_cdata.empty() ) + { + m_current->addCData( m_cdata ); +// printf( "added cdata %s to %s: %s\n", +// m_cdata.c_str(), m_current->name().c_str(), m_current->xml().c_str() ); + m_cdata = EmptyString; + } + } + + bool Parser::closeTag() + { +// printf( "about to close, " ); + + if( m_tag == "stream" && m_tagPrefix == "stream" ) + return true; + + if( !m_current || m_current->name() != m_tag + || ( !m_current->prefix().empty() && m_current->prefix() != m_tagPrefix ) ) + { +// printf( "current xml: %s\n", m_current->xml().c_str() ); +// printf( "current name: %s, m_tag: %s\n", m_current->name().c_str(), m_tag.c_str() ); +// printf( "current prefix: %s, m_tagPrefix: %s\n", m_current->prefix().c_str(), m_tagPrefix.c_str() ); + return false; + } + +// printf( "m_current: %s, ", m_current->name().c_str() ); +// printf( "m_tag: %s, ", m_tag.c_str() ); + + m_tagPrefix = EmptyString; + m_haveTagPrefix = false; + + if( m_current->parent() ) + m_current = m_current->parent(); + else + { +// printf( "pushing upstream\n" ); + streamEvent( m_root ); + cleanup( m_deleteRoot ); + } + + return true; + } + + void Parser::cleanup( bool deleteRoot ) + { + if( deleteRoot ) + delete m_root; + m_root = 0; + m_current = 0; + delete m_xmlnss; + m_xmlnss = 0; + m_cdata = EmptyString; + m_tag = EmptyString; + m_attrib = EmptyString; + m_attribPrefix = EmptyString; + m_tagPrefix = EmptyString; + m_haveAttribPrefix = false; + m_haveTagPrefix = false; + m_value = EmptyString; + m_xmlns = EmptyString; + util::clearList( m_attribs ); + m_attribs.clear(); + m_state = Initial; + m_preamble = 0; + } + + bool Parser::isWhitespace( unsigned char c ) + { + return ( c == 0x09 || c == 0x0a || c == 0x0d || c == 0x20 ); + } + + void Parser::streamEvent( Tag* tag ) + { + if( m_tagHandler ) + m_tagHandler->handleTag( tag ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/parser.h b/smack/smack/src/main/cpp/gloox/src/parser.h new file mode 100644 index 00000000..51b47351 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/parser.h @@ -0,0 +1,138 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef PARSER_H__ +#define PARSER_H__ + +#include "gloox.h" +#include "taghandler.h" +#include "tag.h" + +#include + +namespace gloox +{ + + + /** + * @brief This class implements an XML parser. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API Parser + { + public: + /** + * Constructs a new Parser object. + * @param ph The object to send incoming Tags to. + * @param deleteRoot Indicates whether a parsed Tag should be + * deleted after pushing it upstream. Defaults to @p true. + */ + Parser( TagHandler* ph, bool deleteRoot = true ); + + /** + * Virtual destructor. + */ + virtual ~Parser(); + + /** + * Use this function to feed the parser with more XML. + * @param data Raw xml to parse. It may be modified if backbuffering is necessary. + * @return Returns @b -1 if parsing was successful. If a parse error occured, the + * character position where the error was occured is returned. + */ + int feed( std::string& data ); + + /** + * Resets internal state. + * @param deleteRoot Whether to delete the m_root member. For + * internal use only. + */ + void cleanup( bool deleteRoot = true ); + + private: + enum ParserInternalState + { + Initial, + InterTag, + TagOpening, + TagOpeningSlash, + TagOpeningLt, + TagInside, + TagNameCollect, + TagNameComplete, + TagNameAlmostComplete, + TagAttribute, + TagAttributeComplete, + TagAttributeEqual, + TagClosing, + TagClosingSlash, + TagValueApos, + TagAttributeValue, + TagPreamble, + TagCDATASection + }; + + enum ForwardScanState + { + ForwardFound, + ForwardNotFound, + ForwardInsufficientSize + }; + + enum DecodeState + { + DecodeValid, + DecodeInvalid, + DecodeInsufficient + }; + + void addTag(); + void addAttribute(); + void addCData(); + bool closeTag(); + bool isWhitespace( unsigned char c ); + void streamEvent( Tag* tag ); + ForwardScanState forwardScan( std::string::size_type& pos, const std::string& data, + const std::string& needle ); + DecodeState decode( std::string::size_type& pos, const std::string& data ); + + TagHandler* m_tagHandler; + Tag* m_current; + Tag* m_root; + StringMap* m_xmlnss; + + ParserInternalState m_state; + Tag::AttributeList m_attribs; + std::string m_tag; + std::string m_cdata; + std::string m_attrib; + std::string m_value; + std::string m_xmlns; + std::string m_tagPrefix; + std::string m_attribPrefix; + std::string m_backBuffer; + int m_preamble; + bool m_quote; + bool m_haveTagPrefix; + bool m_haveAttribPrefix; + bool m_attribIsXmlns; + bool m_deleteRoot; + + }; + +} + +#endif // PARSER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/prep.cpp b/smack/smack/src/main/cpp/gloox/src/prep.cpp new file mode 100644 index 00000000..43d14106 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/prep.cpp @@ -0,0 +1,134 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "prep.h" + +#include "config.h" + +#ifdef HAVE_LIBIDN +# include +# include +#endif + +#include +#include + +#include + +#define JID_PORTION_SIZE 1023 + +namespace gloox +{ + + namespace prep + { + +#ifdef HAVE_LIBIDN + /** + * Applies a Stringprep profile to a string. This function does the actual + * work behind nodeprep, nameprep and resourceprep. + * @param s The string to apply the profile to. + * @param out Contains the prepped string if prepping was successful, else untouched. + * @param profile The Stringprep profile to apply. + * @return Returns @b true if prepping was successful, @b false otherwise. + */ + static bool prepare( const std::string& s, std::string& out, const Stringprep_profile* profile ) + { + if( s.empty() || s.length() > JID_PORTION_SIZE ) + return false; + + char* p = static_cast( calloc( JID_PORTION_SIZE, sizeof( char ) ) ); + strncpy( p, s.c_str(), s.length() ); + int rc = stringprep( p, JID_PORTION_SIZE, (Stringprep_profile_flags)0, profile ); + if( rc == STRINGPREP_OK ) + out = p; + free( p ); + return rc == STRINGPREP_OK; + } +#endif + + bool nodeprep( const std::string& node, std::string& out ) + { +#ifdef HAVE_LIBIDN + return prepare( node, out, stringprep_xmpp_nodeprep ); +#else + if( node.length() > JID_PORTION_SIZE ) + return false; + out = node; + return true; +#endif + } + + bool nameprep( const std::string& domain, std::string& out ) + { +#ifdef HAVE_LIBIDN + return prepare( domain, out, stringprep_nameprep ); +#else + if( domain.length() > JID_PORTION_SIZE ) + return false; + out = domain; + return true; +#endif + } + + bool resourceprep( const std::string& resource, std::string& out ) + { +#ifdef HAVE_LIBIDN + return prepare( resource, out, stringprep_xmpp_resourceprep ); +#else + if( resource.length() > JID_PORTION_SIZE ) + return false; + out = resource; + return true; +#endif + } + + bool saslprep( const std::string& input, std::string& out ) + { + #ifdef HAVE_LIBIDN + return prepare( input, out, stringprep_saslprep ); + #else + if( input.length() > JID_PORTION_SIZE ) + return false; + out = input; + return true; + #endif + } + + bool idna( const std::string& domain, std::string& out ) + { +#ifdef HAVE_LIBIDN + if( domain.empty() || domain.length() > JID_PORTION_SIZE ) + return false; + + char* prepped; + int rc = idna_to_ascii_8z( domain.c_str(), &prepped, (Idna_flags)IDNA_USE_STD3_ASCII_RULES ); + if( rc == IDNA_SUCCESS ) + { + out = prepped; + free( prepped ); + return true; + } + if( rc != IDNA_MALLOC_ERROR ) + free( prepped ); + return false; +#else + if( domain.length() > JID_PORTION_SIZE ) + return false; + out = domain; + return true; +#endif + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/prep.h b/smack/smack/src/main/cpp/gloox/src/prep.h new file mode 100644 index 00000000..767ece04 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/prep.h @@ -0,0 +1,95 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef PREP_H__ +#define PREP_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + /** + * @brief This namespace offers functions to stringprep the individual parts of a JID. + * + * You should not need to use these functions directly. All the + * necessary prepping is done for you if you stick to the interfaces provided. + * If you write your own enhancements, check with the spec. + * + * @note These functions depend on an installed LibIDN at compile time of gloox. If + * LibIDN is not installed these functions return the string they are given + * without any modification. + * + * @author Jakob Schröter + * @since 0.2 + */ + namespace prep + { + /** + * This function applies the Nodeprep profile of Stringprep to a string. + * @param node The string to apply the profile to. + * @param out The prepped string. In case of an error this string is not touched. + * If LibIDN is not available the string is returned unchanged. + * @return @b True if prepping was successful, @b false otherwise or if LibIDN + * is not available. + */ + bool nodeprep( const std::string& node, std::string& out ); + + /** + * This function applies the Nameprep profile of Stringprep to a string. + * @param domain The string to apply the profile to. + * @param out The prepped string. In case of an error this string is not touched. + * If LibIDN is not available the string is returned unchanged. + * @return @b True if prepping was successful, @b false otherwise or if LibIDN + * is not available. + */ + bool nameprep( const std::string& domain, std::string& out ); + + /** + * This function applies the Resourceprep profile of Stringprep to a std::string. + * @param resource The string to apply the profile to. + * @param out The prepped string. In case of an error this string is not touched. + * If LibIDN is not available the string is returned unchanged. + * @return @b True if prepping was successful, @b false otherwise or if LibIDN + * is not available. + */ + bool resourceprep( const std::string& resource, std::string& out ); + + /** + * This function applies the Saslprep profile of Stringprep to a std::string. + * @param input The string to apply the profile to. + * @param out The prepped string. In case of an error this string is not touched. + * If LibIDN is not available the string is returned unchanged. + * @return @b True if prepping was successful, @b false otherwise or if LibIDN + * is not available. + */ + bool saslprep( const std::string& input, std::string& out ); + + /** + * This function applies the idna() function to a string. I.e. it transforms + * internationalized domain names into plain ASCII. + * @param domain The string to convert. + * @param out The converted string. In case of an error this string is not touched. + * If LibIDN is not available the string is returned unchanged. + * @return @b True if prepping was successful, @b false otherwise or if LibIDN + * is not available. + */ + bool idna( const std::string& domain, std::string& out ); + + } + +} + +#endif // PREP_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/presence.cpp b/smack/smack/src/main/cpp/gloox/src/presence.cpp new file mode 100644 index 00000000..e55a35c3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/presence.cpp @@ -0,0 +1,143 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "presence.h" +#include "capabilities.h" +#include "util.h" + +#include + +namespace gloox +{ + + static const char* msgTypeStringValues[] = + { + "available", "", "", "", "", "unavailable", "probe", "error" + }; + + static inline const std::string typeString( Presence::PresenceType type ) + { + return util::lookup( type, msgTypeStringValues ); + } + + static const char* msgShowStringValues[] = + { + "", "chat", "away", "dnd", "xa", "", "", "" + }; + + static inline const std::string showString( Presence::PresenceType type ) + { + return util::lookup( type, msgShowStringValues ); + } + + Presence::Presence( Tag* tag ) + : Stanza( tag ), m_subtype( Invalid ), m_stati( 0 ), m_priority( 0 ) + { + if( !tag || tag->name() != "presence" ) + return; + + const std::string& type = tag->findAttribute( TYPE ); + if( type.empty() ) + m_subtype = Available; + else + m_subtype = (PresenceType)util::lookup( type, msgTypeStringValues ); + + if( m_subtype == Available ) + { + Tag* t = tag->findChild( "show" ); + if( t ) + m_subtype = (PresenceType)util::lookup( t->cdata(), msgShowStringValues ); + } + + const TagList& c = tag->children(); + TagList::const_iterator it = c.begin(); + for( ; it != c.end(); ++it ) + { + if( (*it)->name() == "status" ) + setLang( &m_stati, m_status, (*it) ); + else if( (*it)->name() == "priority" ) + m_priority = atoi( (*it)->cdata().c_str() ); + } + } + + Presence::Presence( PresenceType type, const JID& to, const std::string& status, + int priority, const std::string& xmllang ) + : Stanza( to ), m_subtype( type ), m_stati( 0 ) + { + setLang( &m_stati, m_status, status, xmllang ); + + setPriority( priority ); + } + + Presence::~Presence() + { + delete m_stati; + } + + void Presence::resetStatus() + { + delete m_stati; + m_stati = 0; + m_status = ""; + } + + void Presence::setPriority( int priority ) + { + if( priority < -128 ) + m_priority = -128; + else if( priority > 127 ) + m_priority = 127; + else + m_priority = priority; + } + + const Capabilities* Presence::capabilities() const + { + return findExtension( ExtCaps ); + } + + Tag* Presence::tag() const + { + if( m_subtype == Invalid ) + return 0; + + Tag* t = new Tag( "presence" ); + if( m_to ) + t->addAttribute( "to", m_to.full() ); + if( m_from ) + t->addAttribute( "from", m_from.full() ); + + const std::string& type = typeString( m_subtype ); + if( !type.empty() ) + { + if( type != "available" ) + t->addAttribute( "type", type ); + } + else + { + const std::string& show = showString( m_subtype ); + if( !show.empty() ) + new Tag( t, "show", show ); + } + + new Tag( t, "priority", util::int2string( m_priority ) ); + + getLangs( m_stati, m_status, "status", t ); + + StanzaExtensionList::const_iterator it = m_extensionList.begin(); + for( ; it != m_extensionList.end(); ++it ) + t->addChild( (*it)->tag() ); + + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/presence.h b/smack/smack/src/main/cpp/gloox/src/presence.h new file mode 100644 index 00000000..0280ea05 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/presence.h @@ -0,0 +1,161 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef PRESENCE_H__ +#define PRESENCE_H__ + +#include "stanza.h" + +#include + +namespace gloox +{ + + class Capabilities; + class JID; + + /** + * @brief An abstraction of a presence stanza. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Presence : public Stanza + { + + friend class ClientBase; + + public: + + /** + * Describes the different valid presence types. + */ + enum PresenceType + { + Available, /**< The entity is online. */ + Chat, /**< The entity is 'available for chat'. */ + Away, /**< The entity is away. */ + DND, /**< The entity is DND (Do Not Disturb). */ + XA, /**< The entity is XA (eXtended Away). */ + Unavailable, /**< The entity is offline. */ + Probe, /**< This is a presence probe. */ + Error, /**< This is a presence error. */ + Invalid /**< The stanza is invalid. */ + }; + + /** + * Creates a Presence request. + * @param type The presence type. + * @param to The intended receiver. Use an empty JID to create a broadcast packet. + * @param status An optional status message (e.g. "gone fishing"). + * @param priority An optional presence priority. Legal range is between -128 and +127. + * Defaults to 0. + * @param xmllang An optional xml:lang for the status message. + */ + Presence( PresenceType type, const JID& to, const std::string& status = EmptyString, + int priority = 0, const std::string& xmllang = EmptyString ); + + /** + * Destructor. + */ + virtual ~Presence(); + + /** + * Returns the presence's type. + * @return The presence's type. + */ + PresenceType subtype() const { return m_subtype; } + + /** + * A convenience function returning the stanza's Capabilities, if any. May be 0. + * @return A pointer to a Capabilities object, or 0. + */ + const Capabilities* capabilities() const; + + /** + * Returns the presence's type. + * @return The presence's type. + */ +//#warning FIXME return something useful (only 'show' values?) or kill this func + PresenceType presence() const { return m_subtype; } + + /** + * Sets the presence type. + * @param type The presence type. + */ + void setPresence( PresenceType type ) { m_subtype = type; } + + /** + * Returns the status text of a presence stanza for the given language if available. + * If the requested language is not available, the default status text (without a xml:lang + * attribute) will be returned. + * @param lang The language identifier for the desired language. It must conform to + * section 2.12 of the XML specification and RFC 3066. If empty, the default body + * will be returned, if any. + * @return The status text set by the sender. + */ + const std::string status( const std::string& lang = "default" ) const + { + return findLang( m_stati, m_status, lang ); + } + + /** + * Adds a (possibly translated) status message. + * @param status The status message. + * @param lang The language identifier for the desired language. It must conform to + * section 2.12 of the XML specification and RFC 3066. + */ + void addStatus( const std::string& status, const std::string& lang = EmptyString ) + { + setLang( &m_stati, m_status, status, lang ); + } + + /** + * Resets the default status message as well as all language-specific ones. + */ + void resetStatus(); + + /** + * Returns the presence priority in the legal range: -128 to +127. + * @return The priority information contained in the stanza, defaults to 0. + */ + int priority() const { return m_priority; } + + /** + * Sets the priority. Legal range: -128 to +127. + * @param priority The priority to set. + */ + void setPriority( int priority ); + + // reimplemented from Stanza + virtual Tag* tag() const; + + private: +#ifdef PRESENCE_TEST + public: +#endif + /** + * Creates a Presence request from the given Tag. The original Tag will be ripped off. + * @param tag The Tag to parse. + */ + Presence( Tag* tag ); + + PresenceType m_subtype; + StringMap* m_stati; + std::string m_status; + int m_priority; + + }; + +} + +#endif // PRESENCE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/presencehandler.h b/smack/smack/src/main/cpp/gloox/src/presencehandler.h new file mode 100644 index 00000000..4106de01 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/presencehandler.h @@ -0,0 +1,50 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef PRESENCEHANDLER_H__ +#define PRESENCEHANDLER_H__ + +#include "presence.h" + +namespace gloox +{ + + /** + * @brief A virtual interface which can be reimplemented to receive presence stanzas. + * + * Derived classes can be registered as PresenceHandlers with the Client. + * Upon an incoming Presence packet @ref handlePresence() will be called. + * @author Jakob Schröter + */ + class GLOOX_API PresenceHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~PresenceHandler() {} + + /** + * Reimplement this function if you want to be updated on + * incoming presence notifications. + * @param presence The complete stanza. + * @since 1.0 + */ + virtual void handlePresence( const Presence& presence ) = 0; + + }; + +} + +#endif // PRESENCEHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/privacyitem.cpp b/smack/smack/src/main/cpp/gloox/src/privacyitem.cpp new file mode 100644 index 00000000..bfd05293 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privacyitem.cpp @@ -0,0 +1,42 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "privacyitem.h" + +namespace gloox +{ + + PrivacyItem::PrivacyItem( const ItemType type, const ItemAction action, + const int packetType, const std::string& value ) + : m_type( type ), m_action( action ), m_packetType( packetType ), + m_value( value ) + { + } + + PrivacyItem::~PrivacyItem() + { + } + + bool PrivacyItem::operator==( const PrivacyItem& item ) const + { + if( m_type == item.type() + && m_action == item.action() + && m_packetType == item.packetType() + && m_value == item.value() ) + return true; + else + return false; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/privacyitem.h b/smack/smack/src/main/cpp/gloox/src/privacyitem.h new file mode 100644 index 00000000..d22620bc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privacyitem.h @@ -0,0 +1,126 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef PRIVACYITEM_H__ +#define PRIVACYITEM_H__ + +#include "macros.h" +#include "gloox.h" + +#include + +namespace gloox +{ + + /** + * @brief This is an abstraction of a single item of a privacy list, describing an allowed or + * forbidden action. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API PrivacyItem + { + public: + + /** + * Three possible types of an item. Only one is allowed at a time. + */ + enum ItemType + { + TypeUndefined, /**< None of the types below is explicitely selected, + * "fall-through" case. */ + TypeJid, /**< The item affects the JID which is given in the value attribute. */ + TypeGroup, /**< The item affects the group which is given in the value attribute and + * which must exist at least once in the users roster. */ + TypeSubscription /**< The item affects the subscription type which is given in the value + * attribute. */ + }; + + /** + * Two possible actions. Only one is allowed at a time. + */ + enum ItemAction + { + ActionAllow, /**< The item explicitely allows the described packets. */ + ActionDeny /**< The item forbids the described packets. */ + }; + + /** + * The packet type a privacy item affects (blocks). Combinations are allowed. + */ + enum ItemPacketType + { + PacketMessage = 1, /**< The item blocks message stanzas. */ + PacketPresenceIn = 2, /**< The item blocks incoming presence stanzas. */ + PacketPresenceOut = 4, /**< The item blocks outgoing presence stanzas. */ + PacketIq = 8, /**< The item blocks IQ stanzas. */ + PacketAll = 15 /**< The item blocks all of these stanza types. */ + }; + + /** + * Constructs a new privacy item. + * @param type Action is based on matching JID, Group or Subscription. + * @param action The action to carry out. (Deny or allow.) + * @param packetType Affected packet types. Bit-wise OR'ed ItemPacketType. + * @param value The value to check for and match. + */ + PrivacyItem( const ItemType type = TypeUndefined, const ItemAction action = ActionAllow, + const int packetType = 0, const std::string& value = EmptyString ); + + /** + * Virtual destructor. + */ + virtual ~PrivacyItem(); + + /** + * Returns the item type. + * @return The type of the item. + */ + ItemType type() const { return m_type; } + + /** + * Returns the item's action. + * @return The action of the item. + */ + ItemAction action() const { return m_action; } + + /** + * Returns the packet type the item affects. + * @return An OR'ed list of affected packet types. + */ + int packetType() const { return m_packetType; } + + /** + * Returns the value of the item's 'value' attribute. + * @return value The 'value' attribute's value. + */ + const std::string value() const { return m_value; } + + /** + * Compares the current PrivacyItem with another one. + * @param item The item which shall be compared. + * @return @b True if both items are equal, @b false otherwise. + */ + bool operator==( const PrivacyItem& item ) const; + + private: + ItemType m_type; + ItemAction m_action; + int m_packetType; + std::string m_value; + }; + +} + +#endif // PRIVACYITEM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/privacylisthandler.h b/smack/smack/src/main/cpp/gloox/src/privacylisthandler.h new file mode 100644 index 00000000..68a1d01a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privacylisthandler.h @@ -0,0 +1,99 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef PRIVACYLISTHANDLER_H__ +#define PRIVACYLISTHANDLER_H__ + +#include "privacyitem.h" +#include "gloox.h" + +#include +#include + +namespace gloox +{ + + /** + * The possible results of an operation on a privacy list. + */ + enum PrivacyListResult + { + ResultStoreSuccess, /**< Storing was successful. */ + ResultActivateSuccess, /**< Activation was successful. */ + ResultDefaultSuccess, /**< Setting the default list was successful. */ + ResultRemoveSuccess, /**< Removing a list was successful. */ + ResultRequestNamesSuccess, /**< Requesting the list names was successful. */ + ResultRequestListSuccess, /**< The list was requested successfully. */ + ResultConflict, /**< A conflict occurred when activating a list or setting the default + * list. */ + ResultItemNotFound, /**< The requested list does not exist. */ + ResultBadRequest, /**< Bad request. */ + ResultUnknownError /**< An unknown error occured. */ + }; + + /** + * @brief A virtual interface that allows to retrieve Privacy Lists. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API PrivacyListHandler + { + public: + + /** + * A list of PrivacyItems. + */ + typedef std::list PrivacyList; + + /** + * Virtual Destructor. + */ + virtual ~PrivacyListHandler() {} + + /** + * Reimplement this function to retrieve the list of privacy list names after requesting it using + * PrivacyManager::requestListNames(). + * @param active The name of the active list. + * @param def The name of the default list. + * @param lists All the lists. + */ + virtual void handlePrivacyListNames( const std::string& active, const std::string& def, + const StringList& lists ) = 0; + + /** + * Reimplement this function to retrieve the content of a privacy list after requesting it using + * PrivacyManager::requestList(). + * @param name The name of the list. + * @param items A list of PrivacyItem's. + */ + virtual void handlePrivacyList( const std::string& name, const PrivacyList& items ) = 0; + + /** + * Reimplement this function to be notified about new or changed lists. + * @param name The name of the new or changed list. + */ + virtual void handlePrivacyListChanged( const std::string& name ) = 0; + + /** + * Reimplement this function to receive results of stores etc. + * @param id The ID of the request, as returned by the initiating function. + * @param plResult The result of an operation. + */ + virtual void handlePrivacyListResult( const std::string& id, PrivacyListResult plResult ) = 0; + + }; + +} + +#endif // PRIVACYLISTHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/privacymanager.cpp b/smack/smack/src/main/cpp/gloox/src/privacymanager.cpp new file mode 100644 index 00000000..4389230a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privacymanager.cpp @@ -0,0 +1,316 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "privacymanager.h" +#include "clientbase.h" +#include "error.h" + +namespace gloox +{ + + // ---- PrivacyManager::Query ---- + PrivacyManager::Query::Query( const Tag* tag ) + : StanzaExtension( ExtPrivacy ) + { + if( !tag ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + const std::string& name = (*it)->findAttribute( "name" ); + if( (*it)->name() == "default" ) + m_default = name; + else if( (*it)->name() == "active" ) + m_active = name; + else if( (*it)->name() == "list" ) + { + m_names.push_back( name ); + + const TagList& l = (*it)->children(); + TagList::const_iterator it_l = l.begin(); + for( ; it_l != l.end(); ++it_l ) + { + PrivacyItem::ItemType type; + PrivacyItem::ItemAction action; + int packetType = 0; + + const std::string& t = (*it_l)->findAttribute( TYPE ); + if( t == "jid" ) + type = PrivacyItem::TypeJid; + else if( t == "group" ) + type = PrivacyItem::TypeGroup; + else if( t == "subscription" ) + type = PrivacyItem::TypeSubscription; + else + type = PrivacyItem::TypeUndefined; + + const std::string& a = (*it_l)->findAttribute( "action" ); + if( a == "allow" ) + action = PrivacyItem::ActionAllow; + else if( a == "deny" ) + action = PrivacyItem::ActionDeny; + else + action = PrivacyItem::ActionAllow; + + const std::string& value = (*it_l)->findAttribute( "value" ); + + const TagList& c = (*it_l)->children(); + TagList::const_iterator it_c = c.begin(); + for( ; it_c != c.end(); ++it_c ) + { + if( (*it_c)->name() == "iq" ) + packetType |= PrivacyItem::PacketIq; + else if( (*it_c)->name() == "presence-out" ) + packetType |= PrivacyItem::PacketPresenceOut; + else if( (*it_c)->name() == "presence-in" ) + packetType |= PrivacyItem::PacketPresenceIn; + else if( (*it_c)->name() == "message" ) + packetType |= PrivacyItem::PacketMessage; + } + + PrivacyItem item( type, action, packetType, value ); + m_items.push_back( item ); + } + } + } + } + + PrivacyManager::Query::Query( IdType context, const std::string& name, + const PrivacyListHandler::PrivacyList& list ) + : StanzaExtension( ExtPrivacy ), m_context( context ), m_items( list ) + { + m_names.push_back( name ); + } + + PrivacyManager::Query::~Query() + { + } + + const std::string& PrivacyManager::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_PRIVACY + "']"; + return filter; + } + + Tag* PrivacyManager::Query::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_PRIVACY ); + + std::string child; + switch( m_context ) + { + case PLRequestList: + case PLRemove: + case PLStore: + child = "list"; + break; + case PLDefault: + case PLUnsetDefault: + child = "default"; + break; + case PLActivate: + case PLUnsetActivate: + child = "active"; + break; + default: + case PLRequestNames: + return t; + break; + } + Tag* c = new Tag( t, child ); + + if( !m_names.empty() ) + c->addAttribute( "name", (*m_names.begin()) ); + + int count = 0; + PrivacyListHandler::PrivacyList::const_iterator it = m_items.begin(); + for( ; it != m_items.end(); ++it ) + { + Tag* i = new Tag( c, "item" ); + + switch( (*it).type() ) + { + case PrivacyItem::TypeJid: + i->addAttribute( TYPE, "jid" ); + break; + case PrivacyItem::TypeGroup: + i->addAttribute( TYPE, "group" ); + break; + case PrivacyItem::TypeSubscription: + i->addAttribute( TYPE, "subscription" ); + break; + default: + break; + } + + switch( (*it).action() ) + { + case PrivacyItem::ActionAllow: + i->addAttribute( "action", "allow" ); + break; + case PrivacyItem::ActionDeny: + i->addAttribute( "action", "deny" ); + break; + } + + int pType = (*it).packetType(); + if( pType != 15 ) + { + if( pType & PrivacyItem::PacketMessage ) + new Tag( i, "message" ); + if( pType & PrivacyItem::PacketPresenceIn ) + new Tag( i, "presence-in" ); + if( pType & PrivacyItem::PacketPresenceOut ) + new Tag( i, "presence-out" ); + if( pType & PrivacyItem::PacketIq ) + new Tag( i, "iq" ); + } + + i->addAttribute( "value", (*it).value() ); + i->addAttribute( "order", ++count ); + } + + return t; + } + // ---- ~PrivacyManager::Query ---- + + // ---- PrivacyManager ---- + PrivacyManager::PrivacyManager( ClientBase* parent ) + : m_parent( parent ), m_privacyListHandler( 0 ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new Query() ); + m_parent->registerIqHandler( this, ExtPrivacy ); + } + } + + PrivacyManager::~PrivacyManager() + { + if( m_parent ) + { + m_parent->removeIqHandler( this, ExtPrivacy ); + m_parent->removeIDHandler( this ); + } + } + + std::string PrivacyManager::operation( IdType context, const std::string& name ) + { + const std::string& id = m_parent->getID(); + IQ::IqType iqType = IQ::Set; + if( context == PLRequestNames || context == PLRequestList ) + iqType = IQ::Get; + IQ iq( iqType, JID(), id ); + iq.addExtension( new Query( context, name ) ); + m_parent->send( iq, this, context ); + return id; + } + + std::string PrivacyManager::store( const std::string& name, const PrivacyListHandler::PrivacyList& list ) + { + if( list.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + + IQ iq( IQ::Set, JID(), id ); + iq.addExtension( new Query( PLStore, name, list ) ); + m_parent->send( iq, this, PLStore ); + return id; + } + + bool PrivacyManager::handleIq( const IQ& iq ) + { + const Query* q = iq.findExtension( ExtPrivacy ); + if( iq.subtype() != IQ::Set || !m_privacyListHandler + || !q || q->name().empty() ) + return false; + + m_privacyListHandler->handlePrivacyListChanged( q->name() ); + IQ re( IQ::Result, JID(), iq.id() ); + m_parent->send( re ); + return true; + } + + void PrivacyManager::handleIqID( const IQ& iq, int context ) + { + if( !m_privacyListHandler ) + return; + + switch( iq.subtype() ) + { + case IQ::Result: + switch( context ) + { + case PLStore: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultStoreSuccess ); + break; + case PLActivate: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultActivateSuccess ); + break; + case PLDefault: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultDefaultSuccess ); + break; + case PLRemove: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultRemoveSuccess ); + break; + case PLRequestNames: + { + const Query* q = iq.findExtension( ExtPrivacy ); + if( !q ) + return; + m_privacyListHandler->handlePrivacyListNames( q->def(), q->active(), + q->names() ); + break; + } + case PLRequestList: + { + const Query* q = iq.findExtension( ExtPrivacy ); + if( !q ) + return; + m_privacyListHandler->handlePrivacyList( q->name(), q->items() ); + break; + } + } + break; + + case IQ::Error: + { + switch( iq.error()->error() ) + { + case StanzaErrorConflict: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultConflict ); + break; + case StanzaErrorItemNotFound: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultItemNotFound ); + break; + case StanzaErrorBadRequest: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultBadRequest ); + break; + default: + m_privacyListHandler->handlePrivacyListResult( iq.id(), ResultUnknownError ); + break; + } + break; + } + + default: + break; + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/privacymanager.h b/smack/smack/src/main/cpp/gloox/src/privacymanager.h new file mode 100644 index 00000000..9b7a9611 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privacymanager.h @@ -0,0 +1,231 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef PRIVACYMANAGER_H__ +#define PRIVACYMANAGER_H__ + +#include "iqhandler.h" +#include "privacylisthandler.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class ClientBase; + + /** + * @brief This class implements a manager for privacy lists as defined in section 10 of RFC 3921. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API PrivacyManager : public IqHandler + { + public: + /** + * Constructs a new PrivacyManager. + * @param parent The ClientBase to use for communication. + */ + PrivacyManager( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~PrivacyManager(); + + /** + * Stores the given list on the server. If a list with the given name exists, the existing + * list is overwritten. + * @param name The list's name. + * @param list A non empty list of privacy items which describe the list. + */ + std::string store( const std::string& name, const PrivacyListHandler::PrivacyList& list ); + + /** + * Triggers the request of the privacy lists currently stored on the server. + */ + std::string requestListNames() + { return operation( PLRequestNames, EmptyString ); } + + /** + * Triggers the retrieval of the named privacy lists. + * @param name The name of the list to retrieve. + */ + std::string requestList( const std::string& name ) + { return operation( PLRequestList, name ); } + + /** + * Removes a list by its name. + * @param name The name of the list to remove. + */ + std::string removeList( const std::string& name ) + { return operation( PLRemove, name ); } + + /** + * Sets the named list as the default list, i.e. active by default after login. + * @param name The name of the list to set as default. + */ + std::string setDefault( const std::string& name ) + { return operation( PLDefault, name ); } + + /** + * This function declines the use of any default list. + */ + std::string unsetDefault() + { return operation( PLUnsetDefault, EmptyString ); } + + /** + * Sets the named list as active, i.e. active for this session + * @param name The name of the list to set active. + */ + std::string setActive( const std::string& name ) + { return operation( PLActivate, name ); } + + /** + * This function declines the use of any active list. + */ + std::string unsetActive() + { return operation( PLUnsetActivate, EmptyString ); } + + /** + * Use this function to register an object as PrivacyListHandler. + * Only one PrivacyListHandler at a time is possible. + * @param plh The object to register as handler for privacy list related events. + */ + void registerPrivacyListHandler( PrivacyListHandler* plh ) + { m_privacyListHandler = plh; } + + /** + * Use this function to clear the registered PrivacyListHandler. + */ + void removePrivacyListHandler() + { m_privacyListHandler = 0; } + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: + enum IdType + { + PLRequestNames, + PLRequestList, + PLActivate, + PLDefault, + PLUnsetActivate, + PLUnsetDefault, + PLRemove, + PLStore + }; + + class Query : public StanzaExtension + { + public: + /** + * Creates a new query for storing or requesting a + * privacy list. + * @param context The context of the list. + * @param name The list's name. + * @param list The list's (optional) content. + */ + Query( IdType context, const std::string& name, + const PrivacyListHandler::PrivacyList& list = PrivacyListHandler::PrivacyList() ); + + /** + * Creates a new query from the given Tag. + * @param tag The Tag to parse. + */ + Query( const Tag* tag = 0 ); + + /** + * Virtual destructor. + */ + virtual ~Query(); + + /** + * Returns the name of the active list, if given. + * @return The active list's name. + */ + const std::string& active() const { return m_active; } + + /** + * Returns the name of the default list, if given. + * @return The default list's name. + */ + const std::string& def() const { return m_default; } + + /** + * Returns a list of privacy items, if given. + * @return A list of PrivacyItems. + */ + const PrivacyListHandler::PrivacyList& items() const + { return m_items; } + + /** + * Returns a list of list names. + * @return A list of list names. + */ + const StringList& names() const { return m_names; } + + /** + * A convenience function that returns the first name of the list that + * names() would return, or an empty string. + * @return A list name. + */ + const std::string& name() const + { + if( m_names.empty()) + return EmptyString; + else + return (*m_names.begin()); + } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Query( *this ); + } + + private: + IdType m_context; + StringList m_names; + std::string m_default; + std::string m_active; + PrivacyListHandler::PrivacyList m_items; + }; + + std::string operation( IdType context, const std::string& name ); + + ClientBase* m_parent; + PrivacyListHandler* m_privacyListHandler; + }; + +} + +#endif // PRIVACYMANAGER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/privatexml.cpp b/smack/smack/src/main/cpp/gloox/src/privatexml.cpp new file mode 100644 index 00000000..fea36972 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privatexml.cpp @@ -0,0 +1,129 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "privatexml.h" +#include "clientbase.h" +#include "stanza.h" + +namespace gloox +{ + + // ---- PrivateXML::Query ---- + PrivateXML::Query::Query( const Tag* tag ) + : StanzaExtension( ExtPrivateXML ), m_privateXML( 0 ) + { + if( !tag ) + return; + + if( tag->name() == "query" && tag->xmlns() == XMLNS_PRIVATE_XML ) + { + if( tag->children().size() ) + m_privateXML = tag->children().front()->clone(); + } + else + m_privateXML = tag; + } + + const std::string& PrivateXML::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_PRIVATE_XML + "']"; + return filter; + } + + Tag* PrivateXML::Query::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_PRIVATE_XML ); + if( m_privateXML ) + t->addChild( m_privateXML->clone() ); + return t; + } + // ---- ~PrivateXML::Query ---- + + // ---- PrivateXML ---- + PrivateXML::PrivateXML( ClientBase* parent ) + : m_parent( parent ) + { + if( !m_parent ) + return; + + m_parent->registerIqHandler( this, ExtPrivateXML ); + m_parent->registerStanzaExtension( new Query() ); + } + + PrivateXML::~PrivateXML() + { + if( !m_parent ) + return; + + m_parent->removeIqHandler( this, ExtPrivateXML ); + m_parent->removeIDHandler( this ); + m_parent->removeStanzaExtension( ExtPrivateXML ); + } + + std::string PrivateXML::requestXML( const std::string& tag, const std::string& xmlns, + PrivateXMLHandler* pxh ) + { + const std::string& id = m_parent->getID(); + + IQ iq( IQ::Get, JID(), id ); + iq.addExtension( new Query( tag, xmlns ) ); + + m_track[id] = pxh; + m_parent->send( iq, this, RequestXml ); + + return id; + } + + std::string PrivateXML::storeXML( const Tag* tag, PrivateXMLHandler* pxh ) + { + const std::string& id = m_parent->getID(); + + IQ iq( IQ::Set, JID(), id ); + iq.addExtension( new Query( tag ) ); + + m_track[id] = pxh; + m_parent->send( iq, this, StoreXml ); + + return id; + } + + void PrivateXML::handleIqID( const IQ& iq, int context ) + { + TrackMap::iterator t = m_track.find( iq.id() ); + if( t == m_track.end() ) + return; + + if( iq.subtype() == IQ::Result ) + { + if( context == RequestXml ) + { + const Query* q = iq.findExtension( ExtPrivateXML ); + if( q ) + (*t).second->handlePrivateXML( q->privateXML() ); + } + else if( context == StoreXml ) + (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlStoreOk ); + } + else if( iq.subtype() == IQ::Error ) + { + if( context == RequestXml ) + (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlRequestError ); + else if( context == StoreXml ) + (*t).second->handlePrivateXMLResult( iq.id(), PrivateXMLHandler::PxmlStoreError ); + } + + m_track.erase( t ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/privatexml.h b/smack/smack/src/main/cpp/gloox/src/privatexml.h new file mode 100644 index 00000000..3f5d0a95 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privatexml.h @@ -0,0 +1,160 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef PRIVATEXML_H__ +#define PRIVATEXML_H__ + +#include "iqhandler.h" +#include "privatexmlhandler.h" + +#include +#include +#include + +namespace gloox +{ + + class ClientBase; + class Tag; + class Stanza; + + /** + * @brief This class implements @xep{0049} (Private XML Storage). + * + * @author Jakob Schröter + */ + class GLOOX_API PrivateXML : public IqHandler + { + public: + /** + * Constructor. + * Creates a new PrivateXML client that registers as IqHandler + * with @c ClientBase. + * @param parent The ClientBase used for XMPP communication + */ + PrivateXML( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~PrivateXML(); + + /** + * Use this function to request the private XML stored in the given namespace. + * @param tag Child element of the query element used to identify the requested XML fragment. + * @param xmlns The namespace which qualifies the tag. + * @param pxh The handler to receive the result. + * @return The ID of the sent query. + */ + std::string requestXML( const std::string& tag, const std::string& xmlns, PrivateXMLHandler* pxh ); + + /** + * Use this function to store private XML stored in the given namespace. + * @param tag The XML to store. This is the complete tag including the unique namespace. + * It is deleted automatically after sending it. + * @param pxh The handler to receive the result. + * @return The ID of the sent query. + */ + std::string storeXML( const Tag* tag, PrivateXMLHandler* pxh ); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ) { (void)iq; return false; } + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + protected: + ClientBase* m_parent; + + private: +#ifdef PRIVATEXML_TEST + public: +#endif + /** + * @brief An implementation of the Private XML Storage protocol as StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class Query : public StanzaExtension + { + public: + /** + * Constructs a new Query object suitable for use with Private XML Storage. + * @param tag The private XML's element name. + * @param xmlns The private XML's namespace. + */ + Query( const std::string& tag, const std::string& xmlns ) + : StanzaExtension( ExtPrivateXML ) + { + m_privateXML = new Tag( tag, XMLNS, xmlns ); + } + + /** + * Constructs a new Query object suitable for storing an XML fragment in + * Private XML Storage. + * @param tag The private XML element to store. The Query object will own the Tag. + */ + Query( const Tag* tag = 0 ); + + /** + * Destructor. + */ + ~Query() { delete m_privateXML; } + + /** + * Returns the private XML fragment. The Tag is owned by the Query object. + * @return The stored private XML fragment. + */ + const Tag* privateXML() const { return m_privateXML; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + Query* q = new Query(); + q->m_privateXML = m_privateXML ? m_privateXML->clone() : 0; + return q; + } + + private: + const Tag* m_privateXML; + + }; + + enum IdType + { + RequestXml, + StoreXml + }; + + typedef std::map TrackMap; + + TrackMap m_track; + }; + +} + +#endif // PRIVATEXML_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/privatexmlhandler.h b/smack/smack/src/main/cpp/gloox/src/privatexmlhandler.h new file mode 100644 index 00000000..b20cc1ad --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/privatexmlhandler.h @@ -0,0 +1,73 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef PRIVATEXMLHANDLER_H__ +#define PRIVATEXMLHANDLER_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief A virtual interface which can be reimplemented to store and receive private XML data. + * + * Derived classes can be registered as PrivateXMLHandlers with the PrivateXML object. + * Upon an incoming PrivateXML packet @ref handlePrivateXML() will be called. + * + * @author Jakob Schröter + */ + class GLOOX_API PrivateXMLHandler + { + public: + /** + * Describes the possible results of a 'store' or 'request' operation. + */ + enum PrivateXMLResult + { + PxmlStoreOk, /**< Storing was successful. */ + PxmlStoreError, /**< An error occurred while storing data in Private XML. */ + PxmlRequestError /**< An error occurred while requesting Private XML. */ + }; + + /** + * Virtual Destructor. + */ + virtual ~PrivateXMLHandler() {} + + /** + * Reimplement this function to receive the private XML that was requested earlier using + * @c PrivateXML::requestXML(). + * @param xml The private xml, i.e. the first child of the <query> tag. + * May be 0. You should not delete the object. + */ + virtual void handlePrivateXML( const Tag* xml ) = 0; + + /** + * This function is called to notify about the result of a 'store' or 'request' operation + * (successful requests are announced by means of handlePrivateXML()). + * @param uid The ID of the query. + * @param pxResult The result of the operation. + * @since 0.7 + */ + virtual void handlePrivateXMLResult( const std::string& uid, PrivateXMLResult pxResult ) = 0; + }; + +} + +#endif // PRIVATEXMLHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/pubsub.h b/smack/smack/src/main/cpp/gloox/src/pubsub.h new file mode 100644 index 00000000..9f5c9ae1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsub.h @@ -0,0 +1,249 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef PUBSUB_H__ +#define PUBSUB_H__ + +#include +#include + +#include "gloox.h" +#include "jid.h" + +namespace gloox +{ + /** + * @brief Namespace holding all the Pubsub-related structures and definitions. + */ + namespace PubSub + { + + class Item; + + /** + * Describes the different node types. + */ + enum NodeType + { + NodeLeaf, /**< A node that contains published items only. It is NOT + * a container for other nodes. */ + NodeCollection, /**< A node that contains nodes and/or other collections but + * no published items. Collections make it possible to represent + * hierarchial node structures. */ + NodeInvalid /**< Invalid node type */ + }; + + /** + * Describes the different node affiliation types. + */ + enum AffiliationType + { + AffiliationNone, /**< No particular affiliation type. */ + AffiliationPublisher, /**< Entity is allowed to publish items. */ + AffiliationOwner, /**< Manager for the node. */ + AffiliationOutcast, /**< Entity is disallowed from subscribing or publishing. */ + AffiliationInvalid /**< Invalid Affiliation type. */ + }; + + /** + * Describes the different subscription types. + */ + enum SubscriptionType + { + SubscriptionNone, /**< The node MUST NOT send event notifications or payloads to the + * Entity. */ + SubscriptionSubscribed, /**< An entity is subscribed to a node. The node MUST send all event + * notifications (and, if configured, payloads) to the entity while it + * is in this state. */ + SubscriptionPending, /**< An entity has requested to subscribe to a node and the request + * has not yet been approved by a node owner. The node MUST NOT send + * event notifications or payloads to the entity while it is in this + * state. */ + SubscriptionUnconfigured, /**< An entity has subscribed but its subscription options have not yet + * been configured. The node MAY send event notifications or payloads + * to the entity while it is in this state. The service MAY timeout + * unconfigured subscriptions. */ + SubscriptionInvalid /**< Invalid subscription type. */ + }; + + /** + * Event types. + */ + enum EventType + { + EventCollection, /**< A Collection node has been created. */ + EventConfigure, /**< A node's configuration has changed. */ + EventDelete, /**< A node has been deleted. */ + EventItems, /**< An item has been created or modified. */ + EventItemsRetract, /**< An item has been deleted. */ + EventPurge, /**< A Leaf node has been purged. */ + EventSubscription, /**< A user's subscription has been processed. */ + EventUnknown /**< Unknown event. */ + }; + + /** + * Describes the different subscription types. + */ + enum SubscriptionObject + { + SubscriptionNodes, /**< Receive notification of new nodes only. */ + SubscriptionItems /**< Receive notification of new items only. */ + }; + + /** + * Describes the access types. + */ + enum AccessModel + { + AccessOpen, /**< Any entity may subscribe to the node (i.e., without the necessity + * for subscription approval) and any entity may retrieve items from the + * node (i.e., without being subscribed); this SHOULD be the default + * access model for generic pubsub services. */ + AccessPresence, /**< Any entity with a subscription of type "from" or "both" may subscribe + * to the node and retrieve items from the node; this access model applies + * mainly to instant messaging systems (see RFC 3921). */ + AccessRoster, /**< Any entity in the specified roster group(s) may subscribe to the node + * and retrieve items from the node; this access model applies mainly to + * instant messaging systems (see RFC 3921). */ + AccessAuthorize, /**< The node owner must approve all subscription requests, and only + * subscribers may retrieve items from the node. */ + AccessWhitelist, /**< An entity may be subscribed only through being added to a whitelist + * by the node owner (unsolicited subscription requests are rejected), and + * only subscribers may retrieve items from the node. In effect, the + * default affiliation is outcast. The node owner MUST automatically be + * on the whitelist. In order to add entities to the whitelist, the + * node owner SHOULD use the protocol specified in the Manage Affiliated + * Entities section of this document. */ + AccessDefault /**< Unspecified (default) Access Model (does not represent a real access + * type by itself). */ + }; + + /** + * Describes the different PubSub features (@xep{0060} Sect. 10). + */ + enum PubSubFeature + { + FeatureCollections = 1, /**< Collection nodes are supported. RECOMMENDED */ + FeatureConfigNode = 1<<1, /**< Configuration of node options is supported. RECOMMENDED */ + FeatureCreateAndConfig = 1<<2, /**< Simultaneous creation and configuration of nodes is + * supported. RECOMMENDED */ + FeatureCreateNodes = 1<<3, /**< Creation of nodes is supported. RECOMMENDED */ + FeatureDeleteAny = 1<<4, /**< Any publisher may delete an item (not only the originating + * publisher). OPTIONAL */ + FeatureDeleteNodes = 1<<5, /**< Deletion of nodes is supported. RECOMMENDED */ + FeatureGetPending = 1<<6, /**< Retrieval of pending subscription approvals is supported. + * OPTIONAL */ + FeatureInstantNodes = 1<<7, /**< Creation of instant nodes is supported. RECOMMENDED */ + FeatureItemIDs = 1<<8, /**< Publishers may specify item identifiers. RECOMMENDED */ + FeatureLeasedSubscription = 1<<9, /**< Time-based subscriptions are supported. OPTIONAL */ + FeatureManageSubscriptions = 1<<10, /**< Node owners may manage subscriptions. OPTIONAL */ + FeatureMetaData = 1<<11, /**< Node meta-data is supported. RECOMMENDED */ + FeatureModifyAffiliations = 1<<12, /**< Node owners may modify affiliations. OPTIONAL */ + FeatureMultiCollection = 1<<13, /**< A single leaf node may be associated with multiple + * collections. OPTIONAL */ + FeatureMultiSubscribe = 1<<14, /**< A single entity may subscribe to a node multiple times. + * OPTIONAL */ + FeaturePutcastAffiliation = 1<<15, /**< The outcast affiliation is supported. RECOMMENDED */ + FeaturePersistentItems = 1<<16, /**< Persistent items are supported. RECOMMENDED */ + FeaturePresenceNotifications = 1<<17, /**< Presence-based delivery of event notifications is supported. + * OPTIONAL */ + FeaturePublish = 1<<18, /**< Publishing items is supported (note: not valid for collection + * nodes). REQUIRED */ + FeaturePublisherAffiliation = 1<<19, /**< The publisher affiliation is supported. OPTIONAL */ + FeaturePurgeNodes = 1<<20, /**< Purging of nodes is supported. OPTIONAL */ + FeatureRetractItems = 1<<21, /**< Item retraction is supported. OPTIONAL */ + FeatureRetrieveAffiliations = 1<<22, /**< Retrieval of current affiliations is supported. + * RECOMMENDED */ + FeatureRetrieveDefault = 1<<23, /**< Retrieval of default node configuration is supported. + * RECOMMENDED */ + FeatureRetrieveItems = 1<<24, /**< Item retrieval is supported. RECOMMENDED */ + FeatureRetrieveSubscriptions = 1<<25, /**< Retrieval of current subscriptions is supported. + * RECOMMENDED */ + FeatureSubscribe = 1<<26, /**< Subscribing and unsubscribing are supported. REQUIRED */ + FeatureSubscriptionOptions = 1<<27, /**< Configuration of subscription options is supported. + * OPTIONAL */ + FeatureSubscriptionNotifs = 1<<28, /**< Notification of subscription state changes is supported. */ + FeatureUnknown = 1<<29 /**< Unrecognized feature */ + }; + +// [Persistent - Notification] +/* Publisher MUST include an <item/> element, which MAY be empty or contain a payload; if item ID is not provided by publisher, it MUST be generated by pubsub service */ + +// [Persistent - Payload] +/* Publisher MUST include an <item/> element that contains the payload; if item ID is not provided by publisher, it MUST be generated by pubsub service */ + +// [Transient - Notification] +/* Publisher MUST NOT include an <item/> element (therefore item ID is neither provided nor generated) but the notification will include an empty <items/> element */ + +// [Transient - Payload] +/* Publisher MUST include an <item/> element that contains the payload, but the item ID is OPTIONAL */ + + /** + * Describes a subscribed entity. + */ + struct Subscriber + { + Subscriber( const JID& _jid, + SubscriptionType _type, + const std::string& _subid = EmptyString) + : jid( _jid ), type( _type ), subid( _subid ) {} + JID jid; + SubscriptionType type; + std::string subid; + }; + + /** + * Describes an Affiliate. + */ + struct Affiliate + { + Affiliate( const JID& _jid, AffiliationType _type ) + : jid( _jid ), type( _type ) {} + JID jid; + AffiliationType type; + }; + + typedef std::list SubscriberList; + typedef std::list AffiliateList; + + /** + * Struct used to track info between requests. + * + */ + struct TrackedInfo + { + JID service; + std::string node; + std::string item; + std::string sid; + }; + + /** + * Struct used for subscription info. + */ + struct SubscriptionInfo + { + SubscriptionType type; + JID jid; + std::string subid; + }; + + typedef std::list SubscriptionList; + typedef std::map SubscriptionMap; + typedef std::map AffiliationMap; + typedef std::list ItemList; + + } + +} + +#endif // PUBSUB_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/pubsubevent.cpp b/smack/smack/src/main/cpp/gloox/src/pubsubevent.cpp new file mode 100644 index 00000000..d70985a1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsubevent.cpp @@ -0,0 +1,278 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "pubsubevent.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + namespace PubSub + { + + static const char* eventTypeValues[] = { + "collection", + "configuration", + "delete", + "items", + "items", + "purge", + "subscription" + }; + + Event::ItemOperation::ItemOperation( const ItemOperation& right ) + : retract( right.retract ), item( right.item ), + payload( right.payload ? right.payload->clone() : 0 ) + { + } + + Event::Event( const Tag* event ) + : StanzaExtension( ExtPubSubEvent ), m_type( PubSub::EventUnknown ), + m_subscriptionIDs( 0 ), m_config( 0 ), m_itemOperations( 0 ), m_subscription( false ) + { + if( !event || event->name() != "event" ) + return; + + const TagList& events = event->children(); + TagList::const_iterator it = events.begin(); + const Tag* tag = 0; + for( ; it != events.end(); ++it ) + { + tag = (*it); + PubSub::EventType type = (PubSub::EventType)util::lookup( tag->name(), eventTypeValues ); + + switch( type ) + { + case PubSub::EventCollection: + tag = tag->findChild( "node" ); + if( tag ) + { + m_node = tag->findAttribute( "id" ); + if( ( m_config = tag->findChild( "x" ) ) ) + m_config = m_config->clone(); + } + break; + + case PubSub::EventConfigure: + case PubSub::EventDelete: + case PubSub::EventPurge: + m_node = tag->findAttribute( "node" ); + if( type == PubSub::EventConfigure + && ( m_config = tag->findChild( "x" ) ) ) + m_config = m_config->clone(); + break; + + case PubSub::EventItems: + case PubSub::EventItemsRetract: + { + if( !m_itemOperations ) + m_itemOperations = new ItemOperationList(); + + m_node = tag->findAttribute( "node" ); + const TagList& items = tag->children(); + TagList::const_iterator itt = items.begin(); + for( ; itt != items.end(); ++itt ) + { + tag = (*itt); + bool retract = false; + if( tag->name() == "retract" ) + { + retract = true; + type = PubSub::EventItemsRetract; + } + ItemOperation* op = new ItemOperation( retract, + tag->findAttribute( "id" ), + tag->clone() ); + m_itemOperations->push_back( op ); + } + break; + } + + case EventSubscription: + { + m_node = tag->findAttribute( "node" ); + m_jid.setJID( tag->findAttribute( "jid" ) ); + m_subscription = tag->hasAttribute( "subscription", "subscribed" ); + break; + } + + case PubSub::EventUnknown: + if( type == PubSub::EventUnknown ) + { + if( tag->name() != "headers" || m_subscriptionIDs != 0 ) + { + m_valid = false; + return; + } + + m_subscriptionIDs = new StringList(); + + const TagList& headers = tag->children(); + TagList::const_iterator ith = headers.begin(); + for( ; ith != headers.end(); ++ith ) + { + const std::string& name = (*ith)->findAttribute( "name" ); + if( name == "pubsub#subid" ) + m_subscriptionIDs->push_back( (*ith)->cdata() ); + else if( name == "pubsub#collection" ) + m_collection = (*ith)->cdata(); + } + } + + default: + continue; + } + m_type = type; + } + + m_valid = true; + } + + Event::Event( const std::string& node, PubSub::EventType type ) + : StanzaExtension( ExtPubSubEvent ), m_type( type ), + m_node( node ), m_subscriptionIDs( 0 ), m_config( 0 ), + m_itemOperations( 0 ) + { + if( type != PubSub::EventUnknown ) + m_valid = true; + } + + Event::~Event() + { + delete m_subscriptionIDs; + delete m_config; + if( m_itemOperations ) + { + ItemOperationList::iterator it = m_itemOperations->begin(); + for( ; it != m_itemOperations->end(); ++it ) + { + delete (*it)->payload; + delete (*it); + } + delete m_itemOperations; + } + } + + void Event::addItem( ItemOperation* op ) + { + if( !m_itemOperations ) + m_itemOperations = new ItemOperationList(); + + m_itemOperations->push_back( op ); + } + + const std::string& Event::filterString() const + { + static const std::string filter = "/message/event[@xmlns='" + XMLNS_PUBSUB_EVENT + "']"; + return filter; + } + + Tag* Event::tag() const + { + if( !m_valid ) + return 0; + + Tag* event = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + Tag* child = new Tag( event, util::lookup( m_type, eventTypeValues ) ); + + Tag* item = 0; + + switch( m_type ) + { + case PubSub::EventCollection: + { + item = new Tag( child, "node", "id", m_node ); + item->addChildCopy( m_config ); + break; + } + + case PubSub::EventPurge: + case PubSub::EventDelete: + case PubSub::EventConfigure: + child->addAttribute( "node", m_node ); + if( m_type == PubSub::EventConfigure ) + child->addChildCopy( m_config ); + break; + + case PubSub::EventItems: + case PubSub::EventItemsRetract: + { + child->addAttribute( "node", m_node ); + if( m_itemOperations ) + { +// Tag* item; + ItemOperation* op; + ItemOperationList::const_iterator itt = m_itemOperations->begin(); + for( ; itt != m_itemOperations->end(); ++itt ) + { + op = (*itt); +// item = new Tag( child, op->retract ? "retract" : "item", "id", op->item ); + if( op->payload ) + child->addChildCopy( op->payload ); + } + } + break; + } + + case EventSubscription: + { + child->addAttribute( "node", m_node ); + child->addAttribute( "jid", m_jid.full() ); + child->addAttribute( "subscription", m_subscription ? "subscribed" : "none" ); + break; + } + + default: + delete event; + return 0; + } + + if( m_subscriptionIDs || !m_collection.empty() ) + { + Tag* headers = new Tag( event, "headers", XMLNS, "http://jabber.org/protocol/shim" ); + StringList::const_iterator it = m_subscriptionIDs->begin(); + for( ; it != m_subscriptionIDs->end(); ++it ) + { + (new Tag( headers, "header", "name", "pubsub#subid" ))->setCData( (*it) ); + } + + if( !m_collection.empty() ) + (new Tag( headers, "header", "name", "pubsub#collection" ) ) + ->setCData( m_collection ); + } + + return event; + } + + StanzaExtension* Event::clone() const + { + Event* e = new Event( m_node, m_type ); + e->m_subscriptionIDs = m_subscriptionIDs ? new StringList( *m_subscriptionIDs ) : 0; + e->m_config = m_config ? m_config->clone() : 0; + if( m_itemOperations ) + { + e->m_itemOperations = new ItemOperationList(); + ItemOperationList::const_iterator it = m_itemOperations->begin(); + for( ; it != m_itemOperations->end(); ++it ) + e->m_itemOperations->push_back( new ItemOperation( *(*it) ) ); + } + else + e->m_itemOperations = 0; + + e->m_collection = m_collection; + return e; + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/pubsubevent.h b/smack/smack/src/main/cpp/gloox/src/pubsubevent.h new file mode 100644 index 00000000..574e6327 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsubevent.h @@ -0,0 +1,173 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef PUBSUBEVENT_H__ +#define PUBSUBEVENT_H__ + +#include "stanzaextension.h" +#include "pubsub.h" +#include "gloox.h" + +namespace gloox +{ + + class Tag; + + namespace PubSub + { + + /** + * @brief This is an implementation of a PubSub Notification as a StanzaExtension. + * + * @author Vincent Thomasset + * @since 1.0 + */ + class GLOOX_API Event : public StanzaExtension + { + public: + + /** + * Stores a retract or item notification. + */ + struct ItemOperation + { + /** + * Constructor. + * + * @param remove Whether this is a retract operation or not (ie item). + * @param itemid Item ID of this item. + * @param pld Payload for this object (in the case of a non transient + * item notification). + */ + ItemOperation( bool remove, const std::string& itemid, const Tag* pld = 0 ) + : retract( remove ), item( itemid ), payload( pld ) + {} + + /** + * Copy constructor. + * @param right The ItemOperation to copy from. + */ + ItemOperation( const ItemOperation& right ); + + bool retract; + std::string item; + const Tag* payload; + }; + + /** + * A list of ItemOperations. + */ + typedef std::list ItemOperationList; + + /** + * PubSub event notification Stanza Extension. + * @param event A tag to parse. + */ + Event( const Tag* event ); + + /** + * PubSub event notification Stanza Extension. + * @param node The node's ID for which the notification is sent. + * @param type The event's type. + */ + Event( const std::string& node, PubSub::EventType type ); + + /** + * Virtual destructor. + */ + virtual ~Event(); + + /** + * Returns the event's type. + * @return The event's type. + */ + PubSub::EventType type() const { return m_type; } + + /** + * Returns the list of subscription IDs for which this notification + * is valid. + * @return The list of subscription IDs. + */ + const StringList& subscriptions() const + { return m_subscriptionIDs ? *m_subscriptionIDs : m_emptyStringList; } + + /** + * Returns the list of ItemOperations for EventItems(Retract) notification. + * @return The list of ItemOperations. + */ + const ItemOperationList& items() const + { return m_itemOperations ? *m_itemOperations : m_emptyOperationList; } + + /** + * Add an item to the list of ItemOperations for EventItems(Retract) notification. + * After calling, the PubSub::Event object owns the ItemOperation and will free it. + * @param op An ItemOperation to add. + */ + void addItem( ItemOperation* op ); + + /** + * Returns the node's ID for which the notification is sent. + * @return The node's ID. + */ + const std::string& node() const { return m_node; } + + /** + * Returns the subscribe/unsubscribed JID. Only set for subscription notifications + * (type() == EventSubscription). + * @return The affected JID. + */ + const JID& jid() { return m_jid; } + + /** + * Returns the subscription state. Only set for subscription notifications + * (type() == EventSubscription). + * @return @b True if the subscription request was approved, @b false otherwise. + */ + bool subscription() { return m_subscription; } + + // reimplemented from StanzaExtension + const std::string& filterString() const; + + // reimplemented from StanzaExtension + StanzaExtension* newInstance( const Tag* tag ) const + { + return new Event( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const; + + private: + Event& operator=( const Event& ); + + PubSub::EventType m_type; + std::string m_node; + StringList* m_subscriptionIDs; + JID m_jid; + Tag* m_config; + ItemOperationList* m_itemOperations; + std::string m_collection; + bool m_subscription; + + const ItemOperationList m_emptyOperationList; + const StringList m_emptyStringList; + + }; + + } + +} + +#endif // PUBSUBEVENT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/pubsubitem.cpp b/smack/smack/src/main/cpp/gloox/src/pubsubitem.cpp new file mode 100644 index 00000000..b35508ff --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsubitem.cpp @@ -0,0 +1,63 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "pubsubitem.h" +#include "tag.h" + +namespace gloox +{ + + namespace PubSub + { + + Item::Item() + : m_payload( 0 ) + { + } + + Item::Item( const Tag* tag ) + : m_payload( 0 ) + { + if( !tag || tag->name() != "item" ) + return; + + m_id = tag->findAttribute( "id" ); + + if( tag->children().size() ) + m_payload = tag->children().front()->clone(); + } + + Item::Item( const Item& item ) + : m_payload( item.m_payload ? item.m_payload->clone() : 0 ) + { + m_id = item.m_id; + } + + Item::~Item() + { + delete m_payload; + } + + Tag* Item::tag() const + { + Tag* t = new Tag( "item" ); + t->addAttribute( "id", m_id ); + if( m_payload ) + t->addChild( m_payload->clone() ); + + return t; + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/pubsubitem.h b/smack/smack/src/main/cpp/gloox/src/pubsubitem.h new file mode 100644 index 00000000..893d1698 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsubitem.h @@ -0,0 +1,90 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef PUBSUBITEM_H__ +#define PUBSUBITEM_H__ + +#include "gloox.h" + +#include + +namespace gloox +{ + + class Tag; + + namespace PubSub + { + + /** + * @brief Abstracts a PubSub Item (@xep{0060}). + * + * XEP Version: 1.12 + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Item + { + public: + /** + * Constructs a new empty Item. + */ + Item(); + + /** + * Constructs a new Item from the given Tag. + * @param tag The Tag to parse. + */ + Item( const Tag* tag ); + + /** + * Copy constructor. + * @param item The Item to be copied. + */ + Item( const Item& item ); + + /** + * Destructor. + */ + ~Item(); + + /** + * Returns the Item's payload. + * @return The layload. + */ + const Tag* payload() const { return m_payload; } + + /** + * Returns the item ID. + * @return The item ID. + */ + const std::string& id() const { return m_id; } + + /** + * Creates and returns a Tag representation of the Item. + * @return An XML representation of the Item. + */ + Tag* tag() const; + + private: + Tag* m_payload; + std::string m_id; + + }; + + } + +} + +#endif // PUBSUBITEM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/pubsubmanager.cpp b/smack/smack/src/main/cpp/gloox/src/pubsubmanager.cpp new file mode 100644 index 00000000..a32246bf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsubmanager.cpp @@ -0,0 +1,1243 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "pubsubmanager.h" +#include "clientbase.h" +#include "dataform.h" +#include "iq.h" +#include "pubsub.h" +#include "pubsubresulthandler.h" +#include "pubsubitem.h" +#include "shim.h" +#include "util.h" +#include "error.h" + +namespace gloox +{ + + namespace PubSub + { + + static const std::string + XMLNS_PUBSUB_NODE_CONFIG = "http://jabber.org/protocol/pubsub#node_config", + XMLNS_PUBSUB_SUBSCRIBE_OPTIONS = "http://jabber.org/protocol/pubsub#subscribe_options"; + + /** + * Finds the associated PubSubFeature for a feature tag 'type' attribute, + * as received from a disco info query on a pubsub service (XEP-0060 sect. 10). + * @param feat Feature string to search for. + * @return the associated PubSubFeature. + */ +/* static PubSubFeature featureType( const std::string& str ) + { + static const char* values [] = { + "collections", + "config-node", + "create-and-configure", + "create-nodes", + "delete-any", + "delete-nodes", + "get-pending", + "instant-nodes", + "item-ids", + "leased-subscription", + "manage-subscriptions", + "meta-data", + "modify-affiliations", + "multi-collection", + "multi-subscribe", + "outcast-affiliation", + "persistent-items", + "presence-notifications", + "publish", + "publisher-affiliation", + "purge-nodes", + "retract-items", + "retrieve-affiliations", + "retrieve-default", + "retrieve-items", + "retrieve-subscriptions", + "subscribe", + "subscription-options", + "subscription-notifications", + "owner", + "event", + }; + return static_cast< PubSubFeature >( util::lookup2( str, values ) ); + } +*/ + + static const char* subscriptionValues[] = { + "none", "subscribed", "pending", "unconfigured" + }; + + static inline SubscriptionType subscriptionType( const std::string& subscription ) + { + return (SubscriptionType)util::lookup( subscription, subscriptionValues ); + } + + static inline const std::string subscriptionValue( SubscriptionType subscription ) + { + return util::lookup( subscription, subscriptionValues ); + } + + static const char* affiliationValues[] = { + "none", "publisher", "owner", "outcast" + }; + + static inline AffiliationType affiliationType( const std::string& affiliation ) + { + return (AffiliationType)util::lookup( affiliation, affiliationValues ); + } + + static inline const std::string affiliationValue( AffiliationType affiliation ) + { + return util::lookup( affiliation, affiliationValues ); + } + + // ---- Manager::PubSubOwner ---- + Manager::PubSubOwner::PubSubOwner( TrackContext context ) + : StanzaExtension( ExtPubSubOwner ), m_ctx( context ), m_form( 0 ) + { + } + + Manager::PubSubOwner::PubSubOwner( const Tag* tag ) + : StanzaExtension( ExtPubSubOwner ), m_ctx( InvalidContext ), m_form( 0 ) + { + const Tag* d = tag->findTag( "pubsub/delete" ); + if( d ) + { + m_ctx = DeleteNode; + m_node = d->findAttribute( "node" ); + return; + } + const Tag* p = tag->findTag( "pubsub/purge" ); + if( p ) + { + m_ctx = PurgeNodeItems; + m_node = p->findAttribute( "node" ); + return; + } + const Tag* c = tag->findTag( "pubsub/configure" ); + if( c ) + { + m_ctx = SetNodeConfig; + m_node = c->findAttribute( "node" ); + if( c->hasChild( "x", "xmlns", XMLNS_X_DATA ) ) + { + m_ctx = GetNodeConfig; + m_form = new DataForm( c->findChild( "x", "xmlns", XMLNS_X_DATA ) ); + } + return; + } + const Tag* de = tag->findTag( "pubsub/default" ); + if( de ) + { + m_ctx = DefaultNodeConfig; + return; + } + const Tag* s = tag->findTag( "pubsub/subscriptions" ); + if( s ) + { + m_ctx = GetSubscriberList; + m_node = s->findAttribute( "node" ); + const TagList& l = s->children(); + TagList::const_iterator it =l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "subscription" ) + { + Subscriber sub( (*it)->findAttribute( "jid" ), + subscriptionType( (*it)->findAttribute( "subscription" ) ), + (*it)->findAttribute( "subid" ) ); + m_subList.push_back( sub ); + } + } + return; + } + const Tag* a = tag->findTag( "pubsub/affiliations" ); + if( a ) + { + m_ctx = GetAffiliateList; + m_node = a->findAttribute( "node" ); + const TagList& l = a->children(); + TagList::const_iterator it =l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "affiliation" ) + { + Affiliate aff( (*it)->findAttribute( "jid" ), + affiliationType( (*it)->findAttribute( "affiliation" ) ) ); + m_affList.push_back( aff ); + } + } + return; + } + } + + Manager::PubSubOwner::~PubSubOwner() + { + delete m_form; + } + + const std::string& Manager::PubSubOwner::filterString() const + { + static const std::string filter = "/iq/pubsub[@xmlns='" + XMLNS_PUBSUB_OWNER + "']"; + return filter; + } + + Tag* Manager::PubSubOwner::tag() const + { + if( m_ctx == InvalidContext ) + return 0; + + Tag* t = new Tag( "pubsub" ); + t->setXmlns( XMLNS_PUBSUB_OWNER ); + Tag* c = 0; + + switch( m_ctx ) + { + case DeleteNode: + { + c = new Tag( t, "delete", "node", m_node ); + break; + } + case PurgeNodeItems: + { + c = new Tag( t, "purge", "node", m_node ); + break; + } + case GetNodeConfig: + case SetNodeConfig: + { + c = new Tag( t, "configure" ); + c->addAttribute( "node", m_node ); + if( m_form ) + c->addChild( m_form->tag() ); + break; + } + case GetSubscriberList: + case SetSubscriberList: + + { + c = new Tag( t, "subscriptions" ); + c->addAttribute( "node", m_node ); + if( m_subList.size() ) + { + Tag* s; + SubscriberList::const_iterator it = m_subList.begin(); + for( ; it != m_subList.end(); ++it ) + { + s = new Tag( c, "subscription" ); + s->addAttribute( "jid", (*it).jid.full() ); + s->addAttribute( "subscription", util::lookup( (*it).type, subscriptionValues ) ); + if( !(*it).subid.empty() ) + s->addAttribute( "subid", (*it).subid ); + } + } + break; + } + case GetAffiliateList: + case SetAffiliateList: + { + c = new Tag( t, "affiliations" ); + c->addAttribute( "node", m_node ); + if( m_affList.size() ) + { + Tag* a; + AffiliateList::const_iterator it = m_affList.begin(); + for( ; it != m_affList.end(); ++it ) + { + a = new Tag( c, "affiliation", "jid", (*it).jid.full() ); + a->addAttribute( "affiliation", util::lookup( (*it).type, affiliationValues ) ); + } + } + break; + } + case DefaultNodeConfig: + { + c = new Tag( t, "default" ); + break; + } + default: + break; + } + + return t; + } + // ---- ~Manager::PubSubOwner ---- + + // ---- Manager::PubSub ---- + Manager::PubSub::PubSub( TrackContext context ) + : StanzaExtension( ExtPubSub ), m_ctx( context ), m_maxItems( 0 ), + m_notify( false ) + { + m_options.df = 0; + } + + Manager::PubSub::PubSub( const Tag* tag ) + : StanzaExtension( ExtPubSub ), m_ctx( InvalidContext ), + m_maxItems( 0 ), m_notify( false ) + { + m_options.df = 0; + if( !tag ) + return; + + ConstTagList l = tag->findTagList( "pubsub/subscriptions/subscription" ); + if( l.size() ) + { + m_ctx = GetSubscriptionList; + ConstTagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + const std::string& node = (*it)->findAttribute( "node" ); + const std::string& sub = (*it)->findAttribute( "subscription" ); + const std::string& subid = (*it)->findAttribute( "subid" ); + SubscriptionInfo si; + si.jid.setJID( (*it)->findAttribute( "jid" ) ); + si.type = subscriptionType( sub ); + si.subid = subid; + SubscriptionList& lst = m_subscriptionMap[node]; + lst.push_back( si ); + } + return; + } + l = tag->findTagList( "pubsub/affiliations/affiliation" ); + if( l.size() ) + { + m_ctx = GetAffiliationList; + ConstTagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + const std::string& node = (*it)->findAttribute( "node" ); + const std::string& aff = (*it)->findAttribute( "affiliation" ); + m_affiliationMap[node] = affiliationType( aff ); + } + return; + } + const Tag* s = tag->findTag( "pubsub/subscribe" ); + if( s ) + { + m_ctx = Subscription; + m_node = s->findAttribute( "node" ); + m_jid = s->findAttribute( "jid" ); + } + const Tag* u = tag->findTag( "pubsub/unsubscribe" ); + if( u ) + { + m_ctx = Unsubscription; + m_node = u->findAttribute( "node" ); + m_jid = u->findAttribute( "jid" ); + m_subid = u->findAttribute( "subid" ); + } + const Tag* o = tag->findTag( "pubsub/options" ); + if( o ) + { + if( m_ctx == InvalidContext ) + { + Tag* parent = tag->parent(); + if( parent && parent->findAttribute("type") == "set" ) + m_ctx = SetSubscriptionOptions; + else + m_ctx = GetSubscriptionOptions; + } + if( m_ctx == SetSubscriptionOptions || m_ctx == GetSubscriptionOptions ) + { + // We set both m_node and m_options.node for + // get/set options, since m_options.node is not exposed externally + m_node = o->findAttribute( "node" ); + m_jid.setJID( o->findAttribute( "jid" ) ); + m_subid = o->findAttribute( "subid" ); + } + m_options.node = o->findAttribute( "node" ); + m_options.df = new DataForm( o->findChild( "x", "xmlns", XMLNS_X_DATA ) ); + } + const Tag* su = tag->findTag( "pubsub/subscription" ); + if( su ) + { + SubscriptionInfo si; + si.jid.setJID( su->findAttribute( "jid" ) ); + si.subid = su->findAttribute( "subid" ); + si.type = subscriptionType( su->findAttribute( "type" ) ); + SubscriptionList& lst = m_subscriptionMap[su->findAttribute( "node" )]; + lst.push_back( si ); + return; + } + const Tag* i = tag->findTag( "pubsub/items" ); + if( i ) + { + m_ctx = RequestItems; + m_node = i->findAttribute( "node" ); + m_subid = i->findAttribute( "subid" ); + m_maxItems = atoi( i->findAttribute( "max_items" ).c_str() ); + const TagList& l = i->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + m_items.push_back( new Item( (*it) ) ); + return; + } + const Tag* p = tag->findTag( "pubsub/publish" ); + if( p ) + { + m_ctx = PublishItem; + m_node = p->findAttribute( "node" ); + const TagList& l = p->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + m_items.push_back( new Item( (*it) ) ); + return; + } + const Tag* r = tag->findTag( "pubsub/retract" ); + if( r ) + { + m_ctx = DeleteItem; + m_node = r->findAttribute( "node" ); + m_notify = r->hasAttribute( "notify", "1" ) || r->hasAttribute( "notify", "true" ); + const TagList& l = r->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + m_items.push_back( new Item( (*it) ) ); + return; + } + const Tag* c = tag->findTag( "pubsub/create" ); + if( c ) + { + m_ctx = CreateNode; + m_node = c->findAttribute( "node" ); + const Tag* config = tag->findTag( "pubsub/configure" ); + if( config && config->hasChild( "x", XMLNS_X_DATA ) ) + m_options.df = new DataForm( config->findChild( "x", XMLNS_X_DATA ) ); + } + } + + Manager::PubSub::~PubSub() + { + delete m_options.df; + util::clearList( m_items ); + } + + const std::string& Manager::PubSub::filterString() const + { + static const std::string filter = "/iq/pubsub[@xmlns='" + XMLNS_PUBSUB + "']"; + return filter; + } + + Tag* Manager::PubSub::tag() const + { + if( m_ctx == InvalidContext ) + return 0; + + Tag* t = new Tag( "pubsub" ); + t->setXmlns( XMLNS_PUBSUB ); + + if( m_ctx == GetSubscriptionList ) + { + Tag* sub = new Tag( t, "subscriptions" ); + SubscriptionMap::const_iterator it = m_subscriptionMap.begin(); + for( ; it != m_subscriptionMap.end(); ++it ) + { + const SubscriptionList& lst = (*it).second; + SubscriptionList::const_iterator it2 = lst.begin(); + for( ; it2 != lst.end(); ++it2 ) + { + Tag* s = new Tag( sub, "subscription" ); + s->addAttribute( "node", (*it).first ); + s->addAttribute( "jid", (*it2).jid ); + s->addAttribute( "subscription", subscriptionValue( (*it2).type ) ); + s->addAttribute( "sid", (*it2).subid ); + } + } + } + else if( m_ctx == GetAffiliationList ) + { + + Tag* aff = new Tag( t, "affiliations" ); + AffiliationMap::const_iterator it = m_affiliationMap.begin(); + for( ; it != m_affiliationMap.end(); ++it ) + { + Tag* a = new Tag( aff, "affiliation" ); + a->addAttribute( "node", (*it).first ); + a->addAttribute( "affiliation", affiliationValue( (*it).second ) ); + } + } + else if( m_ctx == Subscription ) + { + Tag* s = new Tag( t, "subscribe" ); + s->addAttribute( "node", m_node ); + s->addAttribute( "jid", m_jid.full() ); + if( m_options.df ) + { + Tag* o = new Tag( t, "options" ); + o->addChild( m_options.df->tag() ); + } + } + else if( m_ctx == Unsubscription ) + { + Tag* u = new Tag( t, "unsubscribe" ); + u->addAttribute( "node", m_node ); + u->addAttribute( "jid", m_jid.full() ); + u->addAttribute( "subid", m_subid ); + } + else if( m_ctx == GetSubscriptionOptions + || m_ctx == SetSubscriptionOptions ) + { + Tag* o = new Tag( t, "options" ); + o->addAttribute( "node", m_options.node ); + o->addAttribute( "jid", m_jid.full() ); + if( !m_subid.empty() ) + o->addAttribute( "subid", m_subid ); + if( m_options.df ) + o->addChild( m_options.df->tag() ); + } + else if( m_ctx == RequestItems ) + { + Tag* i = new Tag( t, "items" ); + i->addAttribute( "node", m_node ); + if( m_maxItems ) + i->addAttribute( "max_items", m_maxItems ); + i->addAttribute( "subid", m_subid ); + ItemList::const_iterator it = m_items.begin(); + for( ; it != m_items.end(); ++it ) + i->addChild( (*it)->tag() ); + } + else if( m_ctx == PublishItem ) + { + Tag* p = new Tag( t, "publish" ); + p->addAttribute( "node", m_node ); + ItemList::const_iterator it = m_items.begin(); + for( ; it != m_items.end(); ++it ) + p->addChild( (*it)->tag() ); + if( m_options.df ) + { + Tag* po = new Tag( "publish-options" ); + po->addChild( m_options.df->tag() ); + } + } + else if( m_ctx == DeleteItem ) + { + Tag* r = new Tag( t, "retract" ); + r->addAttribute( "node", m_node ); + if( m_notify ) + r->addAttribute( "notify", "true" ); + ItemList::const_iterator it = m_items.begin(); + for( ; it != m_items.end(); ++it ) + r->addChild( (*it)->tag() ); + } + else if( m_ctx == CreateNode ) + { + Tag* c = new Tag( t, "create" ); + c->addAttribute( "node", m_node ); + Tag* config = new Tag( t, "configure" ); + if( m_options.df ) + config->addChild( m_options.df->tag() ); + } + return t; + } + + StanzaExtension* Manager::PubSub::clone() const + { + PubSub* p = new PubSub(); + p->m_affiliationMap = m_affiliationMap; + p->m_subscriptionMap = m_subscriptionMap; + p->m_ctx = m_ctx; + + p->m_options.node = m_options.node; + p->m_options.df = m_options.df ? new DataForm( *(m_options.df) ) : 0; + + p->m_jid = m_jid; + p->m_node = m_node; + p->m_subid = m_subid; + ItemList::const_iterator it = m_items.begin(); + for( ; it != m_items.end(); ++it ) + p->m_items.push_back( new Item( *(*it) ) ); + + p->m_maxItems = m_maxItems; + p->m_notify = m_notify; + return p; + } + // ---- ~Manager::PubSub ---- + + // ---- Manager ---- + Manager::Manager( ClientBase* parent ) + : m_parent( parent ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new PubSub() ); + m_parent->registerStanzaExtension( new PubSubOwner() ); + m_parent->registerStanzaExtension( new SHIM() ); + } + } + + const std::string Manager::getSubscriptionsOrAffiliations( const JID& service, + ResultHandler* handler, + TrackContext context ) + { + if( !m_parent || !handler || !service || context == InvalidContext ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Get, service, id ); + iq.addExtension( new PubSub( context ) ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, context ); + return id; + } + + const std::string Manager::subscribe( const JID& service, + const std::string& node, + ResultHandler* handler, + const JID& jid, + SubscriptionObject type, + int depth, + const std::string& expire + ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + DataForm* options = 0; + if( type != SubscriptionNodes || depth != 1 ) + { + options = new DataForm( TypeSubmit ); + options->addField( DataFormField::TypeHidden, "FORM_TYPE", XMLNS_PUBSUB_SUBSCRIBE_OPTIONS ); + + if( type == SubscriptionItems ) + options->addField( DataFormField::TypeNone, "pubsub#subscription_type", "items" ); + + if( depth != 1 ) + { + DataFormField* field = options->addField( DataFormField::TypeNone, "pubsub#subscription_depth" ); + if( depth == 0 ) + field->setValue( "all" ); + else + field->setValue( util::int2string( depth ) ); + } + + if( !expire.empty() ) + { + DataFormField* field = options->addField( DataFormField::TypeNone, "pubsub#expire" ); + field->setValue( expire ); + } + } + + return subscribe( service, node, handler, jid, options ); + } + + const std::string Manager::subscribe( const JID& service, + const std::string& node, + ResultHandler* handler, + const JID& jid, + DataForm* options + ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, service, id ); + PubSub* ps = new PubSub( Subscription ); + ps->setJID( jid ? jid : m_parent->jid() ); + ps->setNode( node ); + if( options != NULL ) + ps->setOptions( node, options ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_nopTrackMap[id] = node; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, Subscription ); + return id; + } + + const std::string Manager::unsubscribe( const JID& service, + const std::string& node, + const std::string& subid, + ResultHandler* handler, + const JID& jid ) + { + if( !m_parent || !handler || !service ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, service, id ); + PubSub* ps = new PubSub( Unsubscription ); + ps->setNode( node ); + ps->setJID( jid ? jid : m_parent->jid() ); + ps->setSubscriptionID( subid ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + // FIXME? need to track info for handler + m_parent->send( iq, this, Unsubscription ); + return id; + } + + const std::string Manager::subscriptionOptions( TrackContext context, + const JID& service, + const JID& jid, + const std::string& node, + ResultHandler* handler, + DataForm* df, + const std::string& subid ) + { + if( !m_parent || !handler || !service ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( df ? IQ::Set : IQ::Get, service, id ); + PubSub* ps = new PubSub( context ); + ps->setJID( jid ? jid : m_parent->jid() ); + if( !subid.empty() ) + ps->setSubscriptionID( subid ); + ps->setOptions( node, df ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, context ); + return id; + } + + const std::string Manager::requestItems( const JID& service, + const std::string& node, + const std::string& subid, + int maxItems, + ResultHandler* handler ) + { + if( !m_parent || !service || !handler ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Get, service, id ); + PubSub* ps = new PubSub( RequestItems ); + ps->setNode( node ); + ps->setSubscriptionID( subid ); + ps->setMaxItems( maxItems ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, RequestItems ); + return id; + } + + const std::string Manager::requestItems( const JID& service, + const std::string& node, + const std::string& subid, + const ItemList& items, + ResultHandler* handler ) + { + if( !m_parent || !service || !handler ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Get, service, id ); + PubSub* ps = new PubSub( RequestItems ); + ps->setNode( node ); + ps->setSubscriptionID( subid ); + ps->setItems( items ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, RequestItems ); + return id; + } + + const std::string Manager::publishItem( const JID& service, + const std::string& node, + ItemList& items, + DataForm* options, + ResultHandler* handler ) + { + if( !m_parent || !handler ) + { + util::clearList( items ); + return EmptyString; + } + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, service, id ); + PubSub* ps = new PubSub( PublishItem ); + ps->setNode( node ); + ps->setItems( items ); + ps->setOptions( EmptyString, options ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, PublishItem ); + return id; + } + + const std::string Manager::deleteItem( const JID& service, + const std::string& node, + const ItemList& items, + bool notify, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, service, id ); + PubSub* ps = new PubSub( DeleteItem ); + ps->setNode( node ); + ps->setItems( items ); + ps->setNotify( notify ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, DeleteItem ); + return id; + } + + const std::string Manager::createNode( const JID& service, + const std::string& node, + DataForm* config, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, service, id ); + PubSub* ps = new PubSub( CreateNode ); + ps->setNode( node ); + ps->setOptions( EmptyString, config ); + iq.addExtension( ps ); + + m_trackMapMutex.lock(); + m_nopTrackMap[id] = node; + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, CreateNode ); + return id; + } + + const std::string Manager::deleteNode( const JID& service, + const std::string& node, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, service, id ); + PubSubOwner* pso = new PubSubOwner( DeleteNode ); + pso->setNode( node ); + iq.addExtension( pso ); + + m_trackMapMutex.lock(); + m_nopTrackMap[id] = node; + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, DeleteNode ); + return id; + } + + const std::string Manager::getDefaultNodeConfig( const JID& service, + NodeType type, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Get, service, id ); + PubSubOwner* pso = new PubSubOwner( DefaultNodeConfig ); + if( type == NodeCollection ) + { + DataForm* df = new DataForm( TypeSubmit ); + df->addField( DataFormField::TypeHidden, "FORM_TYPE", XMLNS_PUBSUB_NODE_CONFIG ); + df->addField( DataFormField::TypeNone, "pubsub#node_type", "collection" ); + pso->setConfig( df ); + } + iq.addExtension( pso ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, DefaultNodeConfig ); + return id; + } + + const std::string Manager::nodeConfig( const JID& service, + const std::string& node, + DataForm* config, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( config ? IQ::Set : IQ::Get, service, id ); + PubSubOwner* pso = new PubSubOwner( config ? SetNodeConfig : GetNodeConfig ); + pso->setNode( node ); + if( config ) + pso->setConfig( config ); + iq.addExtension( pso ); + + m_trackMapMutex.lock(); + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, config ? SetNodeConfig : GetNodeConfig ); + return id; + } + + const std::string Manager::subscriberList( TrackContext ctx, + const JID& service, + const std::string& node, + const SubscriberList& subList, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( ctx == SetSubscriberList ? IQ::Set : IQ::Get, service, id ); + PubSubOwner* pso = new PubSubOwner( ctx ); + pso->setNode( node ); + pso->setSubscriberList( subList ); + iq.addExtension( pso ); + + m_trackMapMutex.lock(); + m_nopTrackMap[id] = node; + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, ctx ); + return id; + } + + const std::string Manager::affiliateList( TrackContext ctx, + const JID& service, + const std::string& node, + const AffiliateList& affList, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( ctx == SetAffiliateList ? IQ::Set : IQ::Get, service, id ); + PubSubOwner* pso = new PubSubOwner( ctx ); + pso->setNode( node ); + pso->setAffiliateList( affList ); + iq.addExtension( pso ); + + m_trackMapMutex.lock(); + m_nopTrackMap[id] = node; + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, ctx ); + return id; + } + + const std::string Manager::purgeNode( const JID& service, + const std::string& node, + ResultHandler* handler ) + { + if( !m_parent || !handler || !service || node.empty() ) + return EmptyString; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, service, id ); + PubSubOwner* pso = new PubSubOwner( PurgeNodeItems ); + pso->setNode( node ); + iq.addExtension( pso ); + + m_trackMapMutex.lock(); + m_nopTrackMap[id] = node; + m_resultHandlerTrackMap[id] = handler; + m_trackMapMutex.unlock(); + m_parent->send( iq, this, PurgeNodeItems ); + return id; + } + + bool Manager::removeID( const std::string& id ) + { + m_trackMapMutex.lock(); + ResultHandlerTrackMap::iterator ith = m_resultHandlerTrackMap.find( id ); + if( ith == m_resultHandlerTrackMap.end() ) + { + m_trackMapMutex.unlock(); + return false; + } + m_resultHandlerTrackMap.erase( ith ); + m_trackMapMutex.unlock(); + return true; + } + + void Manager::handleIqID( const IQ& iq, int context ) + { + const JID& service = iq.from(); + const std::string& id = iq.id(); + + m_trackMapMutex.lock(); + ResultHandlerTrackMap::iterator ith = m_resultHandlerTrackMap.find( id ); + if( ith == m_resultHandlerTrackMap.end() ) + { + m_trackMapMutex.unlock(); + return; + } + ResultHandler* rh = (*ith).second; + m_resultHandlerTrackMap.erase( ith ); + m_trackMapMutex.unlock(); + + switch( iq.subtype() ) + { + case IQ::Error: + case IQ::Result: + { + const Error* error = iq.error(); + switch( context ) + { + case Subscription: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + if( !ps ) + return; + SubscriptionMap sm = ps->subscriptions(); + if( !sm.empty() ) + { + SubscriptionMap::const_iterator it = sm.begin(); + const SubscriptionList& lst = (*it).second; + if( lst.size() == 1 ) + { + SubscriptionList::const_iterator it2 = lst.begin(); + rh->handleSubscriptionResult( id, service, (*it).first, (*it2).subid, (*it2).jid, + (*it2).type, error ); + } + } + break; + } + case Unsubscription: + { + rh->handleUnsubscriptionResult( iq.id(), service, error ); + break; + } + case GetSubscriptionList: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + if( !ps ) + return; + + rh->handleSubscriptions( id, service, + ps->subscriptions(), + error ); + break; + } + case GetAffiliationList: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + if( !ps ) + return; + + rh->handleAffiliations( id, service, + ps->affiliations(), + error ); + break; + } + case RequestItems: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + if( !ps ) + return; + + rh->handleItems( id, service, ps->node(), + ps->items(), error ); + break; + } + case PublishItem: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + rh->handleItemPublication( id, service, "", + ps ? ps->items() : ItemList(), + error ); + break; + } + case DeleteItem: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + if( ps ) + { + rh->handleItemDeletion( id, service, + ps->node(), + ps->items(), + error ); + } + break; + } + case DefaultNodeConfig: + { + const PubSubOwner* pso = iq.findExtension( ExtPubSubOwner ); + if( pso ) + { + rh->handleDefaultNodeConfig( id, service, + pso->config(), + error ); + } + break; + } + case GetSubscriptionOptions: + case GetSubscriberList: + case SetSubscriberList: + case GetAffiliateList: + case SetAffiliateList: + case GetNodeConfig: + case SetNodeConfig: + case CreateNode: + case DeleteNode: + case PurgeNodeItems: + { + switch( context ) + { + case GetSubscriptionOptions: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + if( ps ) + { + rh->handleSubscriptionOptions( id, service, + ps->jid(), + ps->node(), + ps->options(), + ps->subscriptionID(), + error ); + } + break; + } +// case GetSubscriberList: +// { +// const PubSub* ps = iq.findExtension( ExtPubSub ); +// if( ps ) +// { +// rh->handleSubscribers( service, ps->node(), ps->subscriptions() ); +// } +// break; +// } + case SetSubscriptionOptions: + case SetSubscriberList: + case SetAffiliateList: + case SetNodeConfig: + case CreateNode: + case DeleteNode: + case PurgeNodeItems: + { + m_trackMapMutex.lock(); + NodeOperationTrackMap::iterator it = m_nopTrackMap.find( id ); + if( it != m_nopTrackMap.end() ) + { + const std::string& node = (*it).second; + switch( context ) + { + case SetSubscriptionOptions: + { + const PubSub* ps = iq.findExtension( ExtPubSub ); + if( ps ) + { + rh->handleSubscriptionOptionsResult( id, service, + ps->jid(), + node, + ps->subscriptionID(), + error ); + } + else + { + rh->handleSubscriptionOptionsResult( id, service, JID( /* FIXME */ ), node, /* FIXME */ EmptyString, error ); + } + break; + } + case SetSubscriberList: + rh->handleSubscribersResult( id, service, node, 0, error ); + break; + case SetAffiliateList: + rh->handleAffiliatesResult( id, service, node, 0, error ); + break; + case SetNodeConfig: + rh->handleNodeConfigResult( id, service, node, error ); + break; + case CreateNode: + rh->handleNodeCreation( id, service, node, error ); + break; + case DeleteNode: + rh->handleNodeDeletion( id, service, node, error ); + break; + case PurgeNodeItems: + rh->handleNodePurge( id, service, node, error ); + break; + } + m_nopTrackMap.erase( it ); + } + m_trackMapMutex.unlock(); + break; + } + case GetAffiliateList: + { +// const PubSub + + /* const TagList& affiliates = query->children(); + AffiliateList affList; + TagList::const_iterator it = affiliates.begin(); + for( ; it != affiliates.end(); ++it ) + { + Affiliate aff( (*it)->findAttribute( "jid" ), + affiliationType( (*it)->findAttribute( "affiliation" ) ) ); + affList.push_back( aff ); + } + rh->handleAffiliates( service, query->findAttribute( "node" ), &affList ); + */ + break; + } + case GetNodeConfig: + { + const PubSubOwner* pso = iq.findExtension( ExtPubSubOwner ); + if( pso ) + { + rh->handleNodeConfig( id, service, + pso->node(), + pso->config(), + error ); + } + break; + } + default: + break; + } + + break; + } + } + break; + } + default: + break; + } + + } + + } + +} + diff --git a/smack/smack/src/main/cpp/gloox/src/pubsubmanager.h b/smack/smack/src/main/cpp/gloox/src/pubsubmanager.h new file mode 100644 index 00000000..66a93ff1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsubmanager.h @@ -0,0 +1,856 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef PUBSUBMANAGER_H__ +#define PUBSUBMANAGER_H__ + +#include "pubsub.h" +#include "dataform.h" +#include "iqhandler.h" +#include "mutex.h" + +#include +#include + +namespace gloox +{ + + class ClientBase; + + namespace PubSub + { + + class ResultHandler; + + /** + * @brief This manager is used to interact with PubSub services (@xep{0060}). + * + * @note PubSub support in gloox is still relatively young and you are most + * welcome to ask questions, criticize the API and so on. + * + * A ResultHandler is used to receive a request's result. Depending on the + * context, this can be a notification that an item has been succesfully + * deleted (or not), or the default node configuration for a service. + * + * To receive PubSub events: + * @li Tell ClientBase that you are interested in PubSub events by registering + * an empty PubSub::Event StanzaExtension + * @code + * m_client->registerStanzaExtension( new PubSub::Event() ); + * @endcode + * @li Implement a MessageHandler and register it with ClientBase, or use the MessageSession interface, at your choice, + * @li When receiving a Message, check it for a PubSub::Event + * @code + * const PubSub::Event* pse = msg.findExtension( ExtPubSubEvent ); + * if( pse ) + * { + * // use the Event + * } + * else + * { + * // no Event + * } + * @endcode + * + * To interact with PubSub services, you will need to + * instantiate a PubSub::Manager and + * implement the ResultHandler virtual interfaces to be notified of the + * result of requests. + * + * @note A null ResultHandler to a query is not allowed and is a no-op. + * + * XEP Version: 1.12 + * + * @author Jakob Schröter + * @author Vincent Thomasset + * + * @since 1.0 + */ + class GLOOX_API Manager : public IqHandler + { + public: + + /** + * Initialize the manager. + * @param parent Client to which this manager belongs. + */ + Manager( ClientBase* parent ); + + /** + * Default virtual destructor. + */ + virtual ~Manager() {} + + /** + * Subscribe to a node. + * + * @param service Service hosting the node. + * @param node ID of the node to subscribe to. + * @param handler The ResultHandler. + * @param jid JID to subscribe. If empty, the client's JID will be used + * (ie. self subscription). + * @param type SubscriptionType of the subscription (Collections only). + * @param depth Subscription depth. For 'all', use 0 (Collections only). + * @param expire Subscription expiry. Defaults to the empty string. + * @return The IQ ID used in the request. + * + * @see ResultHandler::handleSubscriptionResult + */ + const std::string subscribe( const JID& service, const std::string& node, + ResultHandler* handler, const JID& jid = JID(), + SubscriptionObject type = SubscriptionNodes, + int depth = 1, const std::string& expire = EmptyString ); + + /** + * Subscribe to a node and configure options. + * + * @param service Service hosting the node. + * @param node ID of the node to subscribe to. + * @param handler The ResultHandler. + * @param jid JID to subscribe. If empty, the client's JID will be used + * (ie. self subscription). + * @param options The options to configure while subscribing. + * Should be a TypeSubmit form, with a field named FORM_TYPE having the value + * http://jabber.org/protocol/pubsub#subscribe_options + * See @xep{0060}, "Subscribe and Configure". + * Will be owned and deleted by the PubSub object. + * @return The IQ ID used in the request. + * + * @see ResultHandler::handleSubscriptionResult + */ + const std::string subscribe( const JID& service, const std::string& node, + ResultHandler* handler, const JID& jid, + DataForm* options ); + + /** + * Unsubscribe from a node. + * + * @param service Service hosting the node. + * @param node ID of the node to unsubscribe from. + * @param subid An optional, additional subscription ID. + * @param handler ResultHandler receiving the result notification. + * @param jid JID to unsubscribe. If empty, the client's JID will be + * used (ie self unsubscription). + * @return The IQ ID used in the request. + * + * @see ResultHandler::handleUnsubscriptionResult + */ + const std::string unsubscribe( const JID& service, + const std::string& node, + const std::string& subid, + ResultHandler* handler, + const JID& jid = JID() ); + + /** + * Requests the subscription list from a service. + * + * @param service Service to query. + * @param handler The ResultHandler to handle the result. + * @return The IQ ID used in the request. + * + * @see ResultHandler::handleSubscriptions + */ + const std::string getSubscriptions( const JID& service, + ResultHandler* handler ) + { + return getSubscriptionsOrAffiliations( service, + handler, + GetSubscriptionList ); + } + + /** + * Requests the affiliation list from a service. + * + * @param service Service to query. + * @param handler The ResultHandler to handle the result. + * @return The IQ ID used in the request. + * + * @see ResultHandler::handleAffiliations + */ + const std::string getAffiliations( const JID& service, + ResultHandler* handler ) + { + return getSubscriptionsOrAffiliations( service, + handler, + GetAffiliationList ); + } + + /** + * Requests subscription options. + * + * @param service Service to query. + * @param jid Subscribed entity. + * @param node Node ID of the node. + * @param handler The SubscriptionListHandler to handle the result. + * @param subid An optional subscription ID. + * @return The IQ ID used in the request. + * + * @see ResultHandler::handleSubscriptionOptions + */ + const std::string getSubscriptionOptions( const JID& service, + const JID& jid, + const std::string& node, + ResultHandler* handler, + const std::string& subid = EmptyString) + { return subscriptionOptions( GetSubscriptionOptions, service, jid, node, handler, 0, subid ); } + + /** + * Modifies subscription options. + * + * @param service Service to query. + * @param jid Subscribed entity. + * @param node Node ID of the node. + * @param df New configuration. The DataForm will be owned and deleted by the Manager. + * @param handler The handler to handle the result. + * @param subid An optional subscription ID. + * @return The IQ ID used in the request. + * + * @see ResultHandler::handleSubscriptionOptionsResult + */ + const std::string setSubscriptionOptions( const JID& service, + const JID& jid, + const std::string& node, + DataForm* df, + ResultHandler* handler, + const std::string& subid = EmptyString ) + { return subscriptionOptions( SetSubscriptionOptions, service, jid, node, handler, df, subid ); } + + /** + * Requests the affiliation list for a node. + * + * @param service Service to query. + * @param node Node ID of the node. + * @param handler The AffiliationListHandler to handle the result. + * + * @see ResultHandler::handleAffiliations + */ + void getAffiliations( const JID& service, + const std::string& node, + ResultHandler* handler ); + + /** + * Requests items from a node. + * @param service Service to query. + * @param node Node ID of the node. + * @param subid An optional subscription ID. + * @param maxItems The optional maximum number of items to return. + * @param handler The handler to handle the result. + * @return The ID used in the request. + */ + const std::string requestItems( const JID& service, + const std::string& node, + const std::string& subid, + int maxItems, + ResultHandler* handler); + + /** + * Requests specific items from a node. + * @param service Service to query. + * @param node Node ID of the node. + * @param subid An optional subscription ID. + * @param items The list of item IDs to request. + * @param handler The handler to handle the result. + * @return The ID used in the request. + */ + const std::string requestItems( const JID& service, + const std::string& node, + const std::string& subid, + const ItemList& items, + ResultHandler* handler); + + /** + * Publish an item to a node. The Tag to publish is destroyed + * by the function before returning. + * + * @param service Service hosting the node. + * @param node ID of the node to delete the item from. + * @param items One or more items to publish. The items will be owned and deleted by the Manager, + * even in the error case (empty string returned). + * @param options An optional DataForm containing publish options. The DataForm will be owned and deleted by the Manager. + * @param handler The handler to handle the result. + * @return The ID used in the request. + * + * @see ResultHandler::handleItemPublication + */ + const std::string publishItem( const JID& service, + const std::string& node, + ItemList& items, + DataForm* options, + ResultHandler* handler ); + + /** + * Delete an item from a node. + * + * @param service Service hosting the node. + * @param node ID of the node to delete the item from. + * @param items A list of items to delete (only ID filled in). + * @param notify Whether or not to notify subscribers about the deletion. + * @param handler The handler to handle the result. + * @return The ID used in the request. + * + * @see ResultHandler::handleItemDeletation + */ + const std::string deleteItem( const JID& service, + const std::string& node, + const ItemList& items, + bool notify, + ResultHandler* handler ); + + /** + * Creates a new node. + * + * @param service Service where to create the new node. + * @param node The ID of the new node. + * @param config An optional DataForm that holds the node configuration. + * The DataForm will be owned and deleted by the Manager. + * @param handler The handler to handle the result. + * @return The ID used in the request. + * + * @see ResultHandler::handleNodeCreation + */ + const std::string createNode( const JID& service, + const std::string& node, + DataForm* config, + ResultHandler* handler ); + + /** + * Deletes a node. + * + * @param service Service where to create the new node. + * @param node Node ID of the new node. + * @param handler The handler to handle the result. + * @return The ID used in the request. + * + * @see ResultHandler::handleNodeDeletion + */ + const std::string deleteNode( const JID& service, + const std::string& node, + ResultHandler* handler ); + + /** + * Retrieves the default configuration for a specific NodeType. + * + * @param service The queried service. + * @param type NodeType to get default configuration for. + * @param handler ResultHandler. + * @return The ID used in the request. + * + * @see ResultHandler::handleDefaultNodeConfig + */ + const std::string getDefaultNodeConfig( const JID& service, + NodeType type, + ResultHandler* handler ); + + /** + * Removes all the items from a node. + * + * @param service Service to query. + * @param node Node ID of the node. + * @param handler ResultHandler. + * @return The ID used in the request. + * + * @see ResultHandler::handleNodePurge + */ + const std::string purgeNode( const JID& service, + const std::string& node, + ResultHandler* handler ); + + /** + * Requests the subscriber list for a node. + * + * @param service Service to query. + * @param node Node ID of the node. + * @param handler ResultHandler. + * @return The ID used in the request. + * + * @see ResultHandler::handleSubscribers + */ + const std::string getSubscribers( const JID& service, + const std::string& node, + ResultHandler* handler ) + { return subscriberList( GetSubscriberList, service, + node, SubscriberList(), + handler ); } + + /** + * Modifies the subscriber list for a node. This function SHOULD only set the + * subscriber list to those which needs modification. + * + * @param service Service to query. + * @param node Node ID of the node. + * @param list The subscriber list. + * @param handler The ResultHandler. + * @return The ID used in the request. + * + * @see ResultHandler::handleSubscribers + */ + const std::string setSubscribers( const JID& service, + const std::string& node, + const SubscriberList& list, + ResultHandler* handler ) + { return subscriberList( SetSubscriberList, service, + node, list, handler ); } + + /** + * Requests the affiliate list for a node. + * + * @param service Service to query. + * @param node Node ID of the node. + * @param handler ResultHandler. + * @return The ID used in the request. + * + * @see ResultHandler::handleAffiliates + */ + const std::string getAffiliates( const JID& service, + const std::string& node, + ResultHandler* handler ) + { return affiliateList( GetAffiliateList, service, + node, AffiliateList(), + handler ); } + + /** + * Modifies the affiliate list for a node. + * + * @param service Service to query. + * @param node Node ID of the node. + * @param list ResultHandler. + * @param handler ResultHandler. + * @return The ID used in the request. + * + * @see ResultHandler::handleAffiliatesResult + */ + const std::string setAffiliates( const JID& service, + const std::string& node, + const AffiliateList& list, + ResultHandler* handler ) + { return affiliateList( SetAffiliateList, service, + node, list, handler ); } + + /** + * Retrieve the configuration (options) of a node. + * + * @param service Service hosting the node. + * @param node ID of the node. + * @param handler ResultHandler responsible to handle the request result. + * @return The ID used in the request. + * + * @see ResultHandler::handleNodeConfig + */ + const std::string getNodeConfig( const JID& service, + const std::string& node, + ResultHandler* handler ) + { return nodeConfig( service, node, 0, handler ); } + + /** + * Changes a node's configuration (options). + * + * @param service Service to query. + * @param node Node ID of the node. + * @param config The node's configuration DataForm. + * @param handler ResultHandler responsible to handle the request result. + * @return The ID used in the request. + * + * @see ResultHandler::handleNodeConfigResult + */ + const std::string setNodeConfig( const JID& service, + const std::string& node, + DataForm* config, + ResultHandler* handler ) + { return nodeConfig( service, node, config, handler ); } + + /** + * Removes an ID from our tracking lists. + * @param id The ID to remove. + * @return @b True if the ID was found and removed, @b false otherwise. + */ + bool removeID( const std::string& id ); + + // reimplemented from DiscoHandler + void handleDiscoInfoResult( IQ* iq, int context ); + + // reimplemented from DiscoHandler + void handleDiscoItemsResult( IQ* iq, int context ); + + // reimplemented from DiscoHandler + void handleDiscoError( IQ* iq, int context ); + + // reimplemented from DiscoHandler + bool handleDiscoSet( IQ* ) { return 0; } + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ) { (void)iq; return false; } + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef PUBSUBMANAGER_TEST + public: +#endif + + enum TrackContext + { + Subscription, + Unsubscription, + GetSubscriptionOptions, + SetSubscriptionOptions, + GetSubscriptionList, + GetSubscriberList, + SetSubscriberList, + GetAffiliationList, + GetAffiliateList, + SetAffiliateList, + GetNodeConfig, + SetNodeConfig, + DefaultNodeConfig, + GetItemList, + PublishItem, + DeleteItem, + CreateNode, + DeleteNode, + PurgeNodeItems, + NodeAssociation, + NodeDisassociation, + GetFeatureList, + DiscoServiceInfos, + DiscoNodeInfos, + DiscoNodeItems, + RequestItems, + InvalidContext + }; + + class PubSubOwner : public StanzaExtension + { + public: + /** + * Creates a new PubSubOwner object that can be used to request the given type. + * @param context The requets type. + */ + PubSubOwner( TrackContext context = InvalidContext ); + + /** + * Creates a new PubSubOwner object by parsing the given Tag. + * @param tag The Tag to parse. + */ + PubSubOwner( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~PubSubOwner(); + + /** + * Sets the node to use in e.g. subscription requests. + * @param node The node to use. + */ + void setNode( const std::string& node ) { m_node = node; } + + /** + * Returns the pubsub node. + * @return The pubsub node. + */ + const std::string& node() const { return m_node; } + + /** + * Sets an options DataForm. + * @param options The DataForm. + */ + void setConfig( DataForm* config ) + { m_form = config; } + + /** + * Returns the config DataForm. + * @return The config DataForm. + */ + const DataForm* config() const { return m_form; } + + /** + * Sets the subscriber list. + * @param subList The subscriber list. + */ + void setSubscriberList( const SubscriberList& subList ) + { m_subList = subList; } + + /** + * Sets the affiliate list. + * @param affList The affiliate list. + */ + void setAffiliateList( const AffiliateList& affList ) + { m_affList = affList; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new PubSubOwner( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + PubSubOwner* p = new PubSubOwner(); + p->m_node = m_node; + p->m_ctx = m_ctx; + p->m_form = m_form ? new DataForm( *m_form ) : 0; + p->m_subList = m_subList; + p->m_affList = m_affList; + return p; + } + + private: + std::string m_node; + TrackContext m_ctx; + DataForm* m_form; + SubscriberList m_subList; + AffiliateList m_affList; + }; + + class PubSub : public StanzaExtension + { + public: + /** + * Creates a new PubSub object that can be used to request the given type. + * @param context The requets type. + */ + PubSub( TrackContext context = InvalidContext ); + + /** + * Creates a new PubSub object by parsing the given Tag. + * @param tag The Tag to parse. + */ + PubSub( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~PubSub(); + + /** + * Sets the JID to use in e.g. subscription requests. + * @param jid The JID to use. + */ + void setJID( const JID& jid ) { m_jid = jid; } + + /** + * Returns the pubsub JID (not the service JID). + * @return The pubsub JID. + */ + const JID& jid() const { return m_jid; } + + /** + * Sets the node to use in e.g. subscription requests. + * @param node The node to use. + */ + void setNode( const std::string& node ) { m_node = node; } + + /** + * Returns the pubsub node. + * @return The pubsub node. + */ + const std::string& node() const { return m_node; } + + /** + * Sets the Subscription ID to use. + * @param subid The Subscription ID to use. + */ + void setSubscriptionID( const std::string& subid ) + { m_subid = subid; } + + /** + * Gets the Subscription ID to use. + * @return The Subscription ID to use. + */ + const std::string& subscriptionID() const { return m_subid; } + + /** + * Sets the subscription options. + * @param node The node to set the options for. + * @param df The DataForm holding the subscription options. + * Will be owned and deleted by the PubSub object + */ + void setOptions( const std::string& node, DataForm* df ) + { + m_options.node = node; + if( m_options.df != 0 ) + delete m_options.df; + m_options.df = df; + } + + /** + * Returns the subscription options. + * @return The subscription options. + */ + const DataForm* options() const + { return m_options.df; } + + /** + * Returns the current Items. + * @return The current items. + */ + const ItemList& items() const { return m_items; } + + /** + * Sets the subscription IDs. + * @param ids Subscription IDs. + */ + void setItems( const ItemList& items ) + { m_items = items; } + + /** + * Sets the maximum number of items to request. + * @param maxItems The maximum number of items to request. + */ + void setMaxItems( int maxItems ) + { m_maxItems = maxItems; } + + /** + * Returns the subscriptions. + * @param The subscriptions. + */ + const SubscriptionMap& subscriptions() const + { return m_subscriptionMap; } + + /** + * Returns the affiliations. + * @param The affiliations. + */ + const AffiliationMap& affiliations() const + { return m_affiliationMap; } + + /** + * Sets whether or not a notify element should be included in a 'retract'. + * @param notify Indicates whether a notify attribute is included. + */ + void setNotify( bool notify ) { m_notify = notify; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new PubSub( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const; + + private: + AffiliationMap m_affiliationMap; + SubscriptionMap m_subscriptionMap; + TrackContext m_ctx; + + struct Options + { + std::string node; + DataForm* df; + }; + Options m_options; + JID m_jid; + std::string m_node; + std::string m_subid; + ItemList m_items; + int m_maxItems; + bool m_notify; + }; + + /** + * This function sets or requests a node's configuration form + * (depending on arguments). Does the actual work for requestNodeConfig + * and setNodeConfig. + * Requests or changes a node's configuration. + * @param service Service to query. + * @param node Node ID of the node. + * @param config If not NULL, the function will request the node config. + * Otherwise, it will set the config based on the form. + * @param handler ResultHandler responsible to handle the request result. + */ + const std::string nodeConfig( const JID& service, + const std::string& node, + DataForm* config, + ResultHandler* handler ); + + /** + * This function sets or requests a node's subscribers list form + * (depending on arguments). Does the actual work for + * requestSubscriberList and setSubscriberList. + * Requests or changes a node's configuration. + * @param ctx The operation to be performed. + * @param service Service to query. + * @param node Node ID of the node. + * @param config If not NULL, the function will request the node config. + * Otherwise, it will set the config based on the form. + * @param handler ResultHandler responsible to handle the request result. + * @return The ID used in the request. + */ + const std::string subscriberList( TrackContext ctx, + const JID& service, + const std::string& node, + const SubscriberList& config, + ResultHandler* handler ); + + /** + * This function sets or requests a node's affiliates list + * (depending on arguments). Does the actual work for + * requestAffiliateList and setAffiliateList. + * Requests or changes a node's configuration. + * @param ctx The operation to be performed. + * @param service Service to query. + * @param node Node ID of the node. + * @param config If not NULL, the function will request the node config. + * Otherwise, it will set the config based on the form. + * @param handler ResultHandler responsible to handle the request result. + * @return The ID used in the request. + */ + const std::string affiliateList( TrackContext ctx, + const JID& service, + const std::string& node, + const AffiliateList& config, + ResultHandler* handler ); + + const std::string subscriptionOptions( TrackContext context, + const JID& service, + const JID& jid, + const std::string& node, + ResultHandler* handler, + DataForm* df, + const std::string& subid = EmptyString ); + + const std::string getSubscriptionsOrAffiliations( const JID& service, + ResultHandler* handler, + TrackContext context ); + + typedef std::map < std::string, std::string > NodeOperationTrackMap; + typedef std::map < std::string, ResultHandler* > ResultHandlerTrackMap; + + ClientBase* m_parent; + + NodeOperationTrackMap m_nopTrackMap; + ResultHandlerTrackMap m_resultHandlerTrackMap; + + util::Mutex m_trackMapMutex; + + }; + + } + +} + +#endif // PUBSUBMANAGER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/pubsubresulthandler.h b/smack/smack/src/main/cpp/gloox/src/pubsubresulthandler.h new file mode 100644 index 00000000..a11158ff --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/pubsubresulthandler.h @@ -0,0 +1,395 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef PUBSUBRESULTHANDLER_H__ +#define PUBSUBRESULTHANDLER_H__ + +#include "error.h" +#include "jid.h" +#include "macros.h" +#include "pubsub.h" +#include "tag.h" + +#include +#include +#include + +namespace gloox +{ + + class Tag; + class Error; + class DataForm; + + namespace PubSub + { + /** + * @brief A virtual interface to receive item related requests results. + * + * Derive from this interface and pass it to item related requests. + * + * As a general rule, methods receive an Error pointer which will be null + * (when the request was successful) or describe the problem. Requests + * asking for information will have their "pointer to information" set to + * null when an error occured (that is they're mutually exclusive). In both + * cases, gloox takes care of deleting these objects. + * + * @author Vincent Thomasset + * @since 1.0 + */ + class GLOOX_API ResultHandler + { + public: + /** + * Virtual destructor. + */ + virtual ~ResultHandler() {} + + /** + * Receives the payload for an item. + * + * @param service Service hosting the queried node. + * @param node ID of the parent node. + * @param entry The complete item Tag (do not delete). + */ + virtual void handleItem( const JID& service, + const std::string& node, + const Tag* entry ) = 0; + + /** + * Receives the list of Items for a node. + * + * @param id The reply IQ's id. + * @param service Service hosting the queried node. + * @param node ID of the queried node (empty for the root node). + * @param itemList List of contained items. + * @param error Describes the error case if the request failed. + * + * @see Manager::requestItems() + */ + virtual void handleItems( const std::string& id, + const JID& service, + const std::string& node, + const ItemList& itemList, + const Error* error = 0 ) = 0; + + /** + * Receives the result for an item publication. + * + * @param id The reply IQ's id. + * @param service Service hosting the queried node. + * @param node ID of the queried node. If empty, the root node has been queried. + * @param itemList List of contained items. + * @param error Describes the error case if the request failed. + * + * @see Manager::publishItem + */ + virtual void handleItemPublication( const std::string& id, + const JID& service, + const std::string& node, + const ItemList& itemList, + const Error* error = 0 ) = 0; + + /** + * Receives the result of an item removal. + * + * @param id The reply IQ's id. + * @param service Service hosting the queried node. + * @param node ID of the queried node. If empty, the root node has been queried. + * @param itemList List of contained items. + * @param error Describes the error case if the request failed. + * + * @see Manager::deleteItem + */ + virtual void handleItemDeletion( const std::string& id, + const JID& service, + const std::string& node, + const ItemList& itemList, + const Error* error = 0 ) = 0; + + /** + * Receives the subscription results. In case a problem occured, the + * Subscription ID and SubscriptionType becomes irrelevant. + * + * @param id The reply IQ's id. + * @param service PubSub service asked for subscription. + * @param node Node asked for subscription. + * @param sid Subscription ID. + * @param jid Subscribed entity. + * @param subType Type of the subscription. + * @param error Subscription Error. + * + * @see Manager::subscribe + */ + virtual void handleSubscriptionResult( const std::string& id, + const JID& service, + const std::string& node, + const std::string& sid, + const JID& jid, + const SubscriptionType subType, + const Error* error = 0 ) = 0; + + /** + * Receives the unsubscription results. In case a problem occured, the + * subscription ID becomes irrelevant. + * + * @param id The reply IQ's id. + * @param service PubSub service. + * @param error Unsubscription Error. + * + * @see Manager::unsubscribe + */ + virtual void handleUnsubscriptionResult( const std::string& id, + const JID& service, + const Error* error = 0 ) = 0; + + /** + * Receives the subscription options for a node. + * + * @param id The reply IQ's id. + * @param service Service hosting the queried node. + * @param jid Subscribed entity. + * @param node ID of the node. + * @param options Options DataForm. + * @param sid An optional subscription ID. + * @param error Subscription options retrieval Error. + * + * @see Manager::getSubscriptionOptions + */ + virtual void handleSubscriptionOptions( const std::string& id, + const JID& service, + const JID& jid, + const std::string& node, + const DataForm* options, + const std::string& sid = EmptyString, + const Error* error = 0 ) = 0; + + /** + * Receives the result for a subscription options modification. + * + * @param id The reply IQ's id. + * @param service Service hosting the queried node. + * @param jid Subscribed entity. + * @param node ID of the queried node. + * @param sid An optional subscription ID. + * @param error Subscription options modification Error. + * + * @see Manager::setSubscriptionOptions + */ + virtual void handleSubscriptionOptionsResult( const std::string& id, + const JID& service, + const JID& jid, + const std::string& node, + const std::string& sid = EmptyString, + const Error* error = 0 ) = 0; + + + /** + * Receives the list of subscribers to a node. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the queried node. + * @param list Subscriber list. + * @param error Subscription options modification Error. + * + * @see Manager::getSubscribers + */ + virtual void handleSubscribers( const std::string& id, + const JID& service, + const std::string& node, + const SubscriberList* list, + const Error* error = 0 ) = 0; + + /** + * Receives the result of a subscriber list modification. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the queried node. + * @param list Subscriber list. + * @param error Subscriber list modification Error. + * + * @see Manager::setSubscribers + */ + virtual void handleSubscribersResult( const std::string& id, + const JID& service, + const std::string& node, + const SubscriberList* list, + const Error* error = 0 ) = 0; + + /** + * Receives the affiliate list for a node. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the queried node. + * @param list Affiliation list. + * @param error Affiliation list retrieval Error. + * + * @see Manager::getAffiliations + */ + virtual void handleAffiliates( const std::string& id, + const JID& service, + const std::string& node, + const AffiliateList* list, + const Error* error = 0 ) = 0; + + /** + * Handle the affiliate list for a specific node. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the node. + * @param list The Affiliate list. + * @param error Affiliation list modification Error. + * + * @see Manager::setAffiliations + */ + virtual void handleAffiliatesResult( const std::string& id, + const JID& service, + const std::string& node, + const AffiliateList* list, + const Error* error = 0 ) = 0; + + + /** + * Receives the configuration for a specific node. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the node. + * @param config Configuration DataForm. + * @param error Configuration retrieval Error. + * + * @see Manager::getNodeConfig + */ + virtual void handleNodeConfig( const std::string& id, + const JID& service, + const std::string& node, + const DataForm* config, + const Error* error = 0 ) = 0; + + /** + * Receives the result of a node's configuration modification. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the node. + * @param error Configuration modification Error. + * + * @see Manager::setNodeConfig + */ + virtual void handleNodeConfigResult( const std::string& id, + const JID& service, + const std::string& node, + const Error* error = 0 ) = 0; + + /** + * Receives the result of a node creation. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the node. + * @param error Node creation Error. + * + * @see Manager::setNodeConfig + */ + virtual void handleNodeCreation( const std::string& id, + const JID& service, + const std::string& node, + const Error* error = 0 ) = 0; + + /** + * Receives the result for a node removal. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the node. + * @param error Node removal Error. + * + * @see Manager::deleteNode + */ + virtual void handleNodeDeletion( const std::string& id, + const JID& service, + const std::string& node, + const Error* error = 0 ) = 0; + + + /** + * Receives the result of a node purge request. + * + * @param id The reply IQ's id. + * @param service Service hosting the node. + * @param node ID of the node. + * @param error Node purge Error. + * + * @see Manager::purgeNode + */ + virtual void handleNodePurge( const std::string& id, + const JID& service, + const std::string& node, + const Error* error = 0 ) = 0; + + /** + * Receives the Subscription list for a specific service. + * + * @param id The reply IQ's id. + * @param service The queried service. + * @param subMap The map of node's subscription. + * @param error Subscription list retrieval Error. + * + * @see Manager::getSubscriptions + */ + virtual void handleSubscriptions( const std::string& id, + const JID& service, + const SubscriptionMap& subMap, + const Error* error = 0) = 0; + + /** + * Receives the Affiliation map for a specific service. + * + * @param id The reply IQ's id. + * @param service The queried service. + * @param affMap The map of node's affiliation. + * @param error Affiliation list retrieval Error. + * + * @see Manager::getAffiliations + */ + virtual void handleAffiliations( const std::string& id, + const JID& service, + const AffiliationMap& affMap, + const Error* error = 0 ) = 0; + + /** + * Receives the default configuration for a specific node type. + * + * @param id The reply IQ's id. + * @param service The queried service. + * @param config Configuration form for the node type. + * @param error Default node config retrieval Error. + * + * @see Manager::getDefaultNodeConfig + */ + virtual void handleDefaultNodeConfig( const std::string& id, + const JID& service, + const DataForm* config, + const Error* error = 0 ) = 0; + + }; + + } + +} + +#endif // PUBSUBRESULTHANDLER_H__ + diff --git a/smack/smack/src/main/cpp/gloox/src/receipt.cpp b/smack/smack/src/main/cpp/gloox/src/receipt.cpp new file mode 100644 index 00000000..3b4780d2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/receipt.cpp @@ -0,0 +1,60 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "receipt.h" +#include "tag.h" +#include "util.h" + +namespace gloox +{ + + /* chat state type values */ + static const char* receiptValues [] = { + "request", + "received" + }; + + static inline Receipt::ReceiptType receiptType( const std::string& type ) + { + return (Receipt::ReceiptType)util::lookup( type, receiptValues ); + } + + Receipt::Receipt( const Tag* tag ) + : StanzaExtension( ExtReceipt ), m_rcpt( Invalid ) + { + if( !tag ) + return; + + m_rcpt = receiptType( tag->name() ); + m_id = tag->findAttribute( "id" ); + } + + const std::string& Receipt::filterString() const + { + static const std::string filter = + "/message/request[@xmlns='" + XMLNS_RECEIPTS + "']" + "|/message/received[@xmlns='" + XMLNS_RECEIPTS + "']"; + return filter; + } + + Tag* Receipt::tag() const + { + if( m_rcpt == Invalid ) + return 0; + + Tag* tag = new Tag( util::lookup( m_rcpt, receiptValues ), XMLNS, XMLNS_RECEIPTS ); + if ( !m_id.empty() ) + tag->addAttribute( "id", m_id ); + return tag; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/receipt.h b/smack/smack/src/main/cpp/gloox/src/receipt.h new file mode 100644 index 00000000..dcf65cc6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/receipt.h @@ -0,0 +1,103 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef RECEIPT_H__ +#define RECEIPT_H__ + +#include "gloox.h" +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief An implementation of Message Receipts (@xep{0184}) as a StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Receipt : public StanzaExtension + { + public: + /** + * Contains valid receipt types (@xep{0184}). + */ + enum ReceiptType + { + Request, /**< Requests a receipt. */ + Received, /**< The receipt. */ + Invalid /**< Invalid type. */ + }; + + /** + * Constructs a new object from the given Tag. + * @param tag A Tag to parse. + */ + Receipt( const Tag* tag ); + + /** + * Constructs a new object of the given type. + * @param rcpt The receipt type. + * @param id The message ID. + */ + Receipt( ReceiptType rcpt, const std::string& id = EmptyString ) + : StanzaExtension( ExtReceipt ), m_rcpt( rcpt ), m_id( id ) + {} + + /** + * Virtual destructor. + */ + virtual ~Receipt() {} + + /** + * Returns the object's state. + * @return The object's state. + */ + ReceiptType rcpt() const { return m_rcpt; } + + /** + * Returns the message id for acknowledgement tracking. + * @return The message ID for acknowledgement tracking. + */ + std::string id() const { return m_id; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Receipt( tag ); + } + + // reimplemented from StanzaExtension + Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Receipt( *this ); + } + + private: + ReceiptType m_rcpt; + std::string m_id; + + }; + +} + +#endif // RECEIPT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/registration.cpp b/smack/smack/src/main/cpp/gloox/src/registration.cpp new file mode 100644 index 00000000..7c4ac3ad --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/registration.cpp @@ -0,0 +1,406 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "registration.h" + +#include "clientbase.h" +#include "stanza.h" +#include "error.h" +#include "prep.h" +#include "oob.h" + +#include "log.h" + +namespace gloox +{ + + // Registration::Query ---- + Registration::Query::Query( DataForm* form ) + : StanzaExtension( ExtRegistration ), m_form( form ), m_fields( 0 ), m_oob( 0 ), + m_del( false ), m_reg( false ) + { + } + + Registration::Query::Query( bool del ) + : StanzaExtension( ExtRegistration ), m_form( 0 ), m_fields( 0 ), m_oob( 0 ), m_del( del ), + m_reg( false ) + { + } + + Registration::Query::Query( int fields, const RegistrationFields& values ) + : StanzaExtension( ExtRegistration ), m_form( 0 ), m_fields( fields ), m_values( values ), + m_oob( 0 ), m_del( false ), m_reg( false ) + { + } + + Registration::Query::Query( const Tag* tag ) + : StanzaExtension( ExtRegistration ), m_form( 0 ), m_fields( 0 ), m_oob( 0 ), m_del( false ), + m_reg( false ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_REGISTER ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + const std::string& name = (*it)->name(); + if( name == "instructions" ) + m_instructions = (*it)->cdata(); + else if( name == "remove" ) + m_del = true; + else if( name == "registered" ) + m_reg = true; + else if( name == "username" ) + { + m_fields |= FieldUsername; + m_values.username = (*it)->cdata(); + } + else if( name == "nick" ) + { + m_fields |= FieldNick; + m_values.nick = (*it)->cdata(); + } + else if( name == "password" ) + { + m_fields |= FieldPassword; + m_values.password = (*it)->cdata(); + } + else if( name == "name" ) + { + m_fields |= FieldName; + m_values.name = (*it)->cdata(); + } + else if( name == "first" ) + { + m_fields |= FieldFirst; + m_values.first = (*it)->cdata(); + } + else if( name == "last" ) + { + m_fields |= FieldLast; + m_values.last = (*it)->cdata(); + } + else if( name == "email" ) + { + m_fields |= FieldEmail; + m_values.email = (*it)->cdata(); + } + else if( name == "address" ) + { + m_fields |= FieldAddress; + m_values.address = (*it)->cdata(); + } + else if( name == "city" ) + { + m_fields |= FieldCity; + m_values.city = (*it)->cdata(); + } + else if( name == "state" ) + { + m_fields |= FieldState; + m_values.state = (*it)->cdata(); + } + else if( name == "zip" ) + { + m_fields |= FieldZip; + m_values.zip = (*it)->cdata(); + } + else if( name == "phone" ) + { + m_fields |= FieldPhone; + m_values.phone = (*it)->cdata(); + } + else if( name == "url" ) + { + m_fields |= FieldUrl; + m_values.url = (*it)->cdata(); + } + else if( name == "date" ) + { + m_fields |= FieldDate; + m_values.date = (*it)->cdata(); + } + else if( name == "misc" ) + { + m_fields |= FieldMisc; + m_values.misc = (*it)->cdata(); + } + else if( name == "text" ) + { + m_fields |= FieldText; + m_values.text = (*it)->cdata(); + } + else if( !m_form && name == "x" && (*it)->xmlns() == XMLNS_X_DATA ) + m_form = new DataForm( (*it) ); + else if( !m_oob && name == "x" && (*it)->xmlns() == XMLNS_X_OOB ) + m_oob = new OOB( (*it) ); + } + } + + Registration::Query::~Query() + { + delete m_form; + delete m_oob; + } + + const std::string& Registration::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_REGISTER + "']"; + return filter; + } + + Tag* Registration::Query::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_REGISTER ); + + if( !m_instructions.empty() ) + new Tag( t, "instructions", m_instructions ); + + if ( m_reg ) + new Tag( t, "registered" ); + + if( m_form ) + t->addChild( m_form->tag() ); + else if( m_oob ) + t->addChild( m_oob->tag() ); + else if( m_del ) + new Tag( t, "remove" ); + else if( m_fields ) + { + if( m_fields & FieldUsername ) + new Tag( t, "username", m_values.username ); + if( m_fields & FieldNick ) + new Tag( t, "nick", m_values.nick ); + if( m_fields & FieldPassword ) + new Tag( t, "password", m_values.password ); + if( m_fields & FieldName ) + new Tag( t, "name", m_values.name ); + if( m_fields & FieldFirst ) + new Tag( t, "first", m_values.first ); + if( m_fields & FieldLast ) + new Tag( t, "last", m_values.last ); + if( m_fields & FieldEmail ) + new Tag( t, "email", m_values.email ); + if( m_fields & FieldAddress ) + new Tag( t, "address", m_values.address ); + if( m_fields & FieldCity ) + new Tag( t, "city", m_values.city ); + if( m_fields & FieldState ) + new Tag( t, "state", m_values.state ); + if( m_fields & FieldZip ) + new Tag( t, "zip", m_values.zip ); + if( m_fields & FieldPhone ) + new Tag( t, "phone", m_values.phone ); + if( m_fields & FieldUrl ) + new Tag( t, "url", m_values.url ); + if( m_fields & FieldDate ) + new Tag( t, "date", m_values.date ); + if( m_fields & FieldMisc ) + new Tag( t, "misc", m_values.misc ); + if( m_fields & FieldText ) + new Tag( t, "text", m_values.text ); + } + + return t; + } + // ---- ~Registration::Query ---- + + // ---- Registration ---- + Registration::Registration( ClientBase* parent, const JID& to ) + : m_parent( parent ), m_to( to ), m_registrationHandler( 0 ) + { + init(); + } + + Registration::Registration( ClientBase* parent ) + : m_parent( parent ), m_registrationHandler( 0 ) + { + init(); + } + + void Registration::init() + { + if( m_parent ) + { + m_parent->registerIqHandler( this, ExtRegistration ); + m_parent->registerStanzaExtension( new Query() ); + } + } + + Registration::~Registration() + { + if( m_parent ) + { + m_parent->removeIqHandler( this, ExtRegistration ); + m_parent->removeIDHandler( this ); + m_parent->removeStanzaExtension( ExtRegistration ); + } + } + + void Registration::fetchRegistrationFields() + { + if( !m_parent || m_parent->state() != StateConnected ) + return; + + IQ iq( IQ::Get, m_to ); + iq.addExtension( new Query() ); + m_parent->send( iq, this, FetchRegistrationFields ); + } + + bool Registration::createAccount( int fields, const RegistrationFields& values ) + { + std::string username; + if( !m_parent || !prep::nodeprep( values.username, username ) ) + return false; + + IQ iq( IQ::Set, m_to ); + iq.addExtension( new Query( fields, values ) ); + m_parent->send( iq, this, CreateAccount ); + + return true; + } + + void Registration::createAccount( DataForm* form ) + { + if( !m_parent || !form ) + return; + + IQ iq( IQ::Set, m_to ); + iq.addExtension( new Query( form ) ); + m_parent->send( iq, this, CreateAccount ); + } + + void Registration::removeAccount() + { + LOGD("Test Registration removeAccount"); + if( !m_parent || !m_parent->authed() ) + return; + + LOGD("Test Registration removeAccount 1"); + IQ iq( IQ::Set, m_to ); + LOGD("Test Registration removeAccount 2"); + iq.addExtension( new Query( true ) ); + LOGD("Test Registration removeAccount 3"); + m_parent->send( iq, this, RemoveAccount ); + LOGD("Test Registration removeAccount 4"); + } + + void Registration::changePassword( const std::string& username, const std::string& password ) + { + LOGD("Test Registration changePassword"); + + if( !m_parent || !m_parent->authed() || username.empty() ){ + LOGD("Test Registration changePassword 0"); + return; + } + + + LOGD("Test Registration changePassword 1"); + int fields = FieldUsername | FieldPassword; + RegistrationFields rf; + rf.username = username; + rf.password = password; + LOGD("Test Registration changePassword 2"); + createAccount( fields, rf ); + LOGD("Test Registration changePassword 3"); + } + + void Registration::registerRegistrationHandler( RegistrationHandler* rh ) + { + m_registrationHandler = rh; + } + + void Registration::removeRegistrationHandler() + { + m_registrationHandler = 0; + } + + void Registration::handleIqID( const IQ& iq, int context ) + { + if( !m_registrationHandler ) + return; + + if( iq.subtype() == IQ::Result ) + { + switch( context ) + { + case FetchRegistrationFields: + { + const Query* q = iq.findExtension( ExtRegistration ); + if( !q ) + return; + + if( q->registered() ) + m_registrationHandler->handleAlreadyRegistered( iq.from() ); + + if( q->form() ) + m_registrationHandler->handleDataForm( iq.from(), *(q->form()) ); + + if( q->oob() ) + m_registrationHandler->handleOOB( iq.from(), *(q->oob()) ); + + m_registrationHandler->handleRegistrationFields( iq.from(), q->fields(), q->instructions() ); + break; + } + + case CreateAccount: + case ChangePassword: + case RemoveAccount: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationSuccess ); + break; + } + } + else if( iq.subtype() == IQ::Error ) + { + const Error* e = iq.error(); + if( !e ) + return; + + switch( e->error() ) + { + case StanzaErrorConflict: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationConflict ); + break; + case StanzaErrorNotAcceptable: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationNotAcceptable ); + break; + case StanzaErrorBadRequest: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationBadRequest ); + break; + case StanzaErrorForbidden: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationForbidden ); + break; + case StanzaErrorRegistrationRequired: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationRequired ); + break; + case StanzaErrorUnexpectedRequest: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationUnexpectedRequest ); + break; + case StanzaErrorNotAuthorized: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationNotAuthorized ); + break; + case StanzaErrorNotAllowed: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationNotAllowed ); + break; + default: + m_registrationHandler->handleRegistrationResult( iq.from(), RegistrationUnknownError ); + break; + + } + } + + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/registration.h b/smack/smack/src/main/cpp/gloox/src/registration.h new file mode 100644 index 00000000..82d0a221 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/registration.h @@ -0,0 +1,339 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef REGISTRATION_H__ +#define REGISTRATION_H__ + +#include "iqhandler.h" +#include "registrationhandler.h" +#include "dataform.h" +#include "jid.h" +#include "oob.h" + +#include +#include + +namespace gloox +{ + + class ClientBase; + class Stanza; + + /** + * Holds all the possible fields a server may require for registration according + * to Section 14.1, @xep{0077}. + */ + struct RegistrationFields + { + std::string username; /**< Desired username. */ + std::string nick; /**< User's nickname. */ + std::string password; /**< User's password. */ + std::string name; /**< User's name. */ + std::string first; /**< User's first name.*/ + std::string last; /**< User's last name. */ + std::string email; /**< User's email address. */ + std::string address; /**< User's address. */ + std::string city; /**< User's city. */ + std::string state; /**< User's state. */ + std::string zip; /**< User's ZIP code. */ + std::string phone; /**< User's phone number. */ + std::string url; /**< User's homepage URL (or other URL). */ + std::string date; /**< Date (?) */ + std::string misc; /**< Misc (?) */ + std::string text; /**< Text (?)*/ + }; + + /** + * @brief This class is an implementation of @xep{0077} (In-Band Registration). + * + * Derive your object from @ref RegistrationHandler and implement the + * virtual functions offered by that interface. Then use it like this: + * @code + * void MyClass::myFunc() + * { + * m_client = new Client( "example.org" ); + * m_client->disableRoster(); // a roster is not necessary for registration + * m_client->registerConnectionListener( this ); + * + * m_reg = new Registration( c ); + * m_reg->registerRegistrationHandler( this ); + * + * m_client->connect(); + * } + * + * void MyClass::onConnect() + * { + * m_reg->fetchRegistrationFields(); + * } + * @endcode + * + * In RegistrationHandler::handleRegistrationFields() you should check which information the server + * requires to open a new account. You might not always get away with just username and password. + * Then call createAccount() with a filled-in RegistrationFields and an @c int representing the bit-wise + * ORed fields you want to have included in the registration attempt. For your convenience you can + * use the 'fields' argument of handleRegistrationFields(). ;) It's your responsibility to make + * sure at least those fields the server requested are filled in. + * + * Check @c tests/register_test.cpp for an example. + * + * @author Jakob Schröter + * @since 0.2 + */ + class GLOOX_API Registration : public IqHandler +{ +public: + + /** + * The possible fields of a @xep{0077} account registration. + */ + enum fieldEnum + { + FieldUsername = 1, /**< Username requested */ + FieldNick = 2, /**< Nickname requested */ + FieldPassword = 4, /**< Password requested */ + FieldName = 8, /**< Name requested */ + FieldFirst = 16, /**< Given name requested */ + FieldLast = 32, /**< Family name requested */ + FieldEmail = 64, /**< Email address requested */ + FieldAddress = 128, /**< Postal address requested */ + FieldCity = 256, /**< Locality requested */ + FieldState = 512, /**< State/Province requested */ + FieldZip = 1024, /**< ZIP requested */ + FieldPhone = 2048, /**< Phone no. requested */ + FieldUrl = 4096, /**< Homepage or other URL requested */ + FieldDate = 8192, /**< Date requested (unknown purpose; see @xep{0077}) */ + FieldMisc = 16384, /**< Misc data requested (unknown purpose; see @xep{0077}) */ + FieldText = 32768 /**< Extra text requested (unknown purpose; see @xep{0077}) */ + }; + + /** + * @brief A wrapping class for the @xep{0077} <query> element. + * + * @author Jakob Schröter + * @since 1.0 + */ + class Query : public StanzaExtension + { + public: + /** + * Creates a new object that can be used to carry out a registration. + * @param form A DataForm containing the registration terms. + */ + Query( DataForm* form ); + + /** + * Creates a new object that can be used to carry out a registration. + * @param del Whether or not to remove the account. + */ + Query( bool del = false ); + + /** + * Creates a new object that can be used to carry out a registration. + * @param fields Bit-wise ORed fieldEnum values describing the valid (i.e., set) + * fields in the @b values parameter. + * @param values Contains the registration fields. + */ + Query( int fields, const RegistrationFields& values ); + + /** + * Creates a new object from the given Tag. + * @param tag The Tag to parse. + */ + Query( const Tag* tag ); + + /** + * Virtual Destructor. + */ + virtual ~Query(); + + /** + * Returns the contained registration form, if any. + * @return The registration form. May be 0. + */ + const DataForm* form() const { return m_form; } + + /** + * Returns the registration instructions, if given + * @return The registration instructions. + */ + const std::string& instructions() const { return m_instructions; } + + /** + * Returns the registration fields, if set. + * @return The registration fields. + */ + int fields() const { return m_fields; } + + /** + * + */ + const RegistrationFields& values() const { return m_values; } + + /** + * Indicates whether the account is already registered. + * @return @b True if the <registered> element is present, @b false otherwise. + */ + bool registered() const { return m_reg; } + + /** + * Indicates whether the account shall be removed. + * @return @b True if the <remove> element is present, @b false otherwise. + */ + bool remove() const { return m_del; } + + /** + * Returns an optional OOB object. + * @return A pointer to an OOB object, if present, 0 otherwise. + */ + const OOB* oob() const { return m_oob; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + Query* q = new Query(); + q->m_form = m_form ? new DataForm( *m_form ) : 0; + q->m_fields = m_fields; + q->m_values = m_values; + q->m_instructions = m_instructions; + q->m_oob = new OOB( *m_oob ); + q->m_del = m_del; + q->m_reg = m_reg; + return q; + } + + private: + DataForm* m_form; + int m_fields; + RegistrationFields m_values; + std::string m_instructions; + OOB* m_oob; + bool m_del; + bool m_reg; + }; + + /** + * Constructor. + * @param parent The ClientBase which is used for establishing a connection. + * @param to The server or service to authenticate with. If empty the currently connected + * server will be used. + */ + Registration( ClientBase* parent, const JID& to ); + + /** + * Constructor. Registration will be attempted with the ClientBase's connected host. + * @param parent The ClientBase which is used for establishing a connection. + */ + Registration( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~Registration(); + + /** + * Use this function to request the registration fields the server requires. + * The required fields are returned asynchronously to the object registered as + * @ref RegistrationHandler by calling @ref RegistrationHandler::handleRegistrationFields(). + */ + void fetchRegistrationFields(); + + /** + * Attempts to register an account with the given credentials. Only the fields OR'ed in + * @c fields will be sent. This can only be called with an unauthenticated parent (@ref Client). + * @note It is recommended to use @ref fetchRegistrationFields to find out which fields the + * server requires. + * @param fields The fields to use to generate the registration request. OR'ed + * @ref fieldEnum values. + * @param values The struct contains the values which shall be used for the registration. + * @return Returns @b true if the registration request was sent successfully, @b false + * otherwise. In that case either there's no connected ClientBase available, or + * prepping of the username failed (i.e. the username is not valid for use in XMPP). + */ + bool createAccount( int fields, const RegistrationFields& values ); + + /** + * Attempts to register an account with the given credentials. This can only be called with an + * unauthenticated parent (@ref Client). + * @note According to @xep{0077}, if the server sends both old-style fields and data form, + * implementations SHOULD prefer data forms. + * @param form The DataForm containing the registration credentials. + */ + void createAccount( DataForm* form ); + + /** + * Tells the server to remove the currently authenticated account from the server. + */ + void removeAccount(); + + /** + * Tells the server to change the password for the current account. + * @param username The username to change the password for. You might want to use + * Client::username() to get the current prepped username. + * @param password The new password. + */ + void changePassword( const std::string& username, const std::string& password ); + + /** + * Registers the given @c rh as RegistrationHandler. Only one handler is possible at a time. + * @param rh The RegistrationHandler to register. + */ + void registerRegistrationHandler( RegistrationHandler* rh ); + + /** + * Un-registers the current RegistrationHandler. + */ + void removeRegistrationHandler(); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ) { (void)iq; return false; } + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef REGISTRATION_TEST + public: +#endif + + enum IdType + { + FetchRegistrationFields, + CreateAccount, + RemoveAccount, + ChangePassword + }; + + Registration operator=( const Registration& ); + + void init(); + + ClientBase* m_parent; + const JID m_to; + RegistrationHandler* m_registrationHandler; +}; + +} + +#endif // REGISTRATION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/registrationhandler.h b/smack/smack/src/main/cpp/gloox/src/registrationhandler.h new file mode 100644 index 00000000..d3781acd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/registrationhandler.h @@ -0,0 +1,128 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef REGISTRATIONHANDLER_H__ +#define REGISTRATIONHANDLER_H__ + +#include "oob.h" + +#include + +namespace gloox +{ + + class OOB; + class JID; + class DataForm; + + /** + * Possible results of a @xep{0077} operation. + */ + enum RegistrationResult + { + RegistrationSuccess = 0, /**< The last operation (account registration, account + * deletion or password change) was successful. */ + RegistrationNotAcceptable, /**< 406: Not all necessary information provided */ + RegistrationConflict, /**< 409: Username alreday exists. */ + RegistrationNotAuthorized, /**< Account removal: Unregistered entity waits too long + * before authentication or performs tasks other than + * authentication after registration.
    + * Password change: The server or service does not consider + * the channel safe enough to enable a password change. */ + RegistrationBadRequest, /**< Account removal: The <remove/> element was not + * the only child element of the <query/> element. + * Should not happen when only gloox functions are being + * used.
    + * Password change: The password change request does not + * contain complete information (both <username/> and + * <password/> are required). */ + RegistrationForbidden, /**< Account removal: The sender does not have sufficient + * permissions to cancel the registration. */ + RegistrationRequired, /**< Account removal: The entity sending the remove + * request was not previously registered. */ + RegistrationUnexpectedRequest, /**< Account removal: The host is an instant messaging + * server and the IQ get does not contain a 'from' + * address because the entity is not registered with + * the server.
    + * Password change: The host is an instant messaging + * server and the IQ set does not contain a 'from' + * address because the entity is not registered with + * the server. */ + RegistrationNotAllowed, /**< Password change: The server or service does not allow + * password changes. */ + RegistrationUnknownError /**< An unknown error condition occured. */ + }; + + /** + * @brief A virtual interface that receives events from an Registration object. + * + * Derived classes can be registered as RegistrationHandlers with an + * Registration object. Incoming results for operations initiated through + * the Registration object are forwarded to this handler. + * + * @author Jakob Schröter + * @since 0.2 + */ + class GLOOX_API RegistrationHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~RegistrationHandler() {} + + /** + * Reimplement this function to receive results of the + * @ref Registration::fetchRegistrationFields() function. + * @param from The server or service the registration fields came from. + * @param fields The OR'ed fields the server requires. From @ref Registration::fieldEnum. + * @param instructions Any additional information the server sends along. + */ + virtual void handleRegistrationFields( const JID& from, int fields, + std::string instructions ) = 0; + + /** + * This function is called if @ref Registration::createAccount() was called on an authenticated + * stream and the server lets us know about this. + */ + virtual void handleAlreadyRegistered( const JID& from ) = 0; + + /** + * This funtion is called to notify about the result of an operation. + * @param from The server or service the result came from. + * @param regResult The result of the last operation. + */ + virtual void handleRegistrationResult( const JID& from, RegistrationResult regResult ) = 0; + + /** + * This function is called additionally to @ref handleRegistrationFields() if the server + * supplied a data form together with legacy registration fields. + * @param from The server or service the data form came from. + * @param form The DataForm containing registration information. + */ + virtual void handleDataForm( const JID& from, const DataForm& form ) = 0; + + /** + * This function is called if the server does not offer in-band registration + * but wants to refer the user to an external URL. + * @param from The server or service the referal came from. + * @param oob The OOB object describing the external URL. + */ + virtual void handleOOB( const JID& from, const OOB& oob ) = 0; + + }; + +} + +#endif // REGISTRATIONHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/resource.h b/smack/smack/src/main/cpp/gloox/src/resource.h new file mode 100644 index 00000000..713d6ee0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/resource.h @@ -0,0 +1,106 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef RESOURCE_H__ +#define RESOURCE_H__ + +#include "presence.h" +#include "util.h" + +#include + +namespace gloox +{ + + class Presence; + + /** + * @brief Holds resource attributes. + * + * This holds the information of a single resource of a contact that is online. + * + * @author Jakob Schröter + * @since 0.8 + */ + class GLOOX_API Resource + { + + friend class RosterItem; + + public: + /** + * Constructor. + * @param priority The resource's priority. + * @param msg The resource's status message. + * @param presence The resource's presence status. + */ + Resource( int priority, const std::string& msg, Presence::PresenceType presence ) + : m_priority( priority ), m_message( msg ), m_presence( presence ) {} + + /** + * Virtual destrcutor. + */ + virtual ~Resource() + { + util::clearList( m_extensions ); + } + + /** + * Lets you fetch the resource's priority. + * @return The resource's priority. + */ + int priority() const { return m_priority; } + + /** + * Lets you fetch the resource's status message. + * @return The resource's status message. + */ + const std::string& message() const { return m_message; } + + /** + * Lets you fetch the resource's last presence. + * @return The resource's presence status. + */ + Presence::PresenceType presence() const { return m_presence; } + + /** + * Returns the StanzaExtensions that were sent with the last presence stanza + * by the resource. + * @return A list of stanza extensions. + */ + const StanzaExtensionList& extensions() const { return m_extensions; } + + private: + void setPriority( int priority ) { m_priority = priority; } + void setMessage( std::string message ) { m_message = message; } + void setStatus( Presence::PresenceType presence ) { m_presence = presence; } + void setExtensions( const StanzaExtensionList& exts ) + { + StanzaExtensionList::const_iterator it = exts.begin(); + for( ; it != exts.end(); ++it ) + { + m_extensions.push_back( (*it)->clone() ); + } + } + + int m_priority; + std::string m_message; + std::string m_name; + Presence::PresenceType m_presence; + StanzaExtensionList m_extensions; + + }; + +} + +#endif // RESOURCE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/rosteritem.cpp b/smack/smack/src/main/cpp/gloox/src/rosteritem.cpp new file mode 100644 index 00000000..a46dc230 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/rosteritem.cpp @@ -0,0 +1,187 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "rosteritem.h" +#include "rosteritemdata.h" +#include "util.h" + +namespace gloox +{ + + JID EmptyJID(); + + RosterItem::RosterItem( const std::string& jid, const std::string& name ) + : m_data( new RosterItemData( JID( jid ), name, StringList() ) ) + { + } + + RosterItem::RosterItem( const RosterItemData& data ) + : m_data( new RosterItemData( data ) ) + { + } + + RosterItem::~RosterItem() + { + delete m_data; + util::clearMap( m_resources ); + } + + void RosterItem::setName( const std::string& name ) + { + if( m_data ) + m_data->setName( name ); + } + + const std::string& RosterItem::name() const + { + if( m_data ) + return m_data->name(); + else + return EmptyString; + } + + const JID& RosterItem::jidJID() const + { + if( m_data ) + return m_data->jidJID(); + else + return EmptyJID; + } + + const std::string& RosterItem::jid() const + { + if( m_data ) + return m_data->jid(); + else + return EmptyString; + } + + void RosterItem::setSubscription( const std::string& subscription, const std::string& ask ) + { + if( m_data ) + m_data->setSubscription( subscription, ask ); + } + + SubscriptionType RosterItem::subscription() const + { + if( m_data ) + return m_data->subscription(); + else + return S10nNone; + } + + void RosterItem::setGroups( const StringList& groups ) + { + if( m_data ) + m_data->setGroups( groups ); + } + + const StringList RosterItem::groups() const + { + if( m_data ) + return m_data->groups(); + else + return StringList(); + } + + bool RosterItem::changed() const + { + if( m_data ) + return m_data->changed(); + else + return false; + } + + void RosterItem::setSynchronized() + { + if( m_data ) + m_data->setSynchronized(); + } + + void RosterItem::setPresence( const std::string& resource, Presence::PresenceType presence ) + { + if( m_resources.find( resource ) == m_resources.end() ) + m_resources[resource] = new Resource( 0, EmptyString, presence ); + else + m_resources[resource]->setStatus( presence ); + } + + void RosterItem::setStatus( const std::string& resource, const std::string& msg ) + { + if( m_resources.find( resource ) == m_resources.end() ) + m_resources[resource] = new Resource( 0, msg, Presence::Unavailable ); + else + m_resources[resource]->setMessage( msg ); + } + + void RosterItem::setPriority( const std::string& resource, int priority ) + { + if( m_resources.find( resource ) == m_resources.end() ) + m_resources[resource] = new Resource( priority, EmptyString, Presence::Unavailable ); + else + m_resources[resource]->setPriority( priority ); + } + + const Resource* RosterItem::highestResource() const + { + int highestPriority = -255; + Resource* highestResource = 0; + ResourceMap::const_iterator it = m_resources.begin(); + for( ; it != m_resources.end() ; ++it ) + { + if( (*it).second->priority() > highestPriority ) + { + highestPriority = (*it).second->priority(); + highestResource = (*it).second; + } + } + return highestResource; + } + + void RosterItem::setExtensions( const std::string& resource, const StanzaExtensionList& exts ) + { + if( m_resources.find( resource ) == m_resources.end() ) + m_resources[resource] = new Resource( 0, EmptyString, Presence::Unavailable ); + + m_resources[resource]->setExtensions( exts ); + } + + void RosterItem::removeResource( const std::string& resource ) + { + ResourceMap::iterator it = m_resources.find( resource ); + if( it != m_resources.end() ) + { + delete (*it).second; + m_resources.erase( it ); + } + } + + bool RosterItem::online() const + { + return !m_resources.empty(); + } + + const Resource* RosterItem::resource( const std::string& res ) const + { + ResourceMap::const_iterator it = m_resources.find( res ); + return it != m_resources.end() ? (*it).second : 0; + } + + void RosterItem::setData( const RosterItemData& rid ) + { + delete m_data; + m_data = new RosterItemData( rid ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/rosteritem.h b/smack/smack/src/main/cpp/gloox/src/rosteritem.h new file mode 100644 index 00000000..b9180b65 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/rosteritem.h @@ -0,0 +1,210 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef ROSTERITEM_H__ +#define ROSTERITEM_H__ + +#include "jid.h" +#include "gloox.h" +#include "resource.h" +#include "presence.h" + +#include +#include + + +namespace gloox +{ + + class RosterItemData; + + /** + * @brief An abstraction of a roster item. + * + * For each RosterItem all resources that are available (online in some way) are stored in + * a ResourceMap. This map is accessible using the resources() function. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API RosterItem + { + friend class RosterManager; + + public: + /** + * A list of resources for the given JID. + */ + typedef std::map ResourceMap; + + /** + * An empty string. + */ + const JID EmptyJID; + + /** + * Constructs a new item of the roster. + * @param jid The JID of the contact. + * @param name The displayed name of the contact. + */ + RosterItem( const std::string& jid, const std::string& name = EmptyString ); + + /** + * Constructs a new RosterItem using the data holding class. + * @param data The RosterItemData to construct the item from. The new + * item will own the data object. + */ + RosterItem( const RosterItemData& data ); + + /** + * Virtual destructor. + */ + virtual ~RosterItem(); + + /** + * Sets the displayed name of a contact/roster item. + * @param name The contact's new name. + */ + void setName( const std::string& name ); + + /** + * Retrieves the displayed name of a contact/roster item. + * @return The contact's name. + */ + const std::string& name() const; + + /** + * Returns the contact's bare JID. + * @return The contact's bare JID. + * @deprecated Use jidJID() for now. In 1.1, jidJID() will be renamed back to jid(). + */ + GLOOX_DEPRECATED const std::string& jid() const; + + /** + * Returns the contact's bare JID. + * @return The contact's bare JID. + * @todo Rename to jid() for 1.1. + */ + const JID& jidJID() const; + + /** + * Sets the current subscription status of the contact. + * @param subscription The current subscription. + * @param ask Whether a subscription request is pending. + */ + void setSubscription( const std::string& subscription, const std::string& ask ); + + /** + * Returns the current subscription type between the remote and the local entity. + * @return The subscription type. + */ + SubscriptionType subscription() const; + + /** + * Sets the groups this RosterItem belongs to. + * @param groups The groups to set for this item. + */ + void setGroups( const StringList& groups ); + + /** + * Returns the groups this RosterItem belongs to. + * @return The groups this item belongs to. + */ + const StringList groups() const; + + /** + * Whether the item has unsynchronized changes. + * @return @b True if the item has unsynchronized changes, @b false otherwise. + */ + bool changed() const; + + /** + * Indicates whether this item has at least one resource online (in any state). + * @return @b True if at least one resource is online, @b false otherwise. + */ + bool online() const; + + /** + * Returns the contact's resources. + * @return The contact's resources. + */ + const ResourceMap& resources() const { return m_resources; } + + /** + * Returns the Resource for a specific resource string. + * @param res The resource string. + * @return The Resource if found, 0 otherwise. + */ + const Resource* resource( const std::string& res ) const; + + /** + * Returns the Resource with the highest priority. + * @return The Resource with the highest priority. + */ + const Resource* highestResource() const; + + protected: + /** + * Sets the current presence of the resource. + * @param resource The resource to set the presence for. + * @param presence The current presence. + */ + void setPresence( const std::string& resource, Presence::PresenceType presence ); + + /** + * Sets the current status message of the resource. + * @param resource The resource to set the status message for. + * @param msg The current status message, i.e. from the presence info. + */ + void setStatus( const std::string& resource, const std::string& msg ); + + /** + * Sets the current priority of the resource. + * @param resource The resource to set the status message for. + * @param priority The resource's priority, i.e. from the presence info. + */ + void setPriority( const std::string& resource, int priority ); + + /** + * Sets the resource's presence extensions. + * @param resource The resource to set the extensions for. + * @param exts The extensions to set. + */ + void setExtensions( const std::string& resource, const StanzaExtensionList& exts ); + + /** + * Removes the 'changed' flag from the item. + */ + void setSynchronized(); + + /** + * This function is called to remove subsequent resources from a RosterItem. + * @param resource The resource to remove. + */ + void removeResource( const std::string& resource ); + + /** + * This function deletes the internal RosterItemData and replaces it with the provided + * one. The RosterItem will own the RosterItemData instance. + */ + void setData( const RosterItemData& rid ); + + private: + RosterItemData* m_data; + ResourceMap m_resources; + + }; + +} + +#endif // ROSTERITEM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/rosteritemdata.h b/smack/smack/src/main/cpp/gloox/src/rosteritemdata.h new file mode 100644 index 00000000..2aa4355e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/rosteritemdata.h @@ -0,0 +1,232 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef ROSTERITEMBASE_H__ +#define ROSTERITEMBASE_H__ + +#include "gloox.h" +#include "jid.h" +#include "tag.h" + +#include +#include + + +namespace gloox +{ + + /** + * @brief A class holding roster item data. + * + * You should not need to use this class directly. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API RosterItemData + { + + public: + /** + * Constructs a new item of the roster. + * @param jid The JID of the contact. + * @param name The displayed name of the contact. + * @param groups A list of groups the contact belongs to. + */ + RosterItemData( const JID& jid, const std::string& name, + const StringList& groups ) + : m_jid( jid.full() ), m_jidJID( jid ), m_name( name ), m_groups( groups ), + m_subscription( S10nNone ), m_changed( false ), m_remove( false ) + {} + + /** + * Constructs a new item of the roster, scheduled for removal. + * @param jid The JID of the contact to remove. + */ + RosterItemData( const JID& jid ) + : m_jid( jid.full() ), m_jidJID( jid ), m_subscription( S10nNone ), m_changed( false ), + m_remove( true ) + {} + + /** + * Copy constructor. + * @param right The RosterItemData to copy. + */ + RosterItemData( const RosterItemData& right ) + : m_jid( right.m_jid ), m_jidJID( right.m_jidJID ), m_name( right.m_name ), + m_groups( right.m_groups ), m_subscription( right.m_subscription ), + m_changed( right.m_changed ), m_remove( right.m_remove ) + {} + + /** + * Constructs a new item of the roster. + * @param jid The JID of the contact. + * @param name The displayed name of the contact. + * @param groups A list of groups the contact belongs to. + * @deprecated Will be removed for 1.1. + */ + GLOOX_DEPRECATED_CTOR RosterItemData( const std::string& jid, const std::string& name, + const StringList& groups ) + : m_jid( jid ), m_jidJID( jid), m_name( name ), m_groups( groups ), + m_subscription( S10nNone ), m_changed( false ), m_remove( false ) + {} + + /** + * Constructs a new item of the roster, scheduled for removal. + * @param jid The JID of the contact to remove. + * @deprecated Will be removed for 1.1. + */ + GLOOX_DEPRECATED_CTOR RosterItemData( const std::string& jid ) + : m_jid( jid ), m_jidJID( jid), m_subscription( S10nNone ), m_changed( false ), + m_remove( true ) + {} + + /** + * Virtual destructor. + */ + virtual ~RosterItemData() {} + + /** + * Returns the contact's bare JID. + * @return The contact's bare JID. + * @deprecated Will be removed for 1.1. + */ + GLOOX_DEPRECATED const std::string& jid() const { return m_jid; } + + /** + * Returns the contact's bare JID. + * @return The contact's bare JID. + * @todo Rename to jid() for 1.1. + */ + const JID& jidJID() const { return m_jidJID; } + + /** + * Sets the displayed name of a contact/roster item. + * @param name The contact's new name. + */ + void setName( const std::string& name ) + { + m_name = name; + m_changed = true; + } + + /** + * Retrieves the displayed name of a contact/roster item. + * @return The contact's name. + */ + const std::string& name() const { return m_name; } + + /** + * Sets the current subscription status of the contact. + * @param subscription The current subscription. + * @param ask Whether a subscription request is pending. + */ + void setSubscription( const std::string& subscription, const std::string& ask ) + { + m_sub = subscription; + m_ask = ask; + + if( subscription == "from" && ask.empty() ) + m_subscription = S10nFrom; + else if( subscription == "from" && !ask.empty() ) + m_subscription = S10nFromOut; + else if( subscription == "to" && ask.empty() ) + m_subscription = S10nTo; + else if( subscription == "to" && !ask.empty() ) + m_subscription = S10nToIn; + else if( subscription == "none" && ask.empty() ) + m_subscription = S10nNone; + else if( subscription == "none" && !ask.empty() ) + m_subscription = S10nNoneOut; + else if( subscription == "both" ) + m_subscription = S10nBoth; + } + + /** + * Returns the current subscription type between the remote and the local entity. + * @return The subscription type. + */ + SubscriptionType subscription() const { return m_subscription; } + + /** + * Sets the groups this RosterItem belongs to. + * @param groups The groups to set for this item. + */ + void setGroups( const StringList& groups ) + { + m_groups = groups; + m_changed = true; + } + + /** + * Returns the groups this RosterItem belongs to. + * @return The groups this item belongs to. + */ + const StringList& groups() const { return m_groups; } + + /** + * Whether the item has unsynchronized changes. + * @return @b True if the item has unsynchronized changes, @b false otherwise. + */ + bool changed() const { return m_changed; } + + /** + * Whether the item is scheduled for removal. + * @return @b True if the item is subject to a removal or scheduled for removal, @b false + * otherwise. + */ + bool remove() const { return m_remove; } + + /** + * Removes the 'changed' flag from the item. + */ + void setSynchronized() { m_changed = false; } + + /** + * Retruns a Tag representation of the roster item data. + * @return A Tag representation. + */ + Tag* tag() const + { + Tag* i = new Tag( "item" ); + i->addAttribute( "jid", m_jidJID.full() ); + if( m_remove ) + i->addAttribute( "subscription", "remove" ); + else + { + i->addAttribute( "name", m_name ); + StringList::const_iterator it = m_groups.begin(); + for( ; it != m_groups.end(); ++it ) + new Tag( i, "group", (*it) ); + i->addAttribute( "subscription", m_sub ); + i->addAttribute( "ask", m_ask ); + } + return i; + } + + protected: + GLOOX_DEPRECATED std::string m_jid; /**< @deprecated Will be removed for 1.1. */ + JID m_jidJID; /**< @todo Rename to m_jid for 1.1. */ + std::string m_name; + StringList m_groups; + SubscriptionType m_subscription; + std::string m_sub; + std::string m_ask; + bool m_changed; + bool m_remove; + + }; + +} + +#endif // ROSTERITEMBASE_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/rosterlistener.h b/smack/smack/src/main/cpp/gloox/src/rosterlistener.h new file mode 100644 index 00000000..a6c40d6b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/rosterlistener.h @@ -0,0 +1,173 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef ROSTERLISTENER_H__ +#define ROSTERLISTENER_H__ + +#include "rosteritem.h" + +#include +#include + +namespace gloox +{ + + class IQ; + class Presence; + + /** + * A map of JID/RosterItem pairs. + */ + typedef std::map Roster; + + /** + * @brief A virtual interface which can be reimplemented to receive roster updates. + * + * A class implementing this interface and being registered as RosterListener with the + * RosterManager object receives notifications about all the changes in the server-side + * roster. Only one RosterListener per Roster at a time is possible. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API RosterListener + { + public: + /** + * Virtual Destructor. + */ + virtual ~RosterListener() {} + + /** + * Reimplement this function if you want to be notified about new items + * on the server-side roster (items subject to a so-called Roster Push). + * This function will be called regardless who added the item, either this + * resource or another. However, it will not be called for JIDs for which + * presence is received without them being on the roster. + * @param jid The new item's full address. + */ + virtual void handleItemAdded( const JID& jid ) = 0; + + /** + * Reimplement this function if you want to be notified about items + * which authorised subscription. + * @param jid The authorising item's full address. + */ + virtual void handleItemSubscribed( const JID& jid ) = 0; + + /** + * Reimplement this function if you want to be notified about items that + * were removed from the server-side roster (items subject to a so-called Roster Push). + * This function will be called regardless who deleted the item, either this resource or + * another. + * @param jid The removed item's full address. + */ + virtual void handleItemRemoved( const JID& jid ) = 0; + + /** + * Reimplement this function if you want to be notified about items that + * were modified on the server-side roster (items subject to a so-called Roster Push). + * A roster push is initiated if a second resource of this JID modifies an item stored on the + * server-side contact list. This can include modifying the item's name, its groups, or the + * subscription status. These changes are pushed by the server to @b all connected resources. + * This is why this function will be called if you modify a roster item locally and synchronize + * it with the server. + * @param jid The modified item's full address. + */ + virtual void handleItemUpdated( const JID& jid ) = 0; + + /** + * Reimplement this function if you want to be notified about items which + * removed subscription authorization. + * @param jid The item's full address. + */ + virtual void handleItemUnsubscribed( const JID& jid ) = 0; + + /** + * Reimplement this function if you want to receive the whole server-side roster + * on the initial roster push. After successful authentication, RosterManager asks the + * server for the full server-side roster. Invocation of this method announces its arrival. + * Roster item status is set to 'unavailable' until incoming presence info updates it. A full + * roster push only happens once per connection. + * @param roster The full roster. + */ + virtual void handleRoster( const Roster& roster ) = 0; + + /** + * This function is called on every status change of an item in the roster. + * If the presence is of type Unavailable, then the resource has already been + * removed from the RosterItem. + * @param item The roster item. + * @param resource The resource that changed presence. + * @param presence The item's new presence. + * @param msg The status change message. + * @since 0.9 + */ + virtual void handleRosterPresence( const RosterItem& item, const std::string& resource, + Presence::PresenceType presence, const std::string& msg ) = 0; + + /** + * This function is called on every status change of a JID that matches the Client's + * own JID. + * If the presence is of type Unavailable, then the resource has already been + * removed from the RosterItem. + * @param item The self item. + * @param resource The resource that changed presence. + * @param presence The item's new presence. + * @param msg The status change message. + * @since 0.9 + */ + virtual void handleSelfPresence( const RosterItem& item, const std::string& resource, + Presence::PresenceType presence, const std::string& msg ) = 0; + + /** + * This function is called when an entity wishes to subscribe to this entity's presence. + * If the handler is registered as a asynchronous handler for subscription requests, + * the return value of this function is ignored. In this case you should use + * RosterManager::ackSubscriptionRequest() to answer the request. + * @param jid The requesting item's address. + * @param msg A message sent along with the request. + * @return Return @b true to allow subscription and subscribe to the remote entity's + * presence, @b false to ignore the request. + */ + virtual bool handleSubscriptionRequest( const JID& jid, const std::string& msg ) = 0; + + /** + * This function is called when an entity unsubscribes from this entity's presence. + * If the handler is registered as a asynchronous handler for subscription requests, + * the return value of this function is ignored. In this case you should use + * RosterManager::unsubscribe() if you want to unsubscribe yourself from the contct's + * presence and to remove the contact from the roster. + * @param jid The item's address. + * @param msg A message sent along with the request. + * @return Return @b true to unsubscribe from the remote entity, @b false to ignore. + */ + virtual bool handleUnsubscriptionRequest( const JID& jid, const std::string& msg ) = 0; + + /** + * This function is called whenever presence from an entity is received which is not in + * the roster. + * @param presence The full presence stanza. + */ + virtual void handleNonrosterPresence( const Presence& presence ) = 0; + + /** + * This function is called if the server returned an error. + * @param iq The error stanza. + */ + virtual void handleRosterError( const IQ& iq ) = 0; + }; + +} + +#endif // ROSTERLISTENER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/rostermanager.cpp b/smack/smack/src/main/cpp/gloox/src/rostermanager.cpp new file mode 100644 index 00000000..c46120dd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/rostermanager.cpp @@ -0,0 +1,421 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "clientbase.h" +#include "rostermanager.h" +#include "disco.h" +#include "rosteritem.h" +#include "rosteritemdata.h" +#include "rosterlistener.h" +#include "privatexml.h" +#include "util.h" +#include "stanzaextension.h" +#include "capabilities.h" + + +namespace gloox +{ + + // ---- RosterManager::Query ---- + RosterManager::Query::Query( const JID& jid, const std::string& name, const StringList& groups ) + : StanzaExtension( ExtRoster ) + { + m_roster.push_back( new RosterItemData( jid, name, groups ) ); + } + + RosterManager::Query::Query( const JID& jid ) + : StanzaExtension( ExtRoster ) + { + m_roster.push_back( new RosterItemData( jid ) ); + } + + RosterManager::Query::Query( const Tag* tag ) + : StanzaExtension( ExtRoster ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_ROSTER ) + return; + + const ConstTagList& l = tag->findTagList( "query/item" ); + ConstTagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + StringList groups; + const ConstTagList& g = (*it)->findTagList( "item/group" ); + ConstTagList::const_iterator it_g = g.begin(); + for( ; it_g != g.end(); ++it_g ) + groups.push_back( (*it_g)->cdata() ); + + const std::string sub = (*it)->findAttribute( "subscription" ); + if( sub == "remove" ) + m_roster.push_back( new RosterItemData( JID( (*it)->findAttribute( "jid" ) ) ) ); + else + { + RosterItemData* rid = new RosterItemData( JID( (*it)->findAttribute( "jid" ) ), + (*it)->findAttribute( "name" ), + groups ); + rid->setSubscription( sub, (*it)->findAttribute( "ask" ) ); + m_roster.push_back( rid ); + } + } + } + + RosterManager::Query::~Query() + { + util::clearList( m_roster ); + } + + const std::string& RosterManager::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_ROSTER + "']"; + return filter; + } + + Tag* RosterManager::Query::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_ROSTER ); + + RosterData::const_iterator it = m_roster.begin(); + for( ; it != m_roster.end(); ++it ) + t->addChild( (*it)->tag() ); + + return t; + } + + StanzaExtension* RosterManager::Query::clone() const + { + Query* q = new Query(); + RosterData::const_iterator it = m_roster.begin(); + for( ; it != m_roster.end(); ++it ) + { + q->m_roster.push_back( new RosterItemData( *(*it) ) ); + } + return q; + } + // ---- ~RosterManager::Query ---- + + // ---- RosterManager ---- + RosterManager::RosterManager( ClientBase* parent ) + : m_rosterListener( 0 ), m_parent( parent ), m_privateXML( 0 ), + m_syncSubscribeReq( false ) + { + if( m_parent ) + { + m_parent->registerIqHandler( this, ExtRoster ); + m_parent->registerPresenceHandler( this ); + m_parent->registerSubscriptionHandler( this ); + m_parent->registerStanzaExtension( new Query() ); + + m_self = new RosterItem( m_parent->jid().bare() ); + m_privateXML = new PrivateXML( m_parent ); + } + } + + RosterManager::~RosterManager() + { + if( m_parent ) + { + m_parent->removeIqHandler( this, ExtRoster ); + m_parent->removeIDHandler( this ); + m_parent->removePresenceHandler( this ); + m_parent->removeSubscriptionHandler( this ); + m_parent->removeStanzaExtension( ExtRoster ); + delete m_self; + delete m_privateXML; + } + + util::clearMap( m_roster ); + } + + Roster* RosterManager::roster() + { + return &m_roster; + } + + void RosterManager::fill() + { + if( !m_parent ) + return; + + util::clearMap( m_roster ); + m_privateXML->requestXML( "roster", XMLNS_ROSTER_DELIMITER, this ); + IQ iq( IQ::Get, JID(), m_parent->getID() ); + iq.addExtension( new Query() ); + m_parent->send( iq, this, RequestRoster ); + } + + bool RosterManager::handleIq( const IQ& iq ) + { + if( iq.subtype() != IQ::Set ) // FIXME add checks for 'from' attribute (empty or bare self jid?) + return false; + + // single roster item push + const Query* q = iq.findExtension( ExtRoster ); + if( q && q->roster().size() ) + mergePush( q->roster() ); + + IQ re( IQ::Result, JID(), iq.id() ); + m_parent->send( re ); + return true; + } + + void RosterManager::handleIqID( const IQ& iq, int context ) + { + if( iq.subtype() == IQ::Result ) // initial roster + { + const Query* q = iq.findExtension( ExtRoster ); + if( q ) + mergeRoster( q->roster() ); + + if( context == RequestRoster ) + { + if( m_parent ) + m_parent->rosterFilled(); + + if( m_rosterListener ) + m_rosterListener->handleRoster( m_roster ); + } + } + else if( iq.subtype() == IQ::Error ) + { + if( context == RequestRoster && m_parent ) + m_parent->rosterFilled(); + + if( m_rosterListener ) + m_rosterListener->handleRosterError( iq ); + } + } + + void RosterManager::handlePresence( const Presence& presence ) + { + if( presence.subtype() == Presence::Error ) + return; + + bool self = false; + Roster::iterator it = m_roster.find( presence.from().bare() ); + if( it != m_roster.end() || ( self = ( presence.from().bareJID() == m_self->jidJID() ) ) ) + { + RosterItem* ri = self ? m_self : (*it).second; + const std::string& resource = presence.from().resource(); + + if( presence.presence() == Presence::Unavailable ) + ri->removeResource( resource ); + else + { + ri->setPresence( resource, presence.presence() ); + ri->setStatus( resource, presence.status() ); + ri->setPriority( resource, presence.priority() ); + ri->setExtensions( resource, presence.extensions() ); + } + + if( m_rosterListener && !self ) + m_rosterListener->handleRosterPresence( *ri, resource, + presence.presence(), presence.status() ); + else if( m_rosterListener && self ) + m_rosterListener->handleSelfPresence( *ri, resource, + presence.presence(), presence.status() ); + } + else + { + if( m_rosterListener ) + m_rosterListener->handleNonrosterPresence( presence ); + } + } + + void RosterManager::subscribe( const JID& jid, const std::string& name, + const StringList& groups, const std::string& msg ) + { + if( !jid ) + return; + + add( jid, name, groups ); + + Subscription s( Subscription::Subscribe, jid.bareJID(), msg ); + m_parent->send( s ); + } + + + void RosterManager::add( const JID& jid, const std::string& name, const StringList& groups ) + { + if( !jid ) + return; + + IQ iq( IQ::Set, JID(), m_parent->getID() ); + iq.addExtension( new Query( jid, name, groups) ); + + m_parent->send( iq, this, AddRosterItem ); + } + + void RosterManager::unsubscribe( const JID& jid, const std::string& msg ) + { + Subscription p( Subscription::Unsubscribe, jid.bareJID(), msg ); + m_parent->send( p ); + } + + void RosterManager::cancel( const JID& jid, const std::string& msg ) + { + Subscription p( Subscription::Unsubscribed, jid.bareJID(), msg ); + m_parent->send( p ); + } + + void RosterManager::remove( const JID& jid ) + { + if( !jid ) + return; + + IQ iq( IQ::Set, JID(), m_parent->getID() ); + iq.addExtension( new Query( jid ) ); + + m_parent->send( iq, this, RemoveRosterItem ); + } + + void RosterManager::synchronize() + { + Roster::const_iterator it = m_roster.begin(); + for( ; it != m_roster.end(); ++it ) + { + if( !(*it).second->changed() ) + continue; + + IQ iq( IQ::Set, JID(), m_parent->getID() ); + iq.addExtension( new Query( (*it).second->jidJID(), (*it).second->name(), (*it).second->groups() ) ); + m_parent->send( iq, this, SynchronizeRoster ); + } + } + + void RosterManager::ackSubscriptionRequest( const JID& to, bool ack ) + { + Subscription p( ack ? Subscription::Subscribed + : Subscription::Unsubscribed, to.bareJID() ); + m_parent->send( p ); + } + + void RosterManager::handleSubscription( const Subscription& s10n ) + { + if( !m_rosterListener ) + return; + + switch( s10n.subtype() ) + { + case Subscription::Subscribe: + { + bool answer = m_rosterListener->handleSubscriptionRequest( s10n.from(), s10n.status() ); + if( m_syncSubscribeReq ) + { + ackSubscriptionRequest( s10n.from(), answer ); + } + break; + } + case Subscription::Subscribed: + { + m_rosterListener->handleItemSubscribed( s10n.from() ); + break; + } + + case Subscription::Unsubscribe: + { + Subscription p( Subscription::Unsubscribed, s10n.from().bareJID() ); + m_parent->send( p ); + + bool answer = m_rosterListener->handleUnsubscriptionRequest( s10n.from(), s10n.status() ); + if( m_syncSubscribeReq && answer ) + remove( s10n.from().bare() ); + break; + } + + case Subscription::Unsubscribed: + { + m_rosterListener->handleItemUnsubscribed( s10n.from() ); + break; + } + + default: + break; + } + } + + void RosterManager::registerRosterListener( RosterListener* rl, bool syncSubscribeReq ) + { + m_syncSubscribeReq = syncSubscribeReq; + m_rosterListener = rl; + } + + void RosterManager::removeRosterListener() + { + m_syncSubscribeReq = false; + m_rosterListener = 0; + } + + void RosterManager::setDelimiter( const std::string& delimiter ) + { + m_delimiter = delimiter; + Tag* t = new Tag( "roster", m_delimiter ); + t->addAttribute( XMLNS, XMLNS_ROSTER_DELIMITER ); + m_privateXML->storeXML( t, this ); + } + + void RosterManager::handlePrivateXML( const Tag* xml ) + { + if( xml ) + m_delimiter = xml->cdata(); + } + + void RosterManager::handlePrivateXMLResult( const std::string& /*uid*/, PrivateXMLResult /*result*/ ) + { + } + + RosterItem* RosterManager::getRosterItem( const JID& jid ) + { + Roster::const_iterator it = m_roster.find( jid.bare() ); + return it != m_roster.end() ? (*it).second : 0; + } + + void RosterManager::mergePush( const RosterData& data ) + { + RosterData::const_iterator it = data.begin(); + for( ; it != data.end(); ++it ) + { + Roster::iterator itr = m_roster.find( (*it)->jidJID().full() ); + if( itr != m_roster.end() ) + { + if( (*it)->remove() ) + { + if( m_rosterListener ) + m_rosterListener->handleItemRemoved( (*it)->jidJID().full() ); + delete (*itr).second; + m_roster.erase( itr ); + } + else + { + (*itr).second->setData( *(*it) ); + if( m_rosterListener ) + m_rosterListener->handleItemUpdated( (*it)->jidJID().full() ); + } + } + else if( !(*it)->remove() ) + { + m_roster.insert( std::make_pair( (*it)->jidJID().full(), new RosterItem( *(*it) ) ) ); + if( m_rosterListener ) + m_rosterListener->handleItemAdded( (*it)->jidJID().full() ); + } + } + } + + void RosterManager::mergeRoster( const RosterData& data ) + { + RosterData::const_iterator it = data.begin(); + for( ; it != data.end(); ++it ) + m_roster.insert( std::make_pair( (*it)->jidJID().full(), new RosterItem( *(*it) ) ) ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/rostermanager.h b/smack/smack/src/main/cpp/gloox/src/rostermanager.h new file mode 100644 index 00000000..d0da2894 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/rostermanager.h @@ -0,0 +1,283 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef ROSTERMANAGER_H__ +#define ROSTERMANAGER_H__ + +#include "subscriptionhandler.h" +#include "privatexmlhandler.h" +#include "iqhandler.h" +#include "presencehandler.h" +#include "rosterlistener.h" + +#include +#include +#include + +namespace gloox +{ + + class ClientBase; + class Stanza; + class PrivateXML; + class RosterItem; + + /** + * @brief This class implements Jabber/XMPP roster handling in the @b jabber:iq:roster namespace. + * + * It takes care of changing presence, subscriptions, etc. + * You can modify any number of RosterItems within the Roster at any time. These changes must be + * synchronized with the server by calling @ref synchronize(). Note that incoming Roster pushes + * initiated by other resources may overwrite changed values. + * Additionally, @xep{0083} (Nested Roster Groups) is implemented herein. + * + * @author Jakob Schröter + * @since 0.3 + */ + class GLOOX_API RosterManager : public IqHandler, public PresenceHandler, public SubscriptionHandler, + public PrivateXMLHandler + { + public: + /** + * Creates a new RosterManager. + * @param parent The ClientBase which is used for communication. + */ + RosterManager( ClientBase* parent ); + + /** + * Virtual destructor. + */ + virtual ~RosterManager(); + + /** + * This function does the initial filling of the roster with + * the current server-side roster. + */ + void fill(); + + /** + * This function returns the roster. + * @return Returns a map of JIDs with their current presence. + */ + Roster* roster(); + + /** + * Use this function to subscribe to a new JID. The contact is added to the roster automatically + * (by compliant servers, as required by RFC 3921). + * @param jid The address to subscribe to. + * @param name The displayed name of the contact. + * @param groups A list of groups the contact belongs to. + * @param msg A message sent along with the request. + */ + void subscribe( const JID& jid, const std::string& name = EmptyString, + const StringList& groups = StringList(), + const std::string& msg = EmptyString ); + + /** + * Synchronizes locally modified RosterItems back to the server. + */ + void synchronize(); + + /** + * Use this function to add a contact to the roster. No subscription request is sent. + * @note Use @ref unsubscribe() to remove an item from the roster. + * @param jid The JID to add. + * @param name The displayed name of the contact. + * @param groups A list of groups the contact belongs to. + */ + void add( const JID& jid, const std::string& name, const StringList& groups ); + + /** + * Use this function to unsubscribe from a contact's presence. You will no longer + * receive presence from this contact. + * @param jid The address to unsubscribe from. + * @param msg A message to send along with the request. + * @since 0.9 + * @note Use remove() to remove a contact from the roster and to cancel its subscriptions. + */ + void unsubscribe( const JID& jid, const std::string& msg = EmptyString ); + + /** + * Use this function to cancel the contact's subscription to your presence. The contact will + * no longer receive presence from you. + * @param jid The contact's JID. + * @param msg A message to send along with the request. + * @since 0.9 + * @note Use remove() to remove a contact from the roster and to cancel its subscriptions. + */ + void cancel( const JID& jid, const std::string& msg = EmptyString ); + + /** + * Use this function to remove a contact from the roster. Subscription is implicitely + * cancelled. + * @param jid The contact's JID. + * @since 0.9 + */ + void remove( const JID& jid ); + + /** + * Use this function to acknowledge a subscription request if you requested asynchronous + * subscription request handling. + * @param to The JID to authorize/decline. + * @param ack Whether to authorize or decline the contact's request. + */ + void ackSubscriptionRequest( const JID& to, bool ack ); + + /** + * Use this function to retrieve the delimiter of Nested Roster Groups (@xep{0083}). + * @return The group delimiter. + * @since 0.7 + */ + const std::string& delimiter() const { return m_delimiter; } + + /** + * Use this function to set the group delimiter (@xep{0083}). + * @param delimiter The group delimiter. + * @since 0.7 + */ + void setDelimiter( const std::string& delimiter ); + + /** + * Lets you retrieve the RosterItem that belongs to the given JID. + * @param jid The JID to return the RosterItem for. + */ + RosterItem* getRosterItem( const JID& jid ); + + /** + * Register @c rl as object that receives updates on roster operations. + * For GUI applications it may be necessary to display a dialog or whatever to + * the user without blocking. If you want that, use asynchronous subscription + * requests. If you want to answer a request right away, make it synchronous. + * @param rl The object that receives roster updates. + * @param syncSubscribeReq Indicates whether (Un)SubscriptionRequests shall + * be handled synchronous (@b true) or asynchronous (@b false). Default: synchronous. + */ + void registerRosterListener( RosterListener* rl, bool syncSubscribeReq = true ); + + /** + * Complementary function to @ref registerRosterListener. Removes the current RosterListener. + * Roster events will not be delivered anywhere. + */ + void removeRosterListener(); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + // reimplemented from PresenceHandler. + virtual void handlePresence( const Presence& presence ); + + // reimplemented from SubscriptionHandler. + virtual void handleSubscription( const Subscription& subscription ); + + // reimplemented from PrivateXMLHandler + virtual void handlePrivateXML( const Tag* xml ); + + // reimplemented from PrivateXMLHandler + virtual void handlePrivateXMLResult( const std::string& uid, PrivateXMLResult pxResult ); + + private: +#ifdef ROSTERMANAGER_TEST + public: +#endif + typedef std::list RosterData; + + /** + * @brief An implementation of StanzaExtension that helps in roster management. + * + * @author Jakob Schröter + * @since 1.0 + */ + class Query : public StanzaExtension + { + public: + /** + * Constructs a new object that can be used to add a contact to the roster. + * @param jid The contact's JID. + * @param name The contact's optional user-defined name. + * @param groups An optional list of groups the contact belongs to. + */ + Query( const JID& jid, const std::string& name, const StringList& groups ); + + /** + * Constructs a new object that can be used to remove a contact from the roster. + * @param jid The contact's JID. + */ + Query( const JID& jid ); + + /** + * Creates a new Query object from teh given Tag. + * @param tag The Tag to parse. + */ + Query( const Tag* tag = 0 ); + + /** + * Destructor. + */ + ~Query(); + + /** + * Retruns the internal roster that was created by the ctors (either from an + * incoming packet or passed arguments). + * This is not necessarily the full roster, but may be a single item. + * @return The (possibly partial) roster). + */ + const RosterData& roster() const { return m_roster; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const; + + private: + RosterData m_roster; + + }; + + void mergePush( const RosterData& data ); + void mergeRoster( const RosterData& data ); + + RosterListener* m_rosterListener; + Roster m_roster; + ClientBase* m_parent; + PrivateXML* m_privateXML; + RosterItem* m_self; + + std::string m_delimiter; + bool m_syncSubscribeReq; + + enum RosterContext + { + RequestRoster, + AddRosterItem, + RemoveRosterItem, + SynchronizeRoster + }; + + }; + +} + +#endif // ROSTER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/search.cpp b/smack/smack/src/main/cpp/gloox/src/search.cpp new file mode 100644 index 00000000..9a1428db --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/search.cpp @@ -0,0 +1,223 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "search.h" + +#include "clientbase.h" +#include "dataform.h" +#include "iq.h" + +namespace gloox +{ + + // Search::Query ---- + Search::Query::Query( DataForm* form ) + : StanzaExtension( ExtSearch ), m_form( form ), m_fields( 0 ) + { + } + + Search::Query::Query( int fields, const SearchFieldStruct& values ) + : StanzaExtension( ExtSearch ), m_form( 0 ), m_fields( fields ), m_values( values ) + { + } + + Search::Query::Query( const Tag* tag ) + : StanzaExtension( ExtSearch ), m_form( 0 ), m_fields( 0 ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_SEARCH ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "instructions" ) + { + m_instructions = (*it)->cdata(); + } + else if( (*it)->name() == "item" ) + { + m_srl.push_back( new SearchFieldStruct( (*it) ) ); + } + else if( (*it)->name() == "first" ) + m_fields |= SearchFieldFirst; + else if( (*it)->name() == "last" ) + m_fields |= SearchFieldLast; + else if( (*it)->name() == "email" ) + m_fields |= SearchFieldEmail; + else if( (*it)->name() == "nick" ) + m_fields |= SearchFieldNick; + else if( !m_form && (*it)->name() == "x" && (*it)->xmlns() == XMLNS_X_DATA ) + m_form = new DataForm( (*it) ); + } + } + + Search::Query::~Query() + { + delete m_form; + SearchResultList::iterator it = m_srl.begin(); + for( ; it != m_srl.end(); ++it ) + delete (*it); + } + + const std::string& Search::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_SEARCH + "']"; + return filter; + } + + Tag* Search::Query::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_SEARCH ); + if( m_form ) + t->addChild( m_form->tag() ); + else if( m_fields ) + { + if( !m_instructions.empty() ) + new Tag( t, "instructions", m_instructions ); + if( m_fields & SearchFieldFirst ) + new Tag( t, "first", m_values.first() ); + if( m_fields & SearchFieldLast ) + new Tag( t, "last", m_values.last() ); + if( m_fields & SearchFieldNick ) + new Tag( t, "nick", m_values.nick() ); + if( m_fields & SearchFieldEmail ) + new Tag( t, "email", m_values.email() ); + } + else if( !m_srl.empty() ) + { + SearchResultList::const_iterator it = m_srl.begin(); + for( ; it != m_srl.end(); ++it ) + { + t->addChild( (*it)->tag() ); + } + } + return t; + } + // ---- ~Search::Query ---- + + // ---- Search ---- + Search::Search( ClientBase* parent ) + : m_parent( parent ) + { + if( m_parent ) + m_parent->registerStanzaExtension( new Query() ); + } + + Search::~Search() + { + if( m_parent ) + { + m_parent->removeIDHandler( this ); + m_parent->removeStanzaExtension( ExtRoster ); + } + } + + void Search::fetchSearchFields( const JID& directory, SearchHandler* sh ) + { + if( !m_parent || !directory || !sh ) + return; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Get, directory, id ); + iq.addExtension( new Query() ); + m_track[id] = sh; + m_parent->send( iq, this, FetchSearchFields ); + } + + void Search::search( const JID& directory, DataForm* form, SearchHandler* sh ) + { + if( !m_parent || !directory || !sh ) + return; + + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, directory, id ); + iq.addExtension( new Query( form ) ); + + m_track[id] = sh; + m_parent->send( iq, this, DoSearch ); + } + + void Search::search( const JID& directory, int fields, const SearchFieldStruct& values, SearchHandler* sh ) + { + if( !m_parent || !directory || !sh ) + return; + + const std::string& id = m_parent->getID(); + + IQ iq( IQ::Set, directory, id ); + iq.addExtension( new Query( fields, values ) ); + + m_track[id] = sh; + m_parent->send( iq, this, DoSearch ); + } + + void Search::handleIqID( const IQ& iq, int context ) + { + TrackMap::iterator it = m_track.find( iq.id() ); + if( it != m_track.end() ) + { + switch( iq.subtype() ) + { + case IQ::Result: + { + const Query* q = iq.findExtension( ExtSearch ); + if( !q ) + return; + + switch( context ) + { + case FetchSearchFields: + { + if( q->form() ) + { + (*it).second->handleSearchFields( iq.from(), q->form() ); + } + else + { + (*it).second->handleSearchFields( iq.from(), q->fields(), q->instructions() ); + } + break; + } + case DoSearch: + { + if( q->form() ) + { + (*it).second->handleSearchResult( iq.from(), q->form() ); + } + else + { + (*it).second->handleSearchResult( iq.from(), q->result() ); + } + break; + } + } + break; + } + case IQ::Error: + (*it).second->handleSearchError( iq.from(), iq.error() ); + break; + + default: + break; + } + + m_track.erase( it ); + } + + return; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/search.h b/smack/smack/src/main/cpp/gloox/src/search.h new file mode 100644 index 00000000..d25c0619 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/search.h @@ -0,0 +1,215 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef SEARCH_H__ +#define SEARCH_H__ + +#include "gloox.h" +#include "searchhandler.h" +#include "discohandler.h" +#include "iqhandler.h" +#include "stanzaextension.h" +#include "dataform.h" + +#include + +namespace gloox +{ + + class ClientBase; + class IQ; + class Disco; + + /** + * @brief An implementation of @xep{0055} (Jabber Search) + * + * To perform a search in a directory (e.g., a User Directory): + * + * @li Inherit from SearchHandler and implement the virtual functions. + * @li Create a new Search object. + * @li Ask the directory for the supported fields using fetchSearchFields(). Depending on the directory, + * the result can be either an integer (bit-wise ORed supported fields) or a DataForm. + * @li Search by either using a DataForm or the SearchFieldStruct. + * @li The results can be either a (empty) list of SearchFieldStructs or a DataForm. + * + * @author Jakob Schröter + * @since 0.8.5 + */ + class GLOOX_API Search : public IqHandler + { + + public: + /** + * Creates a new Search object. + * @param parent The ClientBase to use. + */ + Search( ClientBase* parent ); + + /** + * Virtual Destructor. + */ + ~Search(); + + /** + * Use this function to check which fields the directory supports. + * @param directory The (user) directory to fetch the available/searchable fields from. + * @param sh The SearchHandler to notify about the results. + */ + void fetchSearchFields( const JID& directory, SearchHandler* sh ); + + /** + * Initiates a search on the given directory, with the given data form. The given SearchHandler + * is notified about the results. + * @param directory The (user) directory to search. + * @param form The DataForm contains the phrases the user wishes to search for. + * Search will delete the form eventually. + * @param sh The SearchHandler to notify about the results. + */ + void search( const JID& directory, DataForm* form, SearchHandler* sh ); + + /** + * Initiates a search on the given directory, with the given phrases. The given SearchHandler + * is notified about the results. + * @param directory The (user) directory to search. + * @param fields Bit-wise ORed FieldEnum values describing the valid (i.e., set) fields in + * the @b values parameter. + * @param values Contains the phrases to search for. + * @param sh The SearchHandler to notify about the results. + */ + void search( const JID& directory, int fields, const SearchFieldStruct& values, SearchHandler* sh ); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ) { (void)iq; return false; } + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + protected: + enum IdType + { + FetchSearchFields, + DoSearch + }; + + typedef std::map TrackMap; + TrackMap m_track; + + ClientBase* m_parent; + Disco* m_disco; + + private: +#ifdef SEARCH_TEST + public: +#endif + /** + * @brief A wrapping class for the @xep{0055} <query> element. + * + * @author Jakob Schröter + * @since 1.0 + */ + class Query : public StanzaExtension + { + public: + /** + * Creates a new object that can be used to carry out a search. + * @param form A DataForm containing the search terms. + */ + Query( DataForm* form ); + + /** + * Creates a new object that can be used to carry out a search. + * @param fields Bit-wise ORed FieldEnum values describing the valid (i.e., set) + * fields in the @b values parameter. + * @param values Contains the phrases to search for. + */ + Query( int fields, const SearchFieldStruct& values ); + + /** + * Creates a new object that can be used to request search fields. + * Optionally, it can parse the given Tag. + * @param tag The Tag to parse. + */ + Query( const Tag* tag = 0 ); + + /** + * Virtual Destructor. + */ + virtual ~Query(); + + /** + * Returns the contained search form, if any. + * @return The search form. May be 0. + */ + const DataForm* form() const { return m_form; } + + /** + * Returns the search instructions, if given + * @return The search instructions. + */ + const std::string& instructions() const { return m_instructions; } + + /** + * Returns the search fields, if set. + * @return The search fields. + */ + int fields() const { return m_fields; } + + /** + * Returns the search's result, if available in legacy form. Use form() otherwise. + * @return The search's result. + */ + const SearchResultList& result() const { return m_srl; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + Query* q = new Query(); + q->m_form = m_form ? new DataForm( *m_form ) : 0; + q->m_fields = m_fields; + q->m_values = m_values; + q->m_instructions = m_instructions; + SearchResultList::const_iterator it = m_srl.begin(); + for( ; it != m_srl.end(); ++it ) + q->m_srl.push_back( new SearchFieldStruct( *(*it) ) ); + return q; + } + + private: +#ifdef SEARCH_TEST + public: +#endif + DataForm* m_form; + int m_fields; + SearchFieldStruct m_values; + std::string m_instructions; + SearchResultList m_srl; + }; + + }; + +} + +#endif // SEARCH_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/searchhandler.h b/smack/smack/src/main/cpp/gloox/src/searchhandler.h new file mode 100644 index 00000000..07657d51 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/searchhandler.h @@ -0,0 +1,195 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SEARCHHANDLER_H__ +#define SEARCHHANDLER_H__ + +#include "stanza.h" + +#include + +namespace gloox +{ + + class DataForm; + + /** + * Holds all the possible fields a server may require for searching according + * to Section 7, @xep{0055}. + * + * @author Jakob Schröter + * @since 1.0 + */ + class SearchFieldStruct + { + public: + /** + * + */ + SearchFieldStruct() {} + + /** + * + */ + SearchFieldStruct( const std::string& first, const std::string& last, const std::string& nick, + const std::string& email ) + : m_first( first ), m_last( last ), m_nick( nick ), m_email( email ) + {} + + /** + * + */ + SearchFieldStruct( const Tag* tag ) + { + if( !tag || tag->name() != "item" || !tag->hasAttribute( "jid" ) ) + return; + + m_jid.setJID( tag->findAttribute( "jid" ) ); + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "first" ) + m_first = (*it)->cdata(); + else if( (*it)->name() == "last" ) + m_last = (*it)->cdata(); + else if( (*it)->name() == "email" ) + m_email = (*it)->cdata(); + else if( (*it)->name() == "nick" ) + m_nick = (*it)->cdata(); + } + } + + /** + * + */ + ~SearchFieldStruct() {} + + /** + * + */ + const std::string first() const { return m_first; } + + /** + * + */ + const std::string last() const { return m_last; } + + /** + * + */ + const std::string email() const { return m_email; } + + /** + * + */ + const std::string nick() const { return m_nick; } + + /** + * + */ + Tag* tag() const + { + Tag* t = new Tag( "item" ); + t->addAttribute( "jid", m_jid.bare() ); + new Tag( t, "first", m_first ); + new Tag( t, "last", m_last ); + new Tag( t, "nick", m_nick ); + new Tag( t, "email", m_email ); + return t; + } + + private: + std::string m_first; /**< User's first name. */ + std::string m_last; /**< User's last name. */ + std::string m_nick; /**< User's nickname. */ + std::string m_email; /**< User's email. */ + JID m_jid; /**< User's JID. */ + }; + + /** + * The possible fields of a @xep{0055} user search. + */ + enum SearchFieldEnum + { + SearchFieldFirst = 1, /**< Search in first names. */ + SearchFieldLast = 2, /**< Search in last names. */ + SearchFieldNick = 4, /**< Search in nicknames. */ + SearchFieldEmail = 8 /**< Search in email addresses. */ + }; + + /** + * A list of directory entries returned by a search. + */ + typedef std::list SearchResultList; + + /** + * @brief A virtual interface that enables objects to receive Jabber Search (@xep{0055}) results. + * + * A class implementing this interface can receive the result of a Jabber Search. + * + * @author Jakob Schröter + * @since 0.8.5 + */ + class GLOOX_API SearchHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~SearchHandler() {} + + /** + * This function is called to announce the searchable fields a directory supports. It is the result + * of a call to @link gloox::Search::fetchSearchFields Search::fetchSearchFields() @endlink. + * @param directory The directory that was queried. + * @param fields Bit-wise ORed SearchFieldEnum values. + * @param instructions Plain-text instructions for the end user. + */ + virtual void handleSearchFields( const JID& directory, int fields, + const std::string& instructions ) = 0; + + /** + * This function is called to announce the searchable fields a directory supports. It is the result + * of a call to @link gloox::Search::fetchSearchFields Search::fetchSearchFields() @endlink. + * @param directory The directory that was queried. + * @param form A DataForm describing the valid searchable fields. Do not delete the form. + */ + virtual void handleSearchFields( const JID& directory, const DataForm* form ) = 0; + + /** + * This function is called to let the SearchHandler know about the results of the search. + * @param directory The searched directory. + * @param resultList A list of SearchFieldStructs. May be empty. + */ + virtual void handleSearchResult( const JID& directory, const SearchResultList& resultList ) = 0; + + /** + * This function is called to let the SearchHandler know about the result of the search. + * @param directory The searched directory. + * @param form A DataForm containing the search results. Do not delete the form. + */ + virtual void handleSearchResult( const JID& directory, const DataForm* form ) = 0; + + /** + * This function is called if a error occured as a result to a search or search field request. + * @param directory The queried/searched directory. + * @param error The error. May be 0. + */ + virtual void handleSearchError( const JID& directory, const Error* error ) = 0; + + }; + +} + +#endif // SEARCHHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/sha.cpp b/smack/smack/src/main/cpp/gloox/src/sha.cpp new file mode 100644 index 00000000..94494974 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/sha.cpp @@ -0,0 +1,251 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "config.h" + +#include "sha.h" +#include "gloox.h" + +#include + +namespace gloox +{ + + SHA::SHA() + { + init(); + } + + SHA::~SHA() + { + } + + void SHA::init() + { + Length_Low = 0; + Length_High = 0; + Message_Block_Index = 0; + + H[0] = 0x67452301; + H[1] = 0xEFCDAB89; + H[2] = 0x98BADCFE; + H[3] = 0x10325476; + H[4] = 0xC3D2E1F0; + + m_finished = false; + m_corrupted = false; + } + + void SHA::reset() + { + init(); + } + + const std::string SHA::hex() + { + if( m_corrupted ) + return EmptyString; + + if( !m_finished ) + finalize(); + + char buf[41]; + for( int i = 0; i < 20; ++i ) + sprintf( buf + i * 2, "%02x", (unsigned char)( H[i >> 2] >> ( ( 3 - ( i & 3 ) ) << 3 ) ) ); + + return std::string( buf, 40 ); + } + + const std::string SHA::binary() + { + if( !m_finished ) + finalize(); + + unsigned char digest[20]; + for( int i = 0; i < 20; ++i ) + digest[i] = (unsigned char)( H[i >> 2] >> ( ( 3 - ( i & 3 ) ) << 3 ) ); + + return std::string( (char*)digest, 20 ); + } + + void SHA::finalize() + { + if( !m_finished ) + { + pad(); + m_finished = true; + } + } + + void SHA::feed( const unsigned char* data, unsigned length ) + { + if( !length ) + return; + + if( m_finished || m_corrupted ) + { + m_corrupted = true; + return; + } + + while( length-- && !m_corrupted ) + { + Message_Block[Message_Block_Index++] = ( *data & 0xFF ); + + Length_Low += 8; + Length_Low &= 0xFFFFFFFF; + if( Length_Low == 0 ) + { + Length_High++; + Length_High &= 0xFFFFFFFF; + if( Length_High == 0 ) + { + m_corrupted = true; + } + } + + if( Message_Block_Index == 64 ) + { + process(); + } + + ++data; + } + } + + void SHA::feed( const std::string& data ) + { + feed( (const unsigned char*)data.c_str(), (int)data.length() ); + } + + void SHA::process() + { + const unsigned K[] = { 0x5A827999, + 0x6ED9EBA1, + 0x8F1BBCDC, + 0xCA62C1D6 + }; + int t; + unsigned temp; + unsigned W[80]; + unsigned A, B, C, D, E; + + for( t = 0; t < 16; t++ ) + { + W[t] = ((unsigned) Message_Block[t * 4]) << 24; + W[t] |= ((unsigned) Message_Block[t * 4 + 1]) << 16; + W[t] |= ((unsigned) Message_Block[t * 4 + 2]) << 8; + W[t] |= ((unsigned) Message_Block[t * 4 + 3]); + } + + for( t = 16; t < 80; ++t ) + { + W[t] = shift( 1, W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16] ); + } + + A = H[0]; + B = H[1]; + C = H[2]; + D = H[3]; + E = H[4]; + + for( t = 0; t < 20; ++t ) + { + temp = shift( 5, A ) + ( ( B & C ) | ( ( ~B ) & D ) ) + E + W[t] + K[0]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = shift( 30, B ); + B = A; + A = temp; + } + + for( t = 20; t < 40; ++t ) + { + temp = shift( 5, A ) + ( B ^ C ^ D ) + E + W[t] + K[1]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = shift( 30, B ); + B = A; + A = temp; + } + + for( t = 40; t < 60; ++t ) + { + temp = shift( 5, A ) + ( ( B & C ) | ( B & D ) | ( C & D ) ) + E + W[t] + K[2]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = shift( 30, B ); + B = A; + A = temp; + } + + for( t = 60; t < 80; ++t ) + { + temp = shift( 5, A ) + ( B ^ C ^ D ) + E + W[t] + K[3]; + temp &= 0xFFFFFFFF; + E = D; + D = C; + C = shift( 30, B ); + B = A; + A = temp; + } + + H[0] = ( H[0] + A ) & 0xFFFFFFFF; + H[1] = ( H[1] + B ) & 0xFFFFFFFF; + H[2] = ( H[2] + C ) & 0xFFFFFFFF; + H[3] = ( H[3] + D ) & 0xFFFFFFFF; + H[4] = ( H[4] + E ) & 0xFFFFFFFF; + + Message_Block_Index = 0; + } + + void SHA::pad() + { + Message_Block[Message_Block_Index++] = 0x80; + + if( Message_Block_Index > 56 ) + { + while( Message_Block_Index < 64 ) + { + Message_Block[Message_Block_Index++] = 0; + } + + process(); + } + + while( Message_Block_Index < 56 ) + { + Message_Block[Message_Block_Index++] = 0; + } + + Message_Block[56] = static_cast( ( Length_High >> 24 ) & 0xFF ); + Message_Block[57] = static_cast( ( Length_High >> 16 ) & 0xFF ); + Message_Block[58] = static_cast( ( Length_High >> 8 ) & 0xFF ); + Message_Block[59] = static_cast( ( Length_High ) & 0xFF ); + Message_Block[60] = static_cast( ( Length_Low >> 24 ) & 0xFF ); + Message_Block[61] = static_cast( ( Length_Low >> 16 ) & 0xFF ); + Message_Block[62] = static_cast( ( Length_Low >> 8 ) & 0xFF ); + Message_Block[63] = static_cast( ( Length_Low ) & 0xFF ); + + process(); + } + + + unsigned SHA::shift( int bits, unsigned word ) + { + return ( ( word << bits ) & 0xFFFFFFFF) | ( ( word & 0xFFFFFFFF ) >> ( 32-bits ) ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/sha.h b/smack/smack/src/main/cpp/gloox/src/sha.h new file mode 100644 index 00000000..563e4e71 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/sha.h @@ -0,0 +1,98 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef SHA_H__ +#define SHA_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + /** + * @brief An implementation of SHA1. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SHA + { + + public: + /** + * Constructs a new SHA object. + */ + SHA(); + + /** + * Virtual Destructor. + */ + virtual ~SHA(); + + /** + * Resets the internal state. + */ + void reset(); + + /** + * Finalizes the hash computation. + */ + void finalize(); + + /** + * Returns the message digest in hex notation. Finalizes the hash if finalize() + * has not been called before. + * @return The message digest. + */ + const std::string hex(); + + /** + * Returns the raw binary message digest. Finalizes the hash if finalize() + * has not been called before. + * @return The message raw binary digest. + */ + const std::string binary(); + + /** + * Provide input to SHA1. + * @param data The data to compute the digest of. + * @param length The size of the data in bytes. + */ + void feed( const unsigned char* data, unsigned length ); + + /** + * Provide input to SHA1. + * @param data The data to compute the digest of. + */ + void feed( const std::string& data ); + + private: + void process(); + void pad(); + inline unsigned shift( int bits, unsigned word ); + void init(); + + unsigned H[5]; + unsigned Length_Low; + unsigned Length_High; + unsigned char Message_Block[64]; + int Message_Block_Index; + bool m_finished; + bool m_corrupted; + + }; + +} + +#endif // SHA_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/shim.cpp b/smack/smack/src/main/cpp/gloox/src/shim.cpp new file mode 100644 index 00000000..239424bb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/shim.cpp @@ -0,0 +1,71 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "shim.h" +#include "tag.h" + +namespace gloox +{ + + SHIM::SHIM( const HeaderList& hl ) + : StanzaExtension( ExtSHIM ), m_headers( hl ) + { + } + + SHIM::SHIM( const Tag* tag ) + : StanzaExtension( ExtSHIM ) + { + if( !tag || tag->name() != "headers" || tag->xmlns() != XMLNS_SHIM ) + return; + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() != "header" || !(*it)->hasAttribute( "name" ) ) + return; + + m_headers.insert( std::make_pair( (*it)->findAttribute( "name" ), (*it)->cdata() ) ); + } + } + + SHIM::~SHIM() + { + } + + const std::string& SHIM::filterString() const + { + static const std::string filter = "/presence/headers[@xmlns='" + XMLNS_SHIM + "']" + "|/message/headers[@xmlns='" + XMLNS_SHIM + "']" + "|/iq/*/headers[@xmlns='" + XMLNS_SHIM + "']"; + return filter; + } + + Tag* SHIM::tag() const + { + if( !m_headers.size() ) + return 0; + + Tag* t = new Tag( "headers" ); + t->setXmlns( XMLNS_SHIM ); + + HeaderList::const_iterator it = m_headers.begin(); + for( ; it != m_headers.end(); ++it ) + { + Tag* h = new Tag( t, "header" ); + h->addAttribute( "name", (*it).first ); + h->setCData( (*it).second ); + } + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/shim.h b/smack/smack/src/main/cpp/gloox/src/shim.h new file mode 100644 index 00000000..5a6ec192 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/shim.h @@ -0,0 +1,91 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef SHIM_H__ +#define SHIM_H__ + +#include "stanzaextension.h" +#include "macros.h" + +#include +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief An implementation/abstraction of Stanza Headers and Internet Metadata (SHIM, @xep{0131}). + * + * XEP Version: 1.2 + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API SHIM : public StanzaExtension + { + public: + /** + * A list of SHIM headers (name & value). + */ + typedef std::map HeaderList; + + /** + * Creates a new SHIM object containing the given headers. + * @param hl The list of headers. + */ + SHIM( const HeaderList& hl ); + + /** + * Creates a new SHIM object from the given Tag. + * @param tag The Tag to parse. + */ + SHIM( const Tag* tag = 0 ); + + /** + * Returns the headers. + * @return The headers. + */ + const HeaderList& headers() const { return m_headers; } + + /** + * Virtual destructor. + */ + virtual ~SHIM(); + + // re-implemented from StanzaExtension + virtual const std::string& filterString() const; + + // re-implemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new SHIM( tag ); + } + + // re-implemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new SHIM( *this ); + } + + private: + HeaderList m_headers; + + }; + +} + +#endif // SHIM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/sihandler.h b/smack/smack/src/main/cpp/gloox/src/sihandler.h new file mode 100644 index 00000000..2b12df8f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/sihandler.h @@ -0,0 +1,70 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SIHANDLER_H__ +#define SIHANDLER_H__ + +#include "macros.h" +#include "simanager.h" + +#include + +namespace gloox +{ + + class IQ; + class Tag; + class JID; + + /** + * @brief An abstract base class to handle results of outgoing SI requests, i.e. you requested a stream + * (using SIManager::requestSI()) to send a file to a remote entity. + * + * You should usually not need to use this class directly, unless your profile is not supported + * by gloox. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SIHandler + { + + public: + /** + * Virtual destructor. + */ + virtual ~SIHandler() {} + + /** + * This function is called to handle results of outgoing SI requests, i.e. you requested a stream + * (using SIManager::requestSI()) to send a file to a remote entity. + * @param from The remote SI receiver. + * @param to The SI requestor. Usually oneself. Used in component scenario. + * @param sid The stream ID. + * @param si The request's complete SI. + */ + virtual void handleSIRequestResult( const JID& from, const JID& to, const std::string& sid, + const SIManager::SI& si ) = 0; + + /** + * This function is called to handle a request error or decline. + * @param iq The complete error stanza. + * @param sid The request's SID. + */ + virtual void handleSIRequestError( const IQ& iq, const std::string& sid ) = 0; + + }; + +} + +#endif // SIHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/simanager.cpp b/smack/smack/src/main/cpp/gloox/src/simanager.cpp new file mode 100644 index 00000000..b2a6e998 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/simanager.cpp @@ -0,0 +1,259 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "simanager.h" + +#include "siprofilehandler.h" +#include "sihandler.h" +#include "clientbase.h" +#include "disco.h" +#include "error.h" + +namespace gloox +{ + + // ---- SIManager::SI ---- + SIManager::SI::SI( const Tag* tag ) + : StanzaExtension( ExtSI ), m_tag1( 0 ), m_tag2( 0 ) + { + if( !tag || tag->name() != "si" || tag->xmlns() != XMLNS_SI ) + return; + + m_valid = true; + + m_id = tag->findAttribute( "id" ); + m_mimetype = tag->findAttribute( "mime-type" ); + m_profile = tag->findAttribute( "profile" ); + + Tag* c = tag->findChild( "file", "xmlns", XMLNS_SI_FT ); + if ( c ) + m_tag1 = c->clone(); + c = tag->findChild( "feature", "xmlns", XMLNS_FEATURE_NEG ); + if( c ) + m_tag2 = c->clone(); + } + + SIManager::SI::SI( Tag* tag1, Tag* tag2, const std::string& id, + const std::string& mimetype, const std::string& profile ) + : StanzaExtension( ExtSI ), m_tag1( tag1 ), m_tag2( tag2 ), + m_id( id ), m_mimetype( mimetype ), m_profile( profile ) + { + m_valid = true; + } + + SIManager::SI::~SI() + { + delete m_tag1; + delete m_tag2; + } + + const std::string& SIManager::SI::filterString() const + { + static const std::string filter = "/iq/si[@xmlns='" + XMLNS_SI + "']"; + return filter; + } + + Tag* SIManager::SI::tag() const + { + if( !m_valid ) + return 0; + + Tag* t = new Tag( "si" ); + t->setXmlns( XMLNS_SI ); + if( !m_id.empty() ) + t->addAttribute( "id", m_id ); + if( !m_mimetype.empty() ) + t->addAttribute( "mime-type", m_mimetype.empty() ? "binary/octet-stream" : m_mimetype ); + if( !m_profile.empty() ) + t->addAttribute( "profile", m_profile ); + if( m_tag1 ) + t->addChildCopy( m_tag1 ); + if( m_tag2 ) + t->addChildCopy( m_tag2 ); + + return t; + } + // ---- ~SIManager::SI ---- + + // ---- SIManager ---- + SIManager::SIManager( ClientBase* parent, bool advertise ) + : m_parent( parent ), m_advertise( advertise ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new SI() ); + m_parent->registerIqHandler( this, ExtSI ); + if( m_parent->disco() && m_advertise ) + m_parent->disco()->addFeature( XMLNS_SI ); + } + } + + SIManager::~SIManager() + { + if( m_parent ) + { + m_parent->removeIqHandler( this, ExtSI ); + m_parent->removeIDHandler( this ); + if( m_parent->disco() && m_advertise ) + m_parent->disco()->removeFeature( XMLNS_SI ); + } + } + + const std::string SIManager::requestSI( SIHandler* sih, const JID& to, const std::string& profile, + Tag* child1, Tag* child2, const std::string& mimetype, + const JID& from, const std::string& sid ) + { + if( !m_parent || !sih ) + return EmptyString; + + const std::string& id = m_parent->getID(); + const std::string& sidToUse = sid.empty() ? m_parent->getID() : sid; + + IQ iq( IQ::Set, to, id ); + iq.addExtension( new SI( child1, child2, sidToUse, mimetype, profile ) ); + if( from ) + iq.setFrom( from ); + + TrackStruct t; + t.sid = sidToUse; + t.profile = profile; + t.sih = sih; + m_track[id] = t; + m_parent->send( iq, this, OfferSI ); + + return sidToUse; + } + + void SIManager::acceptSI( const JID& to, const std::string& id, Tag* child1, Tag* child2, const JID& from ) + { + IQ iq( IQ::Result, to, id ); + iq.addExtension( new SI( child1, child2 ) ); + if( from ) + iq.setFrom( from ); + + m_parent->send( iq ); + } + + void SIManager::declineSI( const JID& to, const std::string& id, SIError reason, const std::string& text ) + { + IQ iq( IQ::Error, to, id ); + Error* error; + if( reason == NoValidStreams || reason == BadProfile ) + { + Tag* appError = 0; + if( reason == NoValidStreams ) + appError = new Tag( "no-valid-streams", XMLNS, XMLNS_SI ); + else if( reason == BadProfile ) + appError = new Tag( "bad-profile", XMLNS, XMLNS_SI ); + error = new Error( StanzaErrorTypeCancel, StanzaErrorBadRequest, appError ); + } + else + { + error = new Error( StanzaErrorTypeCancel, StanzaErrorForbidden ); + if( !text.empty() ) + error->text( text ); + } + + iq.addExtension( error ); + m_parent->send( iq ); + } + + void SIManager::registerProfile( const std::string& profile, SIProfileHandler* sih ) + { + if( !sih || profile.empty() ) + return; + + m_handlers[profile] = sih; + + if( m_parent && m_advertise && m_parent->disco() ) + m_parent->disco()->addFeature( profile ); + } + + void SIManager::removeProfile( const std::string& profile ) + { + if( profile.empty() ) + return; + + m_handlers.erase( profile ); + + if( m_parent && m_advertise && m_parent->disco() ) + m_parent->disco()->removeFeature( profile ); + } + + bool SIManager::handleIq( const IQ& iq ) + { + TrackMap::iterator itt = m_track.find( iq.id() ); + if( itt != m_track.end() ) + return false; + + const SI* si = iq.findExtension( ExtSI ); + if( !si || si->profile().empty() ) + return false; + + HandlerMap::const_iterator it = m_handlers.find( si->profile() ); + if( it != m_handlers.end() && (*it).second ) + { + (*it).second->handleSIRequest( iq.from(), iq.to(), iq.id(), *si ); + return true; + } + + return false; + } + + void SIManager::handleIqID( const IQ& iq, int context ) + { + switch( iq.subtype() ) + { + case IQ::Result: + if( context == OfferSI ) + { + TrackMap::iterator it = m_track.find( iq.id() ); + if( it != m_track.end() ) + { + const SI* si = iq.findExtension( ExtSI ); + if( !si /*|| si->profile().empty()*/ ) + return; + +// Tag* si = iq.query(); +// Tag* ptag = 0; +// Tag* fneg = 0; +// if( si && si->name() == "si" && si->xmlns() == XMLNS_SI ) +// { +// ptag = si->findChildWithAttrib( XMLNS, (*it).second.profile ); +// fneg = si->findChild( "feature", XMLNS, XMLNS_FEATURE_NEG ); +// } + + // FIXME: remove above commented code and + // check corectness of last 3 params! + (*it).second.sih->handleSIRequestResult( iq.from(), iq.to(), (*it).second.sid, *si ); + m_track.erase( it ); + } + } + break; + case IQ::Error: + if( context == OfferSI ) + { + TrackMap::iterator it = m_track.find( iq.id() ); + if( it != m_track.end() ) + { + (*it).second.sih->handleSIRequestError( iq, (*it).second.sid ); + m_track.erase( it ); + } + } + break; + default: + break; + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/simanager.h b/smack/smack/src/main/cpp/gloox/src/simanager.h new file mode 100644 index 00000000..3cbae53a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/simanager.h @@ -0,0 +1,245 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SIMANAGER_H__ +#define SIMANAGER_H__ + +#include "iqhandler.h" + +namespace gloox +{ + + class ClientBase; + class SIProfileHandler; + class SIHandler; + + /** + * @brief This class manages streams initiated using @xep{0095}. + * + * You need only one SIManager object per ClientBase instance. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SIManager : public IqHandler + { + + public: + /** + * SI error conditions. + */ + enum SIError + { + NoValidStreams, /**< None of the stream types are acceptable */ + BadProfile, /**< Profile is not understood. */ + RequestRejected /**< SI request was rejected. */ + }; + + class SI : public StanzaExtension + { + public: + /** + * Constructs a new SI object from the given Tag. + * @param tag The Tag to parse. + */ + SI( const Tag* tag = 0 ); + + /** + * Constructs a new SI object, wrapping the given Tags. + * @param tag1 Tag 1. + * @param tag2 Tag 2. + */ + SI( Tag* tag1, Tag* tag2, const std::string& id = EmptyString, + const std::string& mimetype = EmptyString, + const std::string& profile = EmptyString ); + + /** + * Virtual destructor. + */ + virtual ~SI(); + + /** + * Returns the current profile namespace. + * @return The profile namespace. + */ + const std::string& profile() const { return m_profile; }; + + /** + * Returns the mime-type. + * @return The mime-type. + */ + const std::string& mimetype() const { return m_mimetype; }; + + /** + * Returns the SI's ID. + * @return The SI's id. + */ + const std::string& id() const { return m_id; }; + + /** + * Returns the first SI child tag. + * @return The first SI child tag. + * @todo Use real objects. + */ + const Tag* tag1() const { return m_tag1; }; + + /** + * Returns the second SI child tag. + * @return The second SI child tag. + * @todo Use real objects. + */ + const Tag* tag2() const { return m_tag2; }; + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new SI( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + SI* s = new SI(); + s->m_tag1 = m_tag1 ? m_tag1->clone() : 0; + s->m_tag2 = m_tag2 ? m_tag2->clone() : 0; + s->m_id = m_id; + s->m_mimetype = m_mimetype; + s->m_profile = m_profile; + return s; + } + + private: + Tag* m_tag1; + Tag* m_tag2; + std::string m_id; + std::string m_mimetype; + std::string m_profile; + }; + + /** + * Constructor. + * @param parent The ClientBase to use for communication. + * @param advertise Whether to advertise SI capabilities by disco. Defaults to true. + */ + SIManager( ClientBase* parent, bool advertise = true ); + + /** + * Virtual destructor. + */ + virtual ~SIManager(); + + /** + * Starts negotiating a stream with a remote entity. + * @param sih The SIHandler to handle the result of this request. + * @param to The entity to talk to. + * @param profile The SI profile to use. See @xep{0095} for more info. + * @param child1 The first of the two allowed children of the SI offer. See + * @xep{0095} for more info. + * @param child2 The second of the two allowed children of the SI offer. See + * @xep{0095} for more info. Defaults to 0. + * @param mimetype The stream's/file's mime-type. Defaults to 'binary/octet-stream'. + * @param from An optional 'from' address to stamp outgoing requests with. + * Used in component scenario only. Defaults to empty JID. + * @param sid Optionally specify a stream ID (SID). If empty, one will be generated. + * @return The requested stream's ID (SID). Empty if SIHandler or ClientBase are invalid. + * @note The SIManager claims ownership of the Tags supplied to this function, and will + * delete them after use. + */ + const std::string requestSI( SIHandler* sih, const JID& to, const std::string& profile, Tag* child1, + Tag* child2 = 0, const std::string& mimetype = "binary/octet-stream", + const JID& from = JID(), const std::string& sid = EmptyString ); + + /** + * Call this function to accept an SI request previously announced by means of + * SIProfileHandler::handleSIRequest(). + * @param to The requestor. + * @param id The request's id, as passed to SIProfileHandler::handleSIRequest(). + * @param child1 The <feature/> child of the SI request. See @xep{0095} for details. + * @param child2 The profile-specific child of the SI request. May be 0. See @xep{0095} + * for details. + * @param from An optional 'from' address to stamp outgoing stanzas with. + * Used in component scenario only. Defaults to empty JID. + * @note The SIManager claims ownership of the Tags supplied to this function, and will + * delete them after use. + */ + void acceptSI( const JID& to, const std::string& id, Tag* child1, Tag* child2 = 0, const JID& from = JID() ); + + /** + * Call this function to decline an SI request previously announced by means of + * SIProfileHandler::handleSIRequest(). + * @param to The requestor. + * @param id The request's id, as passed to SIProfileHandler::handleSIRequest(). + * @param reason The reason for the reject. + * @param text An optional human-readable text explaining the decline. + */ + void declineSI( const JID& to, const std::string& id, SIError reason, + const std::string& text = EmptyString ); + + /** + * Registers the given SIProfileHandler to handle requests for the + * given SI profile namespace. The profile will be advertised by disco (unless disabled in + * the ctor). + * @param profile The complete profile namespace, e.g. + * http://jabber.org/protocol/si/profile/file-transfer. + * @param sih The profile handler. + */ + void registerProfile( const std::string& profile, SIProfileHandler* sih ); + + /** + * Un-registers the given profile. + * @param profile The profile's namespace to un-register. + */ + void removeProfile( const std::string& profile ); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef SIMANAGER_TEST + public: +#endif + enum TrackContext + { + OfferSI + }; + + struct TrackStruct + { + std::string sid; + std::string profile; + SIHandler* sih; + }; + typedef std::map TrackMap; + TrackMap m_track; + + ClientBase* m_parent; + + typedef std::map HandlerMap; + HandlerMap m_handlers; + + bool m_advertise; + + }; + +} + +#endif // SIMANAGER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/siprofileft.cpp b/smack/smack/src/main/cpp/gloox/src/siprofileft.cpp new file mode 100644 index 00000000..765cb41d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/siprofileft.cpp @@ -0,0 +1,312 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "siprofileft.h" + +#include "clientbase.h" +#include "siprofilefthandler.h" +#include "simanager.h" +#include "dataform.h" +#include "inbandbytestream.h" +#include "oob.h" +#include "socks5bytestream.h" +#include "socks5bytestreammanager.h" + +#include +#include + +namespace gloox +{ + + SIProfileFT::SIProfileFT( ClientBase* parent, SIProfileFTHandler* sipfth, SIManager* manager, + SOCKS5BytestreamManager* s5Manager ) + : m_parent( parent ), m_manager( manager ), m_handler( sipfth ), + m_socks5Manager( s5Manager ), m_delManager( false ), + m_delS5Manager( false ) + { + if( !m_manager ) + { + m_delManager = true; + m_manager = new SIManager( m_parent ); + } + + m_manager->registerProfile( XMLNS_SI_FT, this ); + + if( !m_socks5Manager ) + { + m_socks5Manager = new SOCKS5BytestreamManager( m_parent, this ); + m_delS5Manager = true; + } + } + + SIProfileFT::~SIProfileFT() + { + m_manager->removeProfile( XMLNS_SI_FT ); + + if( m_delManager ) + delete m_manager; + + if( m_socks5Manager && m_delS5Manager ) + delete m_socks5Manager; + } + + const std::string SIProfileFT::requestFT( const JID& to, const std::string& name, long size, + const std::string& hash, const std::string& desc, + const std::string& date, const std::string& mimetype, + int streamTypes, const JID& from, + const std::string& sid ) + { + if( name.empty() || size <= 0 || !m_manager ) + return EmptyString; + + Tag* file = new Tag( "file", XMLNS, XMLNS_SI_FT ); + file->addAttribute( "name", name ); + file->addAttribute( "size", size ); + if( !hash.empty() ) + file->addAttribute( "hash", hash ); + if( !date.empty() ) + file->addAttribute( "date", date ); + if( !desc.empty() ) + new Tag( file, "desc", desc ); + + Tag* feature = new Tag( "feature", XMLNS, XMLNS_FEATURE_NEG ); + DataForm df( TypeForm ); + DataFormField* dff = df.addField( DataFormField::TypeListSingle, "stream-method" ); + StringMultiMap sm; + if( streamTypes & FTTypeS5B ) + sm.insert( std::make_pair( "s5b", XMLNS_BYTESTREAMS ) ); + if( streamTypes & FTTypeIBB ) + sm.insert( std::make_pair( "ibb", XMLNS_IBB ) ); + if( streamTypes & FTTypeOOB ) + sm.insert( std::make_pair( "oob", XMLNS_IQ_OOB ) ); + dff->setOptions( sm ); + feature->addChild( df.tag() ); + + return m_manager->requestSI( this, to, XMLNS_SI_FT, file, feature, mimetype, from, sid ); + } + + void SIProfileFT::acceptFT( const JID& to, const std::string& sid, StreamType type, const JID& from ) + { + if( !m_manager ) + return; + + if( m_id2sid.find( sid ) == m_id2sid.end() ) + return; + + const std::string& id = m_id2sid[sid]; + + Tag* feature = new Tag( "feature", XMLNS, XMLNS_FEATURE_NEG ); + DataFormField* dff = new DataFormField( "stream-method" ); + switch( type ) + { + case FTTypeAll: + case FTTypeS5B: + dff->setValue( XMLNS_BYTESTREAMS ); + break; + case FTTypeIBB: + dff->setValue( XMLNS_IBB ); + if( m_handler ) + { + InBandBytestream* ibb = new InBandBytestream( m_parent, m_parent->logInstance(), to, + from ? from : m_parent->jid(), sid ); + m_handler->handleFTBytestream( ibb ); + } + break; + case FTTypeOOB: + dff->setValue( XMLNS_IQ_OOB ); + break; + } + DataForm df( TypeSubmit ); + df.addField( dff ); + feature->addChild( df.tag() ); + + m_manager->acceptSI( to, id, 0, feature, from ); + } + + void SIProfileFT::declineFT( const JID& to, const std::string& sid, SIManager::SIError reason, + const std::string& text ) + { + if( m_id2sid.find( sid ) == m_id2sid.end() || !m_manager ) + return; + + m_manager->declineSI( to, m_id2sid[sid], reason, text ); + } + + void SIProfileFT::dispose( Bytestream* bs ) + { + if( bs ) + { + if( bs->type() == Bytestream::S5B && m_socks5Manager ) + m_socks5Manager->dispose( static_cast( bs ) ); + else + delete bs; + } + } + + void SIProfileFT::cancel( Bytestream* bs ) + { + if( !bs ) + return; + + if( m_id2sid.find( bs->sid() ) == m_id2sid.end() || !m_manager ) + return; + + if( bs->type() == Bytestream::S5B && m_socks5Manager ) + m_socks5Manager->rejectSOCKS5Bytestream( bs->sid(), StanzaErrorServiceUnavailable ); + + dispose( bs ); + } + + void SIProfileFT::setStreamHosts( StreamHostList hosts ) + { + if( m_socks5Manager ) + m_socks5Manager->setStreamHosts( hosts ); + } + + void SIProfileFT::addStreamHost( const JID& jid, const std::string& host, int port ) + { + if( m_socks5Manager ) + m_socks5Manager->addStreamHost( jid, host, port ); + } + + void SIProfileFT::handleSIRequest( const JID& from, const JID& to, const std::string& id, + const SIManager::SI& si ) + { + if( si.profile() != XMLNS_SI_FT || !si.tag1() ) + return; + + if( m_handler ) + { + const Tag* t = si.tag1()->findChild( "desc" ); + const std::string& desc = t ? t->cdata() : EmptyString; + + const std::string& mt = si.mimetype(); + int types = 0; + + if( si.tag2() ) + { + const DataForm df( si.tag2()->findChild( "x", XMLNS, XMLNS_X_DATA ) ); + const DataFormField* dff = df.field( "stream-method" ); + + if( dff ) + { + const StringMultiMap& options = dff->options(); + StringMultiMap::const_iterator it = options.begin(); + for( ; it != options.end(); ++it ) + { + if( (*it).second == XMLNS_BYTESTREAMS ) + types |= FTTypeS5B; + else if( (*it).second == XMLNS_IBB ) + types |= FTTypeIBB; + else if( (*it).second == XMLNS_IQ_OOB ) + types |= FTTypeOOB; + } + } + } + + const std::string& sid = si.id(); + m_id2sid[sid] = id; + m_handler->handleFTRequest( from, to, sid, si.tag1()->findAttribute( "name" ), + atol( si.tag1()->findAttribute( "size" ).c_str() ), + si.tag1()->findAttribute( "hash" ), + si.tag1()->findAttribute( "date" ), + mt.empty() ? "binary/octet-stream" : mt, + desc, types ); + } + } + + void SIProfileFT::handleSIRequestResult( const JID& from, const JID& to, const std::string& sid, + const SIManager::SI& si ) + { + if( si.tag2() ) + { + const DataForm df( si.tag2()->findChild( "x", XMLNS, XMLNS_X_DATA ) ); + const DataFormField* dff = df.field( "stream-method" ); + + if( dff ) + { + if( m_socks5Manager && dff->value() == XMLNS_BYTESTREAMS ) + { + // check return value: + m_socks5Manager->requestSOCKS5Bytestream( from, SOCKS5BytestreamManager::S5BTCP, sid, to ); + } + else if( m_handler ) + { + if( dff->value() == XMLNS_IBB ) + { + InBandBytestream* ibb = new InBandBytestream( m_parent, m_parent->logInstance(), + to ? to : m_parent->jid(), from, sid ); + + m_handler->handleFTBytestream( ibb ); + } + else if( dff->value() == XMLNS_IQ_OOB ) + { + const std::string& url = m_handler->handleOOBRequestResult( from, to, sid ); + if( !url.empty() ) + { + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, from, id ); + if( to ) + iq.setFrom( to ); + + iq.addExtension( new OOB( url, EmptyString, true ) ); + m_parent->send( iq, this, OOBSent ); + } + } + } + } + } + } + + void SIProfileFT::handleIqID( const IQ& /*iq*/, int context ) + { + switch( context ) + { + case OOBSent: +// if( iq->subtype() == IQ::Error ) +// m_handler->handleOOBError + break; + } + } + + void SIProfileFT::handleSIRequestError( const IQ& iq, const std::string& sid ) + { + if( m_handler ) + m_handler->handleFTRequestError( iq, sid ); + } + + void SIProfileFT::handleIncomingBytestreamRequest( const std::string& sid, const JID& /*from*/ ) + { +// TODO: check for valid sid/from tuple + m_socks5Manager->acceptSOCKS5Bytestream( sid ); + } + + void SIProfileFT::handleIncomingBytestream( Bytestream* bs ) + { + if( m_handler ) + m_handler->handleFTBytestream( bs ); + } + + void SIProfileFT::handleOutgoingBytestream( Bytestream* bs ) + { + if( m_handler ) + m_handler->handleFTBytestream( bs ); + } + + void SIProfileFT::handleBytestreamError( const IQ& iq, const std::string& sid ) + { + if( m_handler ) + m_handler->handleFTRequestError( iq, sid ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/siprofileft.h b/smack/smack/src/main/cpp/gloox/src/siprofileft.h new file mode 100644 index 00000000..6f4580fe --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/siprofileft.h @@ -0,0 +1,341 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SIPROFILEFT_H__ +#define SIPROFILEFT_H__ + +#include "iqhandler.h" +#include "socks5bytestreammanager.h" +#include "siprofilehandler.h" +#include "sihandler.h" +#include "simanager.h" +#include "bytestreamhandler.h" + +#include +#include + +namespace gloox +{ + + class ClientBase; + class InBandBytestream; + class IQ; + class JID; + class SIProfileFTHandler; + class SOCKS5Bytestream; + + /** + * @brief An implementation of the file transfer SI profile (@xep{0096}). + * + * An SIProfileFT object acts as a 'plugin' to the SIManager. SIProfileFT + * manages most of the file transfer functionality. The naming comes from the fact that + * File Transfer (FT) is a profile of Stream Initiation (SI). + * + * Usage: + * + * Create a new SIProfileFT object. It needs a ClientBase -derived object (e.g. Client) + * as well as a SIProfileFTHandler -derived object that will receive file transfer-related events. + * If you already use SI and the SIManager somewhere else, you should pass a pointer to that + * SIManager object as third parameter to SIProfileFT's constructor. + * @code + * class MyFileTransferHandler : public SIProfileFTHandler + * { + * // ... + * }; + * + * Client* client = new Client( ... ); + * // ... + * MyFileTransferHandler* mh = new MyFileTransferHandler( ... ); + * + * SIProfileFT* ft = new SIProfileFT( client, mh ); + * @endcode + * + * You are now, basically, ready to send and receive files. + * + * A couple of notes: + * @li There are two (actually two and a half) possible "techniques" to transfer files + * using SI. The first is using a peer-to-peer SOCKS5 bytestream, optionally via a + * (special) SOCKS5 proxy. + * The second techniques is using an in-band bytestream, i.e. the data is encapsulated in XMPP stanzas + * and sent through the server. + * + * @li To be able to send files using the former method (SOCKS5 bytestreams), you may need + * access to a SOCKS5 bytestream proxy (called StreamHost). This is especially true if either + * or both of sender and receiver are behind NATs or are otherwise blocked from establishing + * direct TCP connections. You should use Disco to query a potential SOCKS5 proxy + * for its host and port parameters and feed that information into SIProfileFT: + * @code + * ft->addStreamHost( JID( "proxy.server.dom" ), "101.102.103.104", 6677 ); + * @endcode + * You should @b not hard-code this information (esp. host/IP and port) into your app since + * the proxy may go down occasionally or vanish completely. + * + * @li In addition to (or even instead of) using external SOCKS5 proxies, you can use a + * SOCKS5BytestreamServer object that gloox provides: + * @code + * SOCKS5BytestreamServer* server = new SOCKS5BytestreamServer( client->logInstance(), 1234 ); + * if( server->listen() != ConnNoError ) + * printf( "port in use\n" ); + * + * ft->addStreamHost( client->jid(), my_ip, 1234 ); + * ft->registerSOCKS5BytestreamServer( server ); + * @endcode + * This listening server should then be integrated into your mainloop to have its + * @link gloox::SOCKS5BytestreamServer::recv() recv() @endlink method called from time to time. + * It is safe to put the server into its own thread. + * + * @li When you finally receive a Bytestream via the SIProfileFTHandler, you will need + * to integrate this bytestream with your mainloop, or put it into a separate thread (if + * occasional blocking is not acceptable). You will need to call + * @link gloox::Bytestream::connect() connect() @endlink on that Bytestream. For SOCKS5 bytestreams, + * this function will try to connect to each of the given StreamHosts and block until it has established + * a connection with one of them (or until all attempts failed). Further, if you want to receive + * a file via the bytestream, you will have to call recv() on the object from time to time. + * For in-band bytestreams, @link gloox::Bytestream::connect() connect() @endlink will send an "open the + * bytestream" request to the contact. + * + * @li For both stream types, + * @link gloox::BytestreamDataHandler::handleBytestreamOpen() BytestreamDataHandler::handleBytestreamOpen() @endlink + * will announce the established bytestream. The stream then is ready to send and receive data. + * + * @li In general, both types of streams can be handled equally, i.e. there's no need to know whether + * the underlying stream really is a SOCKS5Bytestream or an InBandBytestream. + * @link gloox::Bytestream::type() Bytestream::type() @endlink tells anyway. Note, however, that + * sending large amounts of data using in-band bytestreams may trigger rate limiting in some servers. + * + * @li If you e.g. told Client to connect through a @link gloox::ConnectionHTTPProxy HTTP proxy @endlink + * or a @link gloox::ConnectionSOCKS5Proxy SOCKS5 proxy @endlink, or any other ConnectionBase -derived + * method, or even chains thereof, SIProfileFT will use the same connection types with the same + * configuration to connect to the Stream Host/SOCKS5 proxy. If this is inappropriate because you have + * e.g. a local SOCKS5 proxy inside your local network, use SOCKS5Bytestream::setConnectionImpl() to + * override the above default connection(s). + * + * @li Do @b not delete Bytestream objects manually. Use dispose() instead. + * + * @li When using the Client's JID as the first argument to addStreamHost() as in the code snippet + * above, make sure the JID is actually a full JID. If you let the server pick a resource, the call + * to Client::jid() needs to be made @b after the connection has been established and authenticated, + * because only then Client knows its full JID. This is generally a good idea, since the server + * may choose to change the resource, even if you provided one at login. + * + * @li The interal SOCKS5BytestreamServer will obviously not work across NATs. + * + * @li Using addStreamHost(), you can add as many potential StreamHosts as you like. However, you + * should add the best options (e.g. the local SOCKS5BytestreamServer) first. + * + * When cleaning up, delete the objectes you created above in the opposite order of + * creation: + * + * @code + * delete server + * delete ft; + * delete client; + * @endcode + * + * For usage examples see src/examples/ft_send.cpp and src/examples/ft_recv.cpp. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SIProfileFT : public SIProfileHandler, public SIHandler, + public BytestreamHandler, public IqHandler + { + public: + /** + * Supported stream types. + */ + enum StreamType + { + FTTypeS5B = 1, /**< SOCKS5 Bytestreams. */ + FTTypeIBB = 2, /**< In-Band Bytestreams. */ + FTTypeOOB = 4, /**< Out-of-Band Data. */ + FTTypeAll = 0xFF /**< All types. */ + }; + + /** + * Constructor. + * @param parent The ClientBase to use for signaling. + * @param sipfth The SIProfileFTHandler to receive events. + * @param manager An optional SIManager to register with. If this is zero, SIProfileFT + * will create its own SIManager. You should pass a valid SIManager here if you are + * already using one with the @c parent ClientBase above. + * @param s5Manager An optional SOCKS5BytestreamManager to use. If this is zero, SIProfileFT + * will create its own SOCKS5BytestreamManager. You should pass a valid SOCKS5BytestreamManager + * here if you are already using one with the @c parent ClientBase above. + * @note If you passed a SIManager and/or SOCKS5BytestreamManager and/or InBandBytestreamManager + * to SIProfileFT's constructor, these objects will @b not be deleted on desctruction of SIProfileFT. + */ + SIProfileFT( ClientBase* parent, SIProfileFTHandler* sipfth, SIManager* manager = 0, + SOCKS5BytestreamManager* s5Manager = 0 ); + + /** + * Virtual destructor. + */ + virtual ~SIProfileFT(); + + /** + * Starts negotiating a file transfer with a remote entity. + * @param to The entity to send the file to. Must be a full JID. + * @param name The file's name. Mandatory and must not be empty. + * @param size The file's size. Mandatory and must be > 0. + * @param hash The file content's MD5 hash. + * @param desc A description. + * @param date The file's last modification date/time. See @xep{0082} for details. + * @param mimetype The file's mime-type. Defaults to 'binary/octet-stream' if empty. + * @param streamTypes ORed StreamType that can be used for this transfer. + * @param from An optional 'from' address to stamp outgoing requests with. + * Used in component scenario only. Defaults to empty JID. + * @param sid Optionally specify a stream ID (SID). If empty, one will be generated. + * @return The requested stream's ID (SID). Empty if conditions above (file name, size) + * are not met. + */ + const std::string requestFT( const JID& to, const std::string& name, long size, + const std::string& hash = EmptyString, + const std::string& desc = EmptyString, + const std::string& date = EmptyString, + const std::string& mimetype = EmptyString, + int streamTypes = FTTypeAll, + const JID& from = JID(), + const std::string& sid = EmptyString ); + + /** + * Call this function to accept a file transfer request previously announced by means of + * @link gloox::SIProfileFTHandler::handleFTRequest() SIProfileFTHandler::handleFTRequest() @endlink. + * @param to The requestor. + * @param sid The request's sid, as passed to SIProfileHandler::handleFTRequest(). + * @param type The desired stream type to use for this file transfer. Defaults to + * SOCKS5 Bytestream. You should not use @c FTTypeAll here. + * @param from An optional 'from' address to stamp outgoing stanzas with. + * Used in component scenario only. Defaults to empty JID. + */ + void acceptFT( const JID& to, const std::string& sid, + StreamType type = FTTypeS5B, const JID& from = JID() ); + + /** + * Call this function to decline a FT request previously announced by means of + * @link gloox::SIProfileFTHandler::handleFTRequest() SIProfileFTHandler::handleFTRequest() @endlink. + * @param to The requestor. + * @param sid The request's sid, as passed to SIProfileFTHandler::handleFTRequest(). + * @param reason The reason for the reject. + * @param text An optional human-readable text explaining the decline. + */ + void declineFT( const JID& to, const std::string& sid, SIManager::SIError reason, + const std::string& text = EmptyString ); + + /** + * Cancels the given bytestream. Most useful for SOCKS5 bytestreams where no proxies could be found. + * The given Bytestream will be deleted. + * @param bs The Bytestream to cancel. + * @note Can also be used with IBB. + */ + void cancel( Bytestream* bs ); + + /** + * To get rid of a bytestream (i.e., close and delete it), call this function. + * The remote entity will be notified about the closing of the stream. + * @param bs The bytestream to dispose. It will be deleted here. + */ + void dispose( Bytestream* bs ); + + /** + * Registers a handler that will be informed about incoming file transfer + * requests, i.e. when a remote entity wishes to send a file. + * @param sipfth A SIProfileFTHandler to register. Only one handler can be registered + * at any one time. + */ + void registerSIProfileFTHandler( SIProfileFTHandler* sipfth ) { m_handler = sipfth; } + + /** + * Removes the previously registered file transfer request handler. + */ + void removeSIProfileFTHandler() { m_handler = 0; } + + /** + * Sets a list of StreamHosts that will be used for subsequent SOCKS5 bytestream requests. + * @note At least one StreamHost is required. + * @param hosts A list of StreamHosts. + */ + void setStreamHosts( StreamHostList hosts ); + + /** + * Adds one StreamHost to the list of SOCKS5 StreamHosts. + * @param jid The StreamHost's JID. + * @param host The StreamHost's hostname. + * @param port The StreamHost's port. + */ + void addStreamHost( const JID& jid, const std::string& host, int port ); + + /** + * Tells the interal SOCKS5BytestreamManager which SOCKS5BytestreamServer handles + * peer-2-peer SOCKS5 bytestreams. + * @param server The SOCKS5BytestreamServer to use. + */ + void registerSOCKS5BytestreamServer( SOCKS5BytestreamServer* server ) + { if( m_socks5Manager ) m_socks5Manager->registerSOCKS5BytestreamServer( server ); } + + /** + * Un-registers any local SOCKS5BytestreamServer. + */ + void removeSOCKS5BytestreamServer() + { if( m_socks5Manager ) m_socks5Manager->removeSOCKS5BytestreamServer(); } + + // reimplemented from SIProfileHandler + virtual void handleSIRequest( const JID& from, const JID& to, const std::string& id, + const SIManager::SI& si ); + + // reimplemented from SIHandler + virtual void handleSIRequestResult( const JID& from, const JID& to, const std::string& sid, + const SIManager::SI& si ); + + // reimplemented from SIHandler + virtual void handleSIRequestError( const IQ& iq, const std::string& sid ); + + // reimplemented from BytestreamHandler + virtual void handleIncomingBytestreamRequest( const std::string& sid, const JID& from ); + + // reimplemented from BytestreamHandler + virtual void handleIncomingBytestream( Bytestream* bs ); + + // reimplemented from BytestreamHandler + virtual void handleOutgoingBytestream( Bytestream* bs ); + + // reimplemented from BytestreamHandler + virtual void handleBytestreamError( const IQ& iq, const std::string& sid ); + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ) { (void)iq; return false; } + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: + + enum TrackEnum + { + OOBSent + }; + + ClientBase* m_parent; + SIManager* m_manager; + SIProfileFTHandler* m_handler; + SOCKS5BytestreamManager* m_socks5Manager; + StreamHostList m_hosts; + StringMap m_id2sid; + bool m_delManager; + bool m_delS5Manager; + + }; + +} + +#endif // SIPROFILEFT_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/siprofilefthandler.h b/smack/smack/src/main/cpp/gloox/src/siprofilefthandler.h new file mode 100644 index 00000000..f1335372 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/siprofilefthandler.h @@ -0,0 +1,104 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SIPROFILEFTHANDLER_H__ +#define SIPROFILEFTHANDLER_H__ + +#include "jid.h" + +#include + +namespace gloox +{ + + class JID; + class IQ; + class Bytestream; + + /** + * @brief An abstract base class to handle file transfer (FT) requests. + * + * See SIProfileFT for more information regarding file transfer. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SIProfileFTHandler + { + + public: + /** + * Virtual destructor. + */ + virtual ~SIProfileFTHandler() {} + + /** + * This function is called to handle incoming file transfer requests, i.e. a remote entity requested + * to send a file to you. You should use either SIProfileFT::acceptFT() or + * SIProfileFT::declineFT() to accept or reject the request, respectively. + * @param from The file transfer requestor. + * @param to The file transfer recipient. Usuall oneself. Used in component scenario. + * @param sid The requested stream's ID. This sid MUST be supplied to SIProfileFT::acceptFT() + * and SIProfileFT::declineFT(), respectively. + * @param name The file name. + * @param size The file size. + * @param hash The file content's MD5 sum. + * @param date The file's last modification time. + * @param mimetype The file's mime-type. + * @param desc The file's description. + * @param stypes An ORed list of @link gloox::SIProfileFT::StreamType SIProfileFT::StreamType @endlink + * indicating the StreamTypes the initiator supports. + */ + virtual void handleFTRequest( const JID& from, const JID& to, const std::string& sid, + const std::string& name, long size, const std::string& hash, + const std::string& date, const std::string& mimetype, + const std::string& desc, int stypes ) = 0; + + /** + * This function is called to handle a request error or decline. + * @param iq The complete error stanza. + * @param sid The request's SID. + */ + virtual void handleFTRequestError( const IQ& iq, const std::string& sid ) = 0; + + /** + * This function is called to pass a negotiated bytestream (SOCKS5 or IBB). + * The bytestream is not yet open and not ready to send/receive data. + * @note To initialize the bytestream and to prepare it for data transfer + * do the following, preferable in that order: + * @li register a BytestreamDataHandler with the Bytestream, + * @li set up a separate thread for the bytestream or integrate it into + * your main loop, + * @li call its connect() method and check the return value. + * To not block your application while the data transfer and/or the connection + * attempts last, you most likely want to put the bytestream into its own + * thread or process (before calling connect() on it). It is safe to do so + * without additional synchronization. + * @param bs The bytestream. + */ + virtual void handleFTBytestream( Bytestream* bs ) = 0; + + /** + * This function is called if the contact chose OOB as the mechanism. + * @param from The remote contact's JID. + * @param to The local recipient's JID. Usually oneself. Used in component scenario. + * @param sid The stream's ID. + * @return The file's URL. + */ + virtual const std::string handleOOBRequestResult( const JID& from, const JID& to, const std::string& sid ) = 0; + + }; + +} + +#endif // SIPROFILEFTHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/siprofilehandler.h b/smack/smack/src/main/cpp/gloox/src/siprofilehandler.h new file mode 100644 index 00000000..d2e0c3d7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/siprofilehandler.h @@ -0,0 +1,62 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SIPROFILEHANDLER_H__ +#define SIPROFILEHANDLER_H__ + +#include "jid.h" +#include "simanager.h" + +#include + +namespace gloox +{ + + class Tag; + class JID; + + /** + * @brief An abstract base class to handle SI requests for a specific profile, e.g. file transfer. + * + * You should usually not need to use this class directly, unless your profile is not supported + * by gloox. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SIProfileHandler + { + + public: + /** + * Virtual destructor. + */ + virtual ~SIProfileHandler() {} + + /** + * This function is called to handle incoming SI requests, i.e. a remote entity requested + * a stream to send a file to you. You should use either SIManager::acceptSI() or + * SIManager::declineSI() to accept or reject the request, respectively. + * @param from The SI requestor. + * @param to The SI recipient, usually oneself. Used in component scenario. + * @param id The request's id (@b not the stream's id). This id MUST be supplied to either + * SIManager::acceptSI() or SIManager::declineSI(). + * @param si The request's complete SI. + */ + virtual void handleSIRequest( const JID& from, const JID& to, const std::string& id, const SIManager::SI& si ) = 0; + + }; + +} + +#endif // SIPROFILEHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/socks5bytestream.cpp b/smack/smack/src/main/cpp/gloox/src/socks5bytestream.cpp new file mode 100644 index 00000000..43dd3424 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/socks5bytestream.cpp @@ -0,0 +1,160 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "socks5bytestream.h" +#include "bytestreamdatahandler.h" +#include "clientbase.h" +#include "connectionbase.h" +#include "connectionsocks5proxy.h" +#include "sha.h" +#include "logsink.h" + +namespace gloox +{ + + SOCKS5Bytestream::SOCKS5Bytestream( SOCKS5BytestreamManager* manager, ConnectionBase* connection, + LogSink& logInstance, const JID& initiator, const JID& target, + const std::string& sid ) + : Bytestream( Bytestream::S5B, logInstance, initiator, target, sid ), + m_manager( manager ), m_connection( 0 ), m_socks5( 0 ), m_connected( false ) + { + if( connection && connection->state() == StateConnected ) + m_open = true; + + setConnectionImpl( connection ); + } + + SOCKS5Bytestream::~SOCKS5Bytestream() + { + if( m_open ) + close(); + + if( m_socks5 ) + delete m_socks5; + } + + void SOCKS5Bytestream::setConnectionImpl( ConnectionBase* connection ) + { + if( m_socks5 ) + delete m_socks5; // deletes m_connection as well + + m_connection = connection; + + SHA sha; + sha.feed( m_sid ); + sha.feed( m_initiator.full() ); + sha.feed( m_target.full() ); + m_socks5 = new ConnectionSOCKS5Proxy( this, connection, m_logInstance, sha.hex(), 0 ); + } + + bool SOCKS5Bytestream::connect() + { + if( !m_connection || !m_socks5 || !m_manager ) + return false; + + if( m_open ) + return true; + + StreamHostList::const_iterator it = m_hosts.begin(); + for( ; it != m_hosts.end(); ++it ) + { + if( ++it == m_hosts.end() ) + m_connected = true; + --it; // FIXME ++it followed by --it is kinda ugly + m_connection->setServer( (*it).host, (*it).port ); + if( m_socks5->connect() == ConnNoError ) + { + m_proxy = (*it).jid; + m_connected = true; + return true; + } + } + + m_manager->acknowledgeStreamHost( false, JID(), EmptyString ); + return false; + } + + bool SOCKS5Bytestream::send( const std::string& data ) + { + if( !m_open || !m_connection || !m_socks5 || !m_manager ) + return false; + + return m_socks5->send( data ); + } + + ConnectionError SOCKS5Bytestream::recv( int timeout ) + { + if( !m_connection || !m_socks5 || !m_manager ) + return ConnNotConnected; + + return m_socks5->recv( timeout ); + } + + void SOCKS5Bytestream::activate() + { + m_open = true; + if( m_handler ) + m_handler->handleBytestreamOpen( this ); + } + + void SOCKS5Bytestream::close() + { + if( m_open && m_handler ) + { + m_open = false; + m_connected = false; + m_socks5->disconnect(); + m_handler->handleBytestreamClose( this ); + } + } + + void SOCKS5Bytestream::handleReceivedData( const ConnectionBase* /*connection*/, const std::string& data ) + { + if( !m_handler ) + return; + + if( !m_open ) + { + m_open = true; + m_handler->handleBytestreamOpen( this ); + } + +// if( !m_open && data.length() == 2 && data[0] == 0x05 && data[1] == 0x00 ) +// { +// printf( "received acknowleding zero byte, stream is now open\n" ); +// m_open = true; +// m_handler->handleBytestream5Open( this ); +// return; +// } + + if( m_open ) + m_handler->handleBytestreamData( this, data ); + } + + void SOCKS5Bytestream::handleConnect( const ConnectionBase* /*connection*/ ) + { + m_manager->acknowledgeStreamHost( true, m_proxy, m_sid ); + + if( !m_open ) + { + m_open = true; + m_handler->handleBytestreamOpen( this ); + } + } + + void SOCKS5Bytestream::handleDisconnect( const ConnectionBase* /*connection*/, ConnectionError /*reason*/ ) + { + close(); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/socks5bytestream.h b/smack/smack/src/main/cpp/gloox/src/socks5bytestream.h new file mode 100644 index 00000000..395d9de2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/socks5bytestream.h @@ -0,0 +1,136 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SOCKS5BYTESTREAM_H__ +#define SOCKS5BYTESTREAM_H__ + +#include "bytestream.h" +#include "gloox.h" +#include "socks5bytestreammanager.h" +#include "connectiondatahandler.h" + +#include + +namespace gloox +{ + + class SOCKS5BytestreamDataHandler; + class ConnectionBase; + class LogSink; + + /** + * @brief An implementation of a single SOCKS5 Bytestream (@xep{0065}). + * + * One instance of this class handles one bytestream. + * + * See SOCKS5BytestreamManager for a detailed description on how to implement + * SOCKS5 Bytestreams in your application. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SOCKS5Bytestream : public ConnectionDataHandler, public Bytestream + { + friend class SOCKS5BytestreamManager; + + public: + /** + * Virtual destructor. + */ + virtual ~SOCKS5Bytestream(); + + /** + * This function starts the connection process. That is, it attempts to connect + * to each of the available StreamHosts. Once a working StreamHosts is found, the + * SOCKS5BytestreamManager is notified and the function returns. + * @return @b True if a connection to a StreamHost could be established, @b false + * otherwise. + * @note If @b false is returned you should hand this SOCKS5Bytestream object + * to SOCKS5BytestreamManager::dispose() for deletion. + * @note Make sure you have a SOCKS5BytestreamDataHandler registered (using + * registerSOCKS5BytestreamDataHandler()) before calling this function. + */ + virtual bool connect(); + + /** + * Closes the bytestream. + */ + virtual void close(); + + /** + * Use this function to send a chunk of data over an open bytestream. There is + * no limit for the size of the chunk (other than your machine's memory). + * If the stream is not open or has been closed again + * (by the remote entity or locally), nothing is sent and @b false is returned. + * @param data The block of data to send. + * @return @b True if the data has been sent (no guarantee of receipt), @b false + * in case of an error. + */ + virtual bool send( const std::string& data ); + + /** + * Call this function repeatedly to receive data from the socket. You should even do this + * if you use the bytestream to merely @b send data. + * @param timeout The timeout to use for select in microseconds. Default of -1 means blocking. + * @return The state of the connection. + */ + virtual ConnectionError recv( int timeout = -1 ); + + /** + * Sets the connection to use. + * @param connection The connection. The bytestream will own the connection, any + * previously set connection gets deleted. + */ + void setConnectionImpl( ConnectionBase* connection ); + + /** + * This function returns the concrete connection implementation currently in use. + * @return The concrete connection implementation. + * @since 0.9.7 + */ + ConnectionBase* connectionImpl( ) { return m_connection; } + + /** + * Use this function to set the available StreamHosts. Usually you should not need to + * use this function directly. + */ + void setStreamHosts( const StreamHostList& hosts ) { m_hosts = hosts; } + + // reimplemented from ConnectionDataHandler + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleConnect( const ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + + private: + SOCKS5Bytestream( SOCKS5BytestreamManager* manager, ConnectionBase* connection, + LogSink& logInstance, const JID& initiator, const JID& target, + const std::string& sid ); + void activate(); + + SOCKS5BytestreamManager* m_manager; + ConnectionBase* m_connection; + ConnectionBase* m_socks5; + JID m_proxy; + bool m_connected; + + StreamHostList m_hosts; + + }; + +} + +#endif // SOCKS5BYTESTREAM_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.cpp b/smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.cpp new file mode 100644 index 00000000..8e3114aa --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.cpp @@ -0,0 +1,486 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "bytestreamhandler.h" +#include "socks5bytestreammanager.h" +#include "socks5bytestreamserver.h" +#include "socks5bytestream.h" +#include "clientbase.h" +#include "disco.h" +#include "error.h" +#include "connectionbase.h" +#include "sha.h" +#include "util.h" + +#include + +namespace gloox +{ + + // ---- SOCKS5BytestreamManager::Query ---- + static const char* s5bModeValues[] = + { + "tcp", "udp" + }; + + static inline const char* modeString( SOCKS5BytestreamManager::S5BMode mode ) + { + return s5bModeValues[mode]; + } + + SOCKS5BytestreamManager::Query::Query() + : StanzaExtension( ExtS5BQuery ), m_type( TypeInvalid ) + { + } + + SOCKS5BytestreamManager::Query::Query( const std::string& sid, S5BMode mode, + const StreamHostList& hosts ) + : StanzaExtension( ExtS5BQuery ), m_sid( sid ), m_mode( mode ), m_hosts( hosts ), m_type( TypeSH ) + { + } + + SOCKS5BytestreamManager::Query::Query( const JID& jid, const std::string& sid, bool activate ) + : StanzaExtension( ExtS5BQuery ), m_sid( sid ), m_jid( jid ), m_type( activate ? TypeA : TypeSHU ) + { + } + + SOCKS5BytestreamManager::Query::Query( const Tag* tag ) + : StanzaExtension( ExtS5BQuery ), m_type( TypeInvalid ) + { + if( !tag || tag->name() != "query" || tag->xmlns() != XMLNS_BYTESTREAMS + /*|| !tag->hasAttribute( "sid" )*/ ) + return; + + m_sid = tag->findAttribute( "sid" ); + m_mode = static_cast( util::deflookup( tag->findAttribute( "mode" ), s5bModeValues, S5BTCP ) ); + + const TagList& l = tag->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "streamhost" && (*it)->hasAttribute( "jid" ) + && (*it)->hasAttribute( "host" ) && (*it)->hasAttribute( "port" ) ) + { + m_type = TypeSH; + StreamHost sh; + sh.jid = (*it)->findAttribute( "jid" ); + sh.host = (*it)->findAttribute( "host" ); + sh.port = atoi( (*it)->findAttribute( "port" ).c_str() ); + m_hosts.push_back( sh ); + } + else if( (*it)->name() == "streamhost-used" ) + { + m_type = TypeSHU; + m_jid = (*it)->findAttribute( "jid" ); + } + else if( (*it)->name() == "activate" ) + { + m_type = TypeA; + m_jid = (*it)->cdata(); + } + } + } + + SOCKS5BytestreamManager::Query::~Query() + { + } + + const std::string& SOCKS5BytestreamManager::Query::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_BYTESTREAMS + "']"; + return filter; + } + + Tag* SOCKS5BytestreamManager::Query::tag() const + { + if( m_type == TypeInvalid /*|| m_sid.empty()*/ ) + return 0; + + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_BYTESTREAMS ); + t->addAttribute( "sid", m_sid ); + switch( m_type ) + { + case TypeSH: + { + t->addAttribute( "mode", util::deflookup( m_mode, s5bModeValues, "tcp" ) ); + StreamHostList::const_iterator it = m_hosts.begin(); + for( ; it != m_hosts.end(); ++it ) + { + Tag* s = new Tag( t, "streamhost" ); + s->addAttribute( "jid", (*it).jid.full() ); + s->addAttribute( "host", (*it).host ); + s->addAttribute( "port", (*it).port ); + } + break; + } + case TypeSHU: + { + Tag* s = new Tag( t, "streamhost-used" ); + s->addAttribute( "jid", m_jid.full() ); + break; + } + case TypeA: + { + Tag* c = new Tag( t, "activate" ); + c->setCData( m_jid.full() ); + break; + } + default: + break; + } + + return t; + } + // ---- ~SOCKS5BytestreamManager::Query ---- + + // ---- SOCKS5BytestreamManager ---- + SOCKS5BytestreamManager::SOCKS5BytestreamManager( ClientBase* parent, BytestreamHandler* s5bh ) + : m_parent( parent ), m_socks5BytestreamHandler( s5bh ), m_server( 0 ) + { + if( m_parent ) + { + m_parent->registerStanzaExtension( new Query() ); + m_parent->registerIqHandler( this, ExtS5BQuery ); + } + } + + SOCKS5BytestreamManager::~SOCKS5BytestreamManager() + { + if( m_parent ) + { + m_parent->removeIqHandler( this, ExtS5BQuery ); + m_parent->removeIDHandler( this ); + } + + util::clearMap( m_s5bMap ); + } + + void SOCKS5BytestreamManager::addStreamHost( const JID& jid, const std::string& host, int port ) + { + StreamHost sh; + sh.jid = jid; + sh.host = host; + sh.port = port; + m_hosts.push_back( sh ); + } + + bool SOCKS5BytestreamManager::requestSOCKS5Bytestream( const JID& to, S5BMode mode, + const std::string& sid, + const JID& from ) + { + if( !m_parent ) + { + m_parent->logInstance().warn( LogAreaClassS5BManager, + "No parent (ClientBase) set, cannot request bytestream." ); + return false; + } + + if( m_hosts.empty() ) + { + m_parent->logInstance().warn( LogAreaClassS5BManager, + "No stream hosts set, cannot request bytestream." ); + return false; + } + + const std::string& msid = sid.empty() ? m_parent->getID() : sid; + const std::string& id = m_parent->getID(); + IQ iq( IQ::Set, to, id ); + iq.addExtension( new Query( msid, mode, m_hosts ) ); + if( from ) + iq.setFrom( from ); + + if( m_server ) + { + SHA sha; + sha.feed( msid ); + if( from ) + sha.feed( from.full() ); + else + sha.feed( m_parent->jid().full() ); + sha.feed( to.full() ); + m_server->registerHash( sha.hex() ); + } + + AsyncS5BItem asi; + asi.sHosts = m_hosts; + asi.id = id; + asi.from = to; + asi.to = from ? from : m_parent->jid(); + asi.incoming = false; + m_asyncTrackMap[msid] = asi; + + m_trackMap[id] = msid; + m_parent->send( iq, this, S5BOpenStream ); + + return true; + } + + void SOCKS5BytestreamManager::acknowledgeStreamHost( bool success, const JID& jid, + const std::string& sid ) + { + AsyncTrackMap::const_iterator it = m_asyncTrackMap.find( sid ); + if( it == m_asyncTrackMap.end() || !m_parent ) + return; + + const AsyncS5BItem& item = (*it).second; + + IQ* iq = 0; + + if( item.incoming ) + { + iq = new IQ( IQ::Result, item.from.full(), item.id ); + if( item.to ) + iq->setFrom( item.to ); + + if( success ) + iq->addExtension( new Query( jid, sid, false ) ); + else + iq->addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorItemNotFound ) ); + + m_parent->send( *iq ); + } + else + { + if( success ) + { + const std::string& id = m_parent->getID(); + iq = new IQ( IQ::Set, jid.full(), id ); + iq->addExtension( new Query( item.from, sid, true ) ); + + m_trackMap[id] = sid; + m_parent->send( *iq, this, S5BActivateStream ); + } + } + + delete iq; + } + + bool SOCKS5BytestreamManager::handleIq( const IQ& iq ) + { + const Query* q = iq.findExtension( ExtS5BQuery ); + if( !q || !m_socks5BytestreamHandler + || m_trackMap.find( iq.id() ) != m_trackMap.end() ) + return false; + + switch( iq.subtype() ) + { + case IQ::Set: + { + const std::string& sid = q->sid(); +// FIXME What is haveStream() good for? + if( /*haveStream( iq.from() ) ||*/ sid.empty() || q->mode() == S5BUDP ) + { + rejectSOCKS5Bytestream( iq.from(), iq.id(), StanzaErrorNotAcceptable ); + return true; + } + AsyncS5BItem asi; + asi.sHosts = q->hosts(); + asi.id = iq.id(); + asi.from = iq.from(); + asi.to = iq.to(); + asi.incoming = true; + m_asyncTrackMap[sid] = asi; + m_socks5BytestreamHandler->handleIncomingBytestreamRequest( sid, iq.from() ); + break; + } + case IQ::Error: + m_socks5BytestreamHandler->handleBytestreamError( iq, EmptyString ); + break; + default: + break; + } + + return true; + } + + const StreamHost* SOCKS5BytestreamManager::findProxy( const JID& from, const std::string& hostjid, + const std::string& sid ) + { + AsyncTrackMap::const_iterator it = m_asyncTrackMap.find( sid ); + if( it == m_asyncTrackMap.end() ) + return 0; + + if( (*it).second.from == from ) + { + StreamHostList::const_iterator it2 = (*it).second.sHosts.begin(); + for( ; it2 != (*it).second.sHosts.end(); ++it2 ) + { + if( (*it2).jid == hostjid ) + { + return &(*it2); + } + } + } + + return 0; + } + + bool SOCKS5BytestreamManager::haveStream( const JID& from ) + { + S5BMap::const_iterator it = m_s5bMap.begin(); + for( ; it != m_s5bMap.end(); ++it ) + { + if( (*it).second && (*it).second->target() == from ) + return true; + } + return false; + } + + void SOCKS5BytestreamManager::acceptSOCKS5Bytestream( const std::string& sid ) + { + AsyncTrackMap::iterator it = m_asyncTrackMap.find( sid ); + if( it == m_asyncTrackMap.end() || !m_socks5BytestreamHandler ) + return; + + SOCKS5Bytestream* s5b = new SOCKS5Bytestream( this, m_parent->connectionImpl()->newInstance(), + m_parent->logInstance(), + (*it).second.from, (*it).second.to, sid ); + s5b->setStreamHosts( (*it).second.sHosts ); + m_s5bMap[sid] = s5b; + m_socks5BytestreamHandler->handleIncomingBytestream( s5b ); + } + + void SOCKS5BytestreamManager::rejectSOCKS5Bytestream( const std::string& sid, StanzaError reason ) + { + AsyncTrackMap::iterator it = m_asyncTrackMap.find( sid ); + if( it != m_asyncTrackMap.end() ) + { + rejectSOCKS5Bytestream( (*it).second.from, (*it).second.id, reason ); + m_asyncTrackMap.erase( it ); + } + } + + void SOCKS5BytestreamManager::rejectSOCKS5Bytestream( const JID& from, + const std::string& id, + StanzaError reason ) + { + IQ iq( IQ::Error, from, id ); + + switch( reason ) + { + case StanzaErrorForbidden: + case StanzaErrorNotAcceptable: + { + iq.addExtension( new Error( StanzaErrorTypeAuth, reason ) ); + break; + } + case StanzaErrorFeatureNotImplemented: + case StanzaErrorNotAllowed: + default: + { + iq.addExtension( new Error( StanzaErrorTypeCancel, reason ) ); + break; + } + } + + m_parent->send( iq ); + } + + void SOCKS5BytestreamManager::handleIqID( const IQ& iq, int context ) + { + StringMap::iterator it = m_trackMap.find( iq.id() ); + if( it == m_trackMap.end() ) + return; + + switch( context ) + { + case S5BOpenStream: + { + switch( iq.subtype() ) + { + case IQ::Result: + { + const Query* q = iq.findExtension( ExtS5BQuery ); + if( q && m_socks5BytestreamHandler ) + { + const std::string& proxy = q->jid().full(); + const StreamHost* sh = findProxy( iq.from(), proxy, (*it).second ); + if( sh ) + { + SOCKS5Bytestream* s5b = 0; + bool selfProxy = ( proxy == m_parent->jid().full() && m_server ); + if( selfProxy ) + { + SHA sha; + sha.feed( (*it).second ); + sha.feed( iq.to().full() ); + sha.feed( iq.from().full() ); + s5b = new SOCKS5Bytestream( this, m_server->getConnection( sha.hex() ), + m_parent->logInstance(), + iq.to(), iq.from(), + (*it).second ); + } + else + { + s5b = new SOCKS5Bytestream( this, m_parent->connectionImpl()->newInstance(), + m_parent->logInstance(), + iq.to(), iq.from(), + (*it).second ); + s5b->setStreamHosts( StreamHostList( 1, *sh ) ); + } + m_s5bMap[(*it).second] = s5b; + m_socks5BytestreamHandler->handleOutgoingBytestream( s5b ); + if( selfProxy ) + s5b->activate(); + } + } + break; + } + case IQ::Error: + m_socks5BytestreamHandler->handleBytestreamError( iq, (*it).second ); + break; + default: + break; + } + break; + } + case S5BActivateStream: + { + switch( iq.subtype() ) + { + case IQ::Result: + { + S5BMap::const_iterator it5 = m_s5bMap.find( (*it).second ); + if( it5 != m_s5bMap.end() ) + (*it5).second->activate(); + break; + } + case IQ::Error: + m_socks5BytestreamHandler->handleBytestreamError( iq, (*it).second ); + break; + default: + break; + } + break; + } + default: + break; + } + m_trackMap.erase( it ); + } + + bool SOCKS5BytestreamManager::dispose( SOCKS5Bytestream* s5b ) + { + S5BMap::iterator it = m_s5bMap.find( s5b->sid() ); + if( it != m_s5bMap.end() ) + { + delete s5b; + m_s5bMap.erase( it ); + return true; + } + + return false; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.h b/smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.h new file mode 100644 index 00000000..eaee0666 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/socks5bytestreammanager.h @@ -0,0 +1,307 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SOCKS5BYTESTREAMMANAGER_H__ +#define SOCKS5BYTESTREAMMANAGER_H__ + +#include "iqhandler.h" +#include "jid.h" +#include "stanzaextension.h" + +namespace gloox +{ + + class BytestreamHandler; + class SOCKS5BytestreamServer; + class SOCKS5Bytestream; + class ClientBase; + + /** + * Describes a single StreamHost. + */ + struct StreamHost + { + JID jid; /**< The StreamHost's JID. */ + std::string host; /**< The StreamHost's IP or host name. */ + int port; /**< The StreamHost's port. */ +// std::string zeroconf; /**< A zeroconf identifier. */ + }; + + /** + * A list of StreamHosts. + */ + typedef std::list StreamHostList; + + /** + * @brief An SOCKS5BytestreamManager dispatches SOCKS5 Bytestreams. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SOCKS5BytestreamManager : public IqHandler + { + + friend class SOCKS5Bytestream; + + public: + + /** + * Supported transport layer protocols. + */ + enum S5BMode + { + S5BTCP, /**< Use TCP on the transport layer. */ + S5BUDP, /**< Use UDP on the transport layer. Not currently supported. */ + S5BInvalid /**< Invalid mode. */ + }; + + /** + * Constructs a new SOCKS5BytestreamManager. + * @param parent The ClientBase to use for sending data. + * @param s5bh A SOCKS5BytestreamManager -derived object that will receive + * incoming and outgoing SOCKS5Bytestreams. + */ + SOCKS5BytestreamManager( ClientBase* parent, BytestreamHandler* s5bh ); + + /** + * Virtual destructor. + */ + virtual ~SOCKS5BytestreamManager(); + + /** + * Sets a list of StreamHosts that will be used for subsequent bytestream requests. + * @note At least one StreamHost is required. + * @param hosts A list of StreamHosts. + */ + void setStreamHosts( StreamHostList hosts ) { m_hosts = hosts; } + + /** + * Adds one StreamHost to the list of StreamHosts. + * @param jid The StreamHost's JID. + * @param host The StreamHost's hostname. + * @param port The StreamHost's port. + */ + void addStreamHost( const JID& jid, const std::string& host, int port ); + + /** + * This function requests a bytestream with the remote entity. + * Data can only be sent over an open stream. Use isOpen() to find out what the stream's + * current state is. However, successful opening/initiation will be announced by means of the + * BytestreamHandler interface. Multiple bytestreams (even per JID) can be initiated + * without waiting for success. + * @param to The recipient of the requested bytestream. + * @param mode The desired transport layer protocol. + * @param sid The bytestream's stream ID, if previously negotiated e.g. using SI (@xep{0095}). + * @param from An optional 'from' address to stamp outgoing + * requests with. Only useful in component scenarios. Defaults to empty JID. + * @return @b False in case of an error, @b true otherwise. A return value of @b true does + * @b not indicate that the bytestream has been opened. This is announced by means of the + * BytestreamHandler. + */ + bool requestSOCKS5Bytestream( const JID& to, S5BMode mode, const std::string& sid = EmptyString, + const JID& from = JID() ); + + /** + * To get rid of a bytestream (i.e., close and delete it), call this function. You + * should then not use the bytestream any more. + * The remote entity will be notified of the closing of the stream. + * @param s5b The bytestream to dispose. It will be deleted here. + */ + bool dispose( SOCKS5Bytestream* s5b ); + + /** + * Use this function to accept an incoming bytestream. + * @param sid The stream's id as passed to BytestreamHandler::handleIncomingSOCKS5Bytestream(). + */ + void acceptSOCKS5Bytestream( const std::string& sid ); + + /** + * Use this function to reject an incoming bytestream. + * @param sid The stream's id as passed to BytestreamHandler::handleIncomingSOCKS5Bytestream(). + * @param reason The reason for the reject. + */ + void rejectSOCKS5Bytestream( const std::string& sid, StanzaError reason = StanzaErrorNotAcceptable ); + + /** + * Use this function to register an object that will receive new @b incoming bytestream + * requests from the SOCKS5BytestreamManager. Only one BytestreamHandler can be + * registered at any one time. + * @param s5bh The BytestreamHandler derived object to receive notifications. + */ + void registerBytestreamHandler( BytestreamHandler* s5bh ) + { m_socks5BytestreamHandler = s5bh; } + + /** + * Removes the registered BytestreamHandler. + */ + void removeBytestreamHandler() + { m_socks5BytestreamHandler = 0; } + + /** + * Tells the SOCKS5BytestreamManager which SOCKS5BytestreamServer handles peer-2-peer SOCKS5 + * bytestreams. + * @param server The SOCKS5BytestreamServer to use. + */ + void registerSOCKS5BytestreamServer( SOCKS5BytestreamServer* server ) { m_server = server; } + + /** + * Un-registers any local SOCKS5BytestreamServer. + */ + void removeSOCKS5BytestreamServer() { m_server = 0; } + + // reimplemented from IqHandler. + virtual bool handleIq( const IQ& iq ); + + // reimplemented from IqHandler. + virtual void handleIqID( const IQ& iq, int context ); + + private: +#ifdef SOCKS5BYTESTREAMMANAGER_TEST + public: +#endif + + class Query : public StanzaExtension + { + public: + /** + * Constructs a new empty Query object. + */ + Query(); + + /** + * Constructs a new Query (streamhost) object from the given parameters. + * @param sid The stream ID. + * @param mode The stream mode (TCP or UDP). + * @param hosts A list of stream hosts. + */ + Query( const std::string& sid, S5BMode mode, + const StreamHostList& hosts ); + + /** + * Constructs a new Query (streamhost-used or activate) object, including the given JID. + * @param jid The JID. + * @param sid The stream ID. + * @param activate Determines whether the object will be an 'activate' (@b true) or + * 'streamhost-used' (@b false) one. + */ + Query( const JID& jid, const std::string& sid, bool activate ); + + /** + * Constructs a new Query object from the given Tag. + * @param tag The Tag to parse. + */ + Query( const Tag* tag ); + + /** + * Virtual destructor. + */ + virtual ~Query(); + + /** + * Returns the current stream ID. + * @return The current stream ID. + */ + const std::string& sid() const { return m_sid; } + + /** + * Returns the current JID. + * @return The current JID. + */ + const JID& jid() const { return m_jid; } + + /** + * Returns the current mode. + * @return The current mode. + */ + S5BMode mode() const { return m_mode; } + + /** + * Returns the current list of stream hosts. + * @return The current list of stream hosts. + */ + const StreamHostList& hosts() const { return m_hosts; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new Query( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new Query( *this ); + } + + private: + enum QueryType + { + TypeSH, + TypeSHU, + TypeA, + TypeInvalid + }; + + std::string m_sid; + JID m_jid; + SOCKS5BytestreamManager::S5BMode m_mode; + StreamHostList m_hosts; + QueryType m_type; + + }; + + SOCKS5BytestreamManager& operator=( const SOCKS5BytestreamManager&); + void rejectSOCKS5Bytestream( const JID& from, const std::string& id, StanzaError reason = StanzaErrorNotAcceptable ); + bool haveStream( const JID& from ); + const StreamHost* findProxy( const JID& from, const std::string& hostjid, const std::string& sid ); + + void acknowledgeStreamHost( bool success, const JID& jid, const std::string& sid ); + + enum IBBActionType + { + S5BOpenStream, + S5BCloseStream, + S5BActivateStream + }; + + typedef std::map S5BMap; + S5BMap m_s5bMap; + + struct AsyncS5BItem + { + JID from; + JID to; + std::string id; + StreamHostList sHosts; + bool incoming; + }; + typedef std::map AsyncTrackMap; + AsyncTrackMap m_asyncTrackMap; + + ClientBase* m_parent; + BytestreamHandler* m_socks5BytestreamHandler; + SOCKS5BytestreamServer* m_server; + StreamHostList m_hosts; + StringMap m_trackMap; + + }; + +} + +#endif // SOCKS5BYTESTREAMMANAGER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.cpp b/smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.cpp new file mode 100644 index 00000000..de54a28b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.cpp @@ -0,0 +1,246 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "socks5bytestreamserver.h" +#include "mutexguard.h" +#include "util.h" + +namespace gloox +{ + + SOCKS5BytestreamServer::SOCKS5BytestreamServer( const LogSink& logInstance, int port, + const std::string& ip ) + : m_tcpServer( 0 ), m_logInstance( logInstance ), m_ip( ip ), m_port( port ) + { + m_tcpServer = new ConnectionTCPServer( this, m_logInstance, m_ip, m_port ); + } + + SOCKS5BytestreamServer::~SOCKS5BytestreamServer() + { + if( m_tcpServer ) + delete m_tcpServer; + m_tcpServer = 0; + + m_mutex.lock(); + ConnectionMap::const_iterator it = m_connections.begin(); + for( ; it != m_connections.end(); ++it ) + delete (*it).first; + m_connections.clear(); + util::clearList( m_oldConnections ); + m_mutex.unlock(); + } + + ConnectionError SOCKS5BytestreamServer::listen() + { + if( m_tcpServer ) + return m_tcpServer->connect(); + + return ConnNotConnected; + } + + ConnectionError SOCKS5BytestreamServer::recv( int timeout ) + { + if( !m_tcpServer ) + return ConnNotConnected; + + ConnectionError ce = m_tcpServer->recv( timeout ); + if( ce != ConnNoError ) + return ce; + + // First take a snapshot of our connections, and then iterate the snapshot + // (so that the live map can be modified by an erase while we + // iterate the snapshot of the map) + ConnectionMap connectionsSnapshot; + + m_mutex.lock(); + connectionsSnapshot.insert( m_connections.begin(), m_connections.end() ); + m_mutex.unlock(); + + ConnectionMap::const_iterator it = connectionsSnapshot.begin(); + for( ; it != connectionsSnapshot.end(); ++it ) + { + (*it).first->recv( timeout ); + } + connectionsSnapshot.clear(); + + m_mutex.lock(); + util::clearList( m_oldConnections ); + m_mutex.unlock(); + + return ConnNoError; + } + + void SOCKS5BytestreamServer::stop() + { + if( m_tcpServer ) + { + m_tcpServer->disconnect(); + m_tcpServer->cleanup(); + } + } + + int SOCKS5BytestreamServer::localPort() const + { + if( m_tcpServer ) + return m_tcpServer->localPort(); + + return m_port; + } + + const std::string SOCKS5BytestreamServer::localInterface() const + { + if( m_tcpServer ) + return m_tcpServer->localInterface(); + + return m_ip; + } + + ConnectionBase* SOCKS5BytestreamServer::getConnection( const std::string& hash ) + { + util::MutexGuard mg( m_mutex ); + + ConnectionMap::iterator it = m_connections.begin(); + for( ; it != m_connections.end(); ++it ) + { + if( (*it).second.hash == hash ) + { + ConnectionBase* conn = (*it).first; + conn->registerConnectionDataHandler( 0 ); + m_connections.erase( it ); + return conn; + } + } + + return 0; + } + + void SOCKS5BytestreamServer::registerHash( const std::string& hash ) + { + util::MutexGuard mg( m_mutex ); + m_hashes.push_back( hash ); + } + + void SOCKS5BytestreamServer::removeHash( const std::string& hash ) + { + util::MutexGuard mg( m_mutex ); + m_hashes.remove( hash ); + } + + void SOCKS5BytestreamServer::handleIncomingConnection( ConnectionBase* /*server*/, ConnectionBase* connection ) + { + connection->registerConnectionDataHandler( this ); + ConnectionInfo ci; + ci.state = StateUnnegotiated; + + m_mutex.lock(); + m_connections[connection] = ci; + m_mutex.unlock(); + } + + void SOCKS5BytestreamServer::handleReceivedData( const ConnectionBase* connection, + const std::string& data ) + { + m_mutex.lock(); + ConnectionMap::iterator it = m_connections.find( const_cast( connection ) ); + if( it == m_connections.end() ) + { + m_mutex.unlock(); + return; + } + m_mutex.unlock(); + + switch( (*it).second.state ) + { + case StateDisconnected: + (*it).first->disconnect(); + break; + case StateUnnegotiated: + { + char c[2]; + c[0] = 0x05; + c[1] = (char)(unsigned char)0xFF; + (*it).second.state = StateDisconnected; + + if( data.length() >= 3 && data[0] == 0x05 ) + { + unsigned int sz = ( data.length() - 2 < static_cast( data[1] ) ) + ? static_cast( data.length() - 2 ) + : static_cast( data[1] ); + for( unsigned int i = 2; i < sz + 2; ++i ) + { + if( data[i] == 0x00 ) + { + c[1] = 0x00; + (*it).second.state = StateAuthAccepted; + break; + } + } + } + (*it).first->send( std::string( c, 2 ) ); + break; + } + case StateAuthmethodAccepted: + // place to implement any future auth support + break; + case StateAuthAccepted: + { + std::string reply = data; + if( reply.length() < 2 ) + reply.resize( 2 ); + + reply[0] = 0x05; + reply[1] = 0x01; // general SOCKS server failure + (*it).second.state = StateDisconnected; + + if( data.length() == 47 && data[0] == 0x05 && data[1] == 0x01 && data[2] == 0x00 + && data[3] == 0x03 && data[4] == 0x28 && data[45] == 0x00 && data[46] == 0x00 ) + { + const std::string hash = data.substr( 5, 40 ); + + m_mutex.lock(); + HashMap::const_iterator ith = m_hashes.begin(); + for( ; ith != m_hashes.end() && (*ith) != hash; ++ith ) + ; + + if( ith != m_hashes.end() ) + { + reply[1] = 0x00; + (*it).second.hash = hash; + (*it).second.state = StateDestinationAccepted; + } + m_mutex.unlock(); + } + (*it).first->send( reply ); + break; + } + case StateDestinationAccepted: + case StateActive: + // should not happen + break; + } + } + + void SOCKS5BytestreamServer::handleConnect( const ConnectionBase* /*connection*/ ) + { + // should never happen, TCP connection is already established + } + + void SOCKS5BytestreamServer::handleDisconnect( const ConnectionBase* connection, + ConnectionError /*reason*/ ) + { + util::MutexGuard mg( m_mutex ); + m_connections.erase( const_cast( connection ) ); + m_oldConnections.push_back( connection ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.h b/smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.h new file mode 100644 index 00000000..b4dcd50c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/socks5bytestreamserver.h @@ -0,0 +1,149 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SOCKS5BYTESTREAMSERVER_H__ +#define SOCKS5BYTESTREAMSERVER_H__ + +#include "macros.h" +#include "connectionhandler.h" +#include "connectiontcpserver.h" +#include "logsink.h" +#include "mutex.h" + +namespace gloox +{ + + /** + * @brief A server listening for SOCKS5 bytestreams. + * + * @note You can use a single SOCKS5BytestreamServer instance with multiple Client objects. + * + * @note It is safe to put a SOCKS5BytestreamServer instance into a separate thread. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API SOCKS5BytestreamServer : public ConnectionHandler, public ConnectionDataHandler + { + + friend class SOCKS5BytestreamManager; + + public: + /** + * Constructs a new SOCKS5BytestreamServer. + * @param logInstance A LogSink to use. + * @param port The local port to listen on. + * @param ip The local IP to bind to. If empty, the server will listen on all local interfaces. + */ + SOCKS5BytestreamServer( const LogSink& logInstance, int port, const std::string& ip = EmptyString ); + + /** + * Destructor. + */ + ~SOCKS5BytestreamServer(); + + /** + * Starts listening on the specified interface and port. + * @return Returns @c ConnNoError on success, @c ConnIoError on failure (e.g. if the port + * is already in use). + */ + ConnectionError listen(); + + /** + * Call this function repeatedly to check for incoming connections and to negotiate + * them. + * @param timeout The timeout to use for select in microseconds. + * @return The state of the listening socket. + */ + ConnectionError recv( int timeout ); + + /** + * Stops listening and unbinds from the interface and port. + */ + void stop(); + + /** + * Expose our TCP Connection localPort + * Returns the local port. + * @return The local port. + */ + int localPort() const; + + /** + * Expose our TCP Connection localInterface + * Returns the locally bound IP address. + * @return The locally bound IP address. + */ + const std::string localInterface() const; + + /** + * Exposes the local socket. + * @return The local socket. + */ + int serverSocket() const { return m_tcpServer->socket(); } + + // reimplemented from ConnectionHandler + virtual void handleIncomingConnection( ConnectionBase* server, ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + + // reimplemented from ConnectionDataHandler + virtual void handleConnect( const ConnectionBase* connection ); + + // reimplemented from ConnectionDataHandler + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + + private: + SOCKS5BytestreamServer& operator=( const SOCKS5BytestreamServer& ); + void registerHash( const std::string& hash ); + void removeHash( const std::string& hash ); + ConnectionBase* getConnection( const std::string& hash ); + + enum NegotiationState + { + StateDisconnected, + StateUnnegotiated, + StateAuthmethodAccepted, + StateAuthAccepted, + StateDestinationAccepted, + StateActive + }; + + struct ConnectionInfo + { + NegotiationState state; + std::string hash; + }; + + typedef std::map ConnectionMap; + ConnectionMap m_connections; + + typedef std::list ConnectionList; + ConnectionList m_oldConnections; + + typedef std::list HashMap; + HashMap m_hashes; + + ConnectionTCPServer* m_tcpServer; + + util::Mutex m_mutex; + const LogSink& m_logInstance; + std::string m_ip; + int m_port; + + }; + +} + +#endif // SOCKS5BYTESTREAMSERVER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/softwareversion.cpp b/smack/smack/src/main/cpp/gloox/src/softwareversion.cpp new file mode 100644 index 00000000..f7ae5db4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/softwareversion.cpp @@ -0,0 +1,74 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#include "softwareversion.h" +#include "tag.h" + +namespace gloox +{ + + SoftwareVersion::SoftwareVersion( const std::string& name, + const std::string& version, + const std::string& os ) + : StanzaExtension( ExtVersion ), m_name( name ), m_version( version ), m_os( os ) + { + } + + SoftwareVersion::SoftwareVersion( const Tag* tag ) + : StanzaExtension( ExtVersion ) + { + if( !tag ) + return; + + Tag* t = tag->findChild( "name" ); + if( t ) + m_name = t->cdata(); + + t = tag->findChild( "version" ); + if( t ) + m_version = t->cdata(); + + t = tag->findChild( "os" ); + if( t ) + m_os = t->cdata(); + } + + SoftwareVersion::~SoftwareVersion() + { + } + + const std::string& SoftwareVersion::filterString() const + { + static const std::string filter = "/iq/query[@xmlns='" + XMLNS_VERSION + "']"; + return filter; + } + + Tag* SoftwareVersion::tag() const + { + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_VERSION ); + + if( !m_name.empty() ) + new Tag( t, "name", m_name ); + + if( !m_version.empty() ) + new Tag( t, "version", m_version ); + + if( !m_os.empty() ) + new Tag( t, "os", m_os ); + + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/softwareversion.h b/smack/smack/src/main/cpp/gloox/src/softwareversion.h new file mode 100644 index 00000000..a83f121a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/softwareversion.h @@ -0,0 +1,101 @@ +/* + Copyright (c) 2008-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + + +#ifndef SOFTWAREVERSION_H__ +#define SOFTWAREVERSION_H__ + + +#include "stanzaextension.h" + +#include + +namespace gloox +{ + + class Tag; + + /** + * @brief This is an implementation of @xep{0092} as a StanzaExtension. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API SoftwareVersion : public StanzaExtension + { + + public: + /** + * Constructs a new object with the given resource string. + * @param name The software's name. + * @param version The software's version. + * @param os The software's operating system. + */ + SoftwareVersion( const std::string& name, const std::string& version, const std::string& os ); + + /** + * Constructs a new object from the given Tag. + * @param tag The Tag to parse. + */ + SoftwareVersion( const Tag* tag = 0 ); + + /** + * Virtual Destructor. + */ + virtual ~SoftwareVersion(); + + /** + * Returns the application's name. + * @return The application's name. + */ + const std::string& name() const { return m_name; } + + /** + * Returns the application's version. + * @return The application's version. + */ + const std::string& version() const { return m_version; } + + /** + * Returns the application's Operating System. + * @return The application's OS. + */ + const std::string& os() const { return m_os; } + + // reimplemented from StanzaExtension + virtual const std::string& filterString() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* newInstance( const Tag* tag ) const + { + return new SoftwareVersion( tag ); + } + + // reimplemented from StanzaExtension + virtual Tag* tag() const; + + // reimplemented from StanzaExtension + virtual StanzaExtension* clone() const + { + return new SoftwareVersion( *this ); + } + + private: + std::string m_name; + std::string m_version; + std::string m_os; + }; + +} + +#endif// SOFTWAREVERSION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/stanza.cpp b/smack/smack/src/main/cpp/gloox/src/stanza.cpp new file mode 100644 index 00000000..e4c0d38b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/stanza.cpp @@ -0,0 +1,141 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "stanza.h" +#include "error.h" +#include "jid.h" +#include "util.h" +#include "stanzaextension.h" +#include "stanzaextensionfactory.h" + +#include + +namespace gloox +{ + + Stanza::Stanza( const JID& to ) + : m_xmllang( "default" ), m_to( to ), m_hasEmbeddedStanza( false ) + { + } + + Stanza::Stanza( Tag* tag ) + : m_xmllang( "default" ), m_hasEmbeddedStanza( false ) + { + if( !tag ) + return; + + m_from.setJID( tag->findAttribute( "from" ) ); + m_to.setJID( tag->findAttribute( "to" ) ); + m_id = tag->findAttribute( "id" ); + } + + Stanza::~Stanza() + { + removeExtensions(); + } + + const Error* Stanza::error() const + { + return findExtension( ExtError ); + } + + void Stanza::addExtension( const StanzaExtension* se ) + { + m_extensionList.push_back( se ); + } + + const StanzaExtension* Stanza::findExtension( int type ) const + { + StanzaExtensionList::const_iterator it = m_extensionList.begin(); + for( ; it != m_extensionList.end() && (*it)->extensionType() != type; ++it ) ; + return it != m_extensionList.end() ? (*it) : 0; + } + + void Stanza::removeExtensions() + { + util::clearList( m_extensionList ); + } + + Stanza* Stanza::embeddedStanza() const + { + StanzaExtensionList::const_iterator it = m_extensionList.begin(); + for( ; it != m_extensionList.end() && !(*it)->embeddedStanza(); ++it ) ; + return it != m_extensionList.end() ? (*it)->embeddedStanza() : 0; + } + + Tag* Stanza::embeddedTag() const + { + StanzaExtensionList::const_iterator it = m_extensionList.begin(); + for( ; it != m_extensionList.end() && !(*it)->embeddedTag(); ++it ) ; + return it != m_extensionList.end() ? (*it)->embeddedTag() : 0; + } + + void Stanza::setLang( StringMap** map, + std::string& defaultLang, + const Tag* tag ) + { + const std::string& lang = tag ? tag->findAttribute( "xml:lang" ) : EmptyString; + setLang( map, defaultLang, tag ? tag->cdata() : EmptyString, lang ); + } + + void Stanza::setLang( StringMap** map, + std::string& defaultLang, + const std::string& data, + const std::string& xmllang ) + { + if( data.empty() ) + return; + + if( xmllang.empty() ) + defaultLang = data; + else + { + if( !*map ) + *map = new StringMap(); + (**map)[xmllang] = data; + } + } + + const std::string& Stanza::findLang( const StringMap* map, + const std::string& defaultData, + const std::string& lang ) + { + if( map && lang != "default" ) + { + StringMap::const_iterator it = map->find( lang ); + if( it != map->end() ) + return (*it).second; + } + return defaultData; + } + + void Stanza::getLangs( const StringMap* map, + const std::string& defaultData, + const std::string& name, + Tag* tag ) + { + if( !defaultData.empty() ) + new Tag( tag, name, defaultData ); + + if( !map ) + return; + + StringMap::const_iterator it = map->begin(); + for( ; it != map->end(); ++it ) + { + Tag* t = new Tag( tag, name, "xml:lang", (*it).first ); + t->setCData( (*it).second ); + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/stanza.h b/smack/smack/src/main/cpp/gloox/src/stanza.h new file mode 100644 index 00000000..ec60713e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/stanza.h @@ -0,0 +1,215 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef STANZA_H__ +#define STANZA_H__ + +#include "gloox.h" +#include "tag.h" +#include "jid.h" +#include "stanzaextension.h" + +namespace gloox +{ + + class Error; + + /** + * @brief This is the base class for XMPP stanza abstractions. + * + * @author Jakob Schröter + * @since 0.4 + */ + class GLOOX_API Stanza + { + public: + /** + * Virtual destructor. + */ + virtual ~Stanza(); + + /** + * Sets the 'from' address of the Stanza. This useful for @link gloox::Component Components @endlink. + * @param from The from address. + */ + void setFrom( const JID& from ) { m_from = from; } + + /** + * Returns the JID the stanza comes from. + * @return The origin of the stanza. + */ + const JID& from() const { return m_from; } + + /** + * Returns the receiver of the stanza. + * @return The stanza's destination. + */ + const JID& to() const { return m_to; } + + /** + * Returns the id of the stanza, if set. + * @return The ID of the stanza. + */ + const std::string& id() const { return m_id; } + + /** + * A convenience function that returns the stanza error condition, if any. + * @return The stanza error condition, may be 0. + */ + const Error* error() const; + + /** + * Retrieves the value of the xml:lang attribute of this stanza. + * Default is 'en'. + * @return The stanza's default language. + */ + const std::string& xmlLang() const { return m_xmllang; } + + /** + * Use this function to add a StanzaExtension to this Stanza. + * @param se The StanzaExtension to add. + * @note The Stanza will become the owner of the StanzaExtension and + * will take care of deletion. + * @since 0.9 + */ + void addExtension( const StanzaExtension* se ); + + /** + * Finds a StanzaExtension of a particular type. + * @param type StanzaExtensionType to search for. + * @return A pointer to the StanzaExtension, or 0 if none was found. + */ + const StanzaExtension* findExtension( int type ) const; + + /** + * Finds a StanzaExtension of a particular type. + * Example: + * @code + * const MyExtension* c = presence.findExtension( ExtMyExt ); + * @endcode + * @param type The extension type to look for. + * @return The static_cast' type, or 0 if none was found. + */ + template< class T > + inline const T* findExtension( int type ) const + { + return static_cast( findExtension( type ) ); + } + + /** + * Returns the list of the Stanza's extensions. + * @return The list of the Stanza's extensions. + */ + const StanzaExtensionList& extensions() const { return m_extensionList; } + + /** + * Removes (deletes) all the stanza's extensions. + */ + void removeExtensions(); + + /** + * This function is used by StanzaExtensionFactory to signal ClientBase + * that this Stanza instance contains an embedded Stanza that needs to be + * checked for further StanzaExtensions. + * You should not need to use this function directly. + */ + void setEmbeddedStanza() { m_hasEmbeddedStanza = true; } + + /** + * This function indicates whether this Stanza instance contains an embedded + * Stanza that needs to be checked for further StanzaExtensions. + * You should not need to use this function directly. + * @return Whether this Stanza instance contains an embedded + * Stanza. + */ + bool hasEmbeddedStanza() const { return m_hasEmbeddedStanza; } + + /** + * This function returns the embedded Stanza. It is only needed by + * ClientBase/StanzaExtensionFactory. + * If hasEmbeddedStanza() is true, this function checks every + * embedded StanzaExtension for an embedded Stanza and returns the first it finds. + * You should not need to use this function directly. + * @return The embedded Stanza. May be 0. + */ + Stanza* embeddedStanza() const; + + /** + * This function returns the embedded Tag that the embedded Stanza is based on. + * It is only needed by ClientBase/StanzaExtensionFactory. + * If hasEmbeddedStanza() is true, this function checks every + * embedded StanzaExtension for an embedded Tag and returns the first it finds. + * You should not need to use this function directly. + * + * @return The embedded Tag. May be 0. + */ + Tag* embeddedTag() const; + + /** + * Creates a Tag representation of the Stanza. The Tag is completely + * independent of the Stanza and will not be updated when the Stanza + * is modified. + * @return A pointer to a Tag representation. It is the job of the + * + * caller to delete the Tag. + */ + virtual Tag* tag() const = 0; + + protected: + /** + * Creates a new Stanza, taking from and to addresses from the given Tag. + * @param tag The Tag to create the Stanza from. + * @since 1.0 + */ + Stanza( Tag* tag ); + + /** + * Creates a new Stanza object and initializes the receiver's JID. + * @param to The receipient of the Stanza. + * @since 1.0 + */ + Stanza( const JID& to ); + + StanzaExtensionList m_extensionList; + std::string m_id; + std::string m_xmllang; + JID m_from; + JID m_to; + + static const std::string& findLang( const StringMap* map, + const std::string& defaultData, + const std::string& lang ); + + static void setLang( StringMap** map, + std::string& defaultLang, + const Tag* tag ); + + static void setLang( StringMap** map, + std::string& defaultLang, + const std::string& data, + const std::string& xmllang ); + + static void getLangs( const StringMap* map, + const std::string& defaultData, + const std::string& name, Tag* tag ); + + private: + Stanza( const Stanza& ); + + bool m_hasEmbeddedStanza; + + }; + +} + +#endif // STANZA_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/stanzaextension.h b/smack/smack/src/main/cpp/gloox/src/stanzaextension.h new file mode 100644 index 00000000..ebdf72ef --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/stanzaextension.h @@ -0,0 +1,262 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef STANZAEXTENSION_H__ +#define STANZAEXTENSION_H__ + +#include "macros.h" + +#include + +namespace gloox +{ + + class Tag; + class Stanza; + + /** + * Supported Stanza extension types. + */ + enum StanzaExtensionType + { + ExtNone, /**< Invalid StanzaExtension. */ + ExtVCardUpdate, /**< Extension in the vcard-temp:x:update namespace, + * advertising a user avatar's SHA1 hash (@xep{0153}). */ + ExtOOB, /**< An extension in the jabber:iq:oob or jabber:x:oob + * namespaces (@xep{0066}). */ + ExtGPGSigned, /**< An extension containing a GPG/PGP signature + * (@xep{0027}). */ + ExtGPGEncrypted, /**< An extension containing a GPG/PGP encrypted message + * (@xep{0027}). */ + ExtReceipt, /**< An extension containing a Message Receipt/Request + * (@xep{0184}). */ + ExtDelay, /**< An extension containing notice of delayed delivery + * (@xep{0203} & @xep{0091}). */ + ExtAMP, /**< An extension containing advanced message processing + * rules (@xep{0079}). */ + ExtError, /**< An extension containing an error. */ + ExtCaps, /**< An extension containing Entity Capabilities + * (@xep{0115}). */ + ExtChatState, /**< An extension containing a chat state (@xep{0085}). */ + ExtMessageEvent, /**< An extension containing a message event (@xep{0022}). */ + ExtDataForm, /**< An extension containing a Data Form (@xep{0004}). */ + ExtNickname, /**< An extension containing a User Nickname (@xep{0172}). */ + ExtResourceBind, /**< A resource bind SE (RFC3921). */ + ExtSessionCreation, /**< A session establishing SE (RFC3921). */ + ExtVersion, /**< An extension containing a Version request/reply + * (@xep{0092}). */ + ExtXHtmlIM, /**< An extension containing an XHTML message + * representation (@xep{0071}) */ + ExtDiscoInfo, /**< An extension containing a disco#info element (@xep{0030}). */ + ExtDiscoItems, /**< An extension containing a disco#items element (@xep{0030}). */ + ExtAdhocCommand, /**< An extension containing a Adhoc Command (@xep{0050}). */ + ExtPrivateXML, /**< An extension used for Private XML Storage (@xep{0048}). */ + ExtRoster, /**< An extension dealing with the user's roster (RFC-3921). */ + ExtFeatureNeg, /**< An extension abstracting a Feature Negotiation element + * (@xep{0020}). */ + ExtIBB, /**< An extension dealing with IBBs (@xep{0047}). */ + ExtNonSaslAuth, /**< An extension for doing Non-SASL Authentication (@xep{0078}). */ + ExtMUC, /**< An extension dealing with the muc namespace of @xep{0045}. */ + ExtMUCOwner, /**< An extension dealing with the muc#owner namespace of @xep{0045}. */ + ExtMUCAdmin, /**< An extension dealing with the muc#admin namespace of @xep{0045}. */ + ExtMUCUser, /**< An extension dealing with the muc#user namespace of @xep{0045}. */ + ExtMUCUnique, /**< An extension dealing with the muc#unique namespace of @xep{0045}. */ + ExtPing, /**< An XMPP Ping (@xep{0199}). */ + ExtSearch, /**< A @xep{0055} (Jabber Search) wrapper. */ + ExtRegistration, /**< A @xep{0077} (In-Band Registration) wrapper. */ + ExtJingle, /**< An extension dealing with Jingle (@xep{0166}) */ + ExtVCard, /**< An extension dealing with vcard-temp (@xep{0054}) */ + ExtPrivacy, /**< An extension dealing with Privacy Lists (@xep{0016}) */ + ExtLastActivity, /**< An extension dealing with Last Activity (@xep{0012}). */ + ExtFlexOffline, /**< An extension dealing with Flexible Offline Messages (@xep{0013}). */ + ExtSI, /**< An extension dealing with Stream Initiation (@xep{0095}). */ + ExtS5BQuery, /**< An extension dealing with stream host offers (@xep{0065}) */ + ExtPubSub, /**< An extension dealing with PubSub requests (@xep{0060}). */ + ExtPubSubOwner, /**< An extension dealing with PubSub owner requests (@xep{0060}). */ + ExtPubSubEvent, /**< An extension for PubSub event notifications + * (@xep{0060}) */ + ExtSHIM, /**< An extension dealing with Stanza Headers and Internet Metadata (@xep{0131}). */ + ExtAttention, /**< An extension dealing with Attention (@xep{0224}). */ + ExtForward, /**< An extension dealing with Stanza Forwarding (@xep{0297}). */ + ExtCarbons, /**< An extension dealing with Message Carbons (@xep{0280}). */ + ExtIOData, /**< An extension dealing with IO Data (@xep{0244}) (though the IOData extension + * is not actually used as/meant to be a StanzaExtension. */ + ExtUser /**< User-supplied extensions must use IDs above this. Do + * not hard-code ExtUser's value anywhere, it is subject + * to change. */ + }; + + /** + * @brief This class abstracts a stanza extension, which is usually + * an element in a specific namespace. + * + * This class is the base class for almost all protocol extensions in gloox. + * As such, it should be used whenever an add-on to the core XMPP spec + * needs to be made. For simple protocols it may suffice to create a sub-class + * of StanzaExtension. For protocols which require keeping of state, an additional + * persistent object acting like a manager may be needed. + * + * A Stanza can be extended by additional namespaced child elements. Obviously, + * it is not viable to include all the kinds of extensions possible. To avoid + * hard-coding of such extensions into gloox, StanzaExtension can be used to + * inform the core of gloox about additional supported extensions without it + * needing to know about the exact implementation. + * + * Note that a StanzaExtension can be used for both sending and receiving + * of custom protocols. When receiving, gloox requires an appropriate implementation + * of the pure virtuals filterString() and newInstance(). To be able to properly use + * the encapsulation, some getters may be necessary. Note that the object you will be + * dealing with usually is @em const. + * For sending StanzaExtensions, a custom constructor (as well as some setters, + * possibly) is needed. Additionally, an implementation of tag() is required. + * + * @li Sub-class StanzaExtension and re-implement filterString(). filterString() + * is supposed to return an XPath expression that matches the child element + * of a stanza that the protocol-to-implement uses. For example, consider this + * hypothetical XML format: The protocol is encapsulated inside a <stats> + * element in the 'ext:stats' namespace. It uses IQ stanzas for transmission. + * @code + * + * + * + * + * + * + * 10 + * + * + * @endcode + * The idea of filterString() and its XPath expression is to match the + * <stats> element such that it can be fed to your + * StanzaExtension-derived class' constructor when creating a new instance + * of it. For our @e stats protocol, filterString() would return something like: + * /iq/stats[\@xmlns='ext:stats'] + * + * @li When subclassing StanzaExtension, you have to initialize it with an int, the extension's + * type. You should choose a value that is not yet used in gloox, and unique to + * the given extension you implement. In general, you are free to use values + * above @link gloox::ExtUser ExtUser @endlink. See + * @link gloox::StanzaExtensionType StanzaExtensionType @endlink for existing values. + * + * @li The next step is to implement newInstance(). Whenever filterString()'s + * XPath expression matches a child element of an incoming stanza, newInstance() + * is called with the matched Tag. For our example above, this is the <stats> + * element (including its children): + * @code + * + * 10 + * + * @endcode + * The purpose of newInstance() is to return a new instance of your specialized + * StanzaExtension (implicitly cast to StanzaExtension). This way, gloox can deal + * entirely with the abstract base, StanzaExtension, and never ever needs to know + * which kind of extension it deals with. The most common implementation of + * newInstance() looks like this: + * @code + * StanzaExtension* StatsExtension::newInstance( const Tag* tag ) const + * { + * return new StatsExtension( tag ); + * } + * @endcode + * This of course implies that a constructor exists that takes a const Tag* as the + * only parameter. + * + * @li Finally, gloox must be able to serialize the StanzaExtension back + * into string'ified XML. This is done by means of the tag() function which + * must be reimplemented. The output Tag should -- like the input Tag -- be embeddable + * into the respective stanza. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API StanzaExtension + { + public: + /** + * Constructs an empty StanzaExtension. + * @param type Designates the extension's type. It should be one of StanzaExtensionType + * for built-in extensions, and it should be higher than ExtUser for custom types. + */ + StanzaExtension( int type ) : m_valid( false ), m_extensionType( type ) {} + + /** + * Virtual destructor. + */ + virtual ~StanzaExtension() {} + + /** + * This function returns the embedded Stanza, if any. + * You only have to reimplement it if your protocol flow contains embedded Stanzas. + * + * @return The embedded Stanza. May be 0. + */ + virtual Stanza* embeddedStanza() const { return 0; } + + /** + * This function returns the embedded Tag that the embedded Stanza is based on, if any. + * You only have to reimplement it if your protocol flow contains embedded Stanzas. + * + * @return The embedded Tag. May be 0. + */ + virtual Tag* embeddedTag() const { return 0; } + + /** + * Returns an XPath expression that describes a path to child elements of a + * stanza that an extension handles. + * + * @return The extension's filter string. + */ + virtual const std::string& filterString() const = 0; + + /** + * Returns a new Instance of the derived type. Usually, for a derived class FooExtension, + * the implementation of this function looks like: + * @code + * StanzaExtension* FooExtension::newInstance( const Tag* tag ) const + * { + * return new FooExtension( tag ); + * } + * @endcode + * @return The derived extension's new instance. + */ + virtual StanzaExtension* newInstance( const Tag* tag ) const = 0; + + /** + * Returns a Tag representation of the extension. + * @return A Tag representation of the extension. + */ + virtual Tag* tag() const = 0; + + /** + * Returns an identical copy of the current StanzaExtension. + * @return An identical copy of the current StanzaExtension. + */ + virtual StanzaExtension* clone() const = 0; + + /** + * Returns the extension's type. + * @return The extension's type. + */ + int extensionType() const { return m_extensionType; } + + protected: + bool m_valid; + + private: + int m_extensionType; + + }; + +} + +#endif // STANZAEXTENSION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.cpp b/smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.cpp new file mode 100644 index 00000000..9941ebd8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.cpp @@ -0,0 +1,96 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "stanzaextensionfactory.h" + +#include "gloox.h" +#include "mutexguard.h" +#include "util.h" +#include "stanza.h" +#include "stanzaextension.h" +#include "tag.h" + +namespace gloox +{ + + StanzaExtensionFactory::StanzaExtensionFactory() + { + } + + StanzaExtensionFactory::~StanzaExtensionFactory() + { + m_extensionsMutex.lock(); + util::clearList( m_extensions ); + m_extensionsMutex.unlock(); + } + + void StanzaExtensionFactory::registerExtension( StanzaExtension* ext ) + { + if( !ext ) + return; + + util::MutexGuard m( m_extensionsMutex ); + SEList::iterator it = m_extensions.begin(); + SEList::iterator it2; + while( it != m_extensions.end() ) + { + it2 = it++; + if( ext->extensionType() == (*it2)->extensionType() ) + { + delete (*it2); + m_extensions.erase( it2 ); + } + } + m_extensions.push_back( ext ); + } + + bool StanzaExtensionFactory::removeExtension( int ext ) + { + util::MutexGuard m( m_extensionsMutex ); + SEList::iterator it = m_extensions.begin(); + for( ; it != m_extensions.end(); ++it ) + { + if( (*it)->extensionType() == ext ) + { + delete (*it); + m_extensions.erase( it ); + return true; + } + } + return false; + } + + void StanzaExtensionFactory::addExtensions( Stanza& stanza, Tag* tag ) + { + ConstTagList::const_iterator it; + + util::MutexGuard m( m_extensionsMutex ); + SEList::const_iterator ite = m_extensions.begin(); + for( ; ite != m_extensions.end(); ++ite ) + { + const ConstTagList& match = tag->findTagList( (*ite)->filterString() ); + it = match.begin(); + for( ; it != match.end(); ++it ) + { + StanzaExtension* se = (*ite)->newInstance( (*it) ); + if( se ) + { + stanza.addExtension( se ); + if( se->embeddedStanza() ) + stanza.setEmbeddedStanza(); + } + } + } + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.h b/smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.h new file mode 100644 index 00000000..c5b6ae27 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/stanzaextensionfactory.h @@ -0,0 +1,93 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef STANZAEXTENSIONFACTORY_H__ +#define STANZAEXTENSIONFACTORY_H__ + +#include "mutex.h" + +#include + +namespace gloox +{ + + class Tag; + class Stanza; + class StanzaExtension; + + /** + * @brief A Factory that creates StanzaExtensions from Tags. + * + * To supply a custom StanzaExtension, reimplement StanzaExtension's + * virtuals and pass an instance to registerExtension(). + * + * You should not need to use this class directly. Use ClientBase::registerStanzaExtension() + * instead. See StanzaExtension for more information about adding protocol implementations + * to gloox. + * + * @author Jakob Schröter + * @since 0.9 + */ + class StanzaExtensionFactory + { + + friend class ClientBase; + + public: + /** + * Use this function to inform StanzaExtensionFactory about available StanzaExtensions. + * By default, StanzaExtensionFactory does not know about any extensions. + * gloox-built-in extensions will usually be registered by their respective protocol + * implementations unless otherwise noted in the extension's API docs. + * @param ext An extension to register. + * @note The supplied StanzaExtension will be deleted in StanzaExtensionFactory's destructor. + * @note Only one instance per extension type can be registered. In case an extension is + * registered that is of the same type as an already registered extension, the new extension + * will replace the previously registered one. + */ + void registerExtension( StanzaExtension* ext ); + + /** + * Removes the given extension type. + * @param ext The extension type. + * @return @b True if the given type was found (and removed), @b false otherwise. + */ + bool removeExtension( int ext ); + + /** + * Creates a new StanzaExtensionFactory. + */ + StanzaExtensionFactory(); + + /** + * Non-virtual destructor. + */ + ~StanzaExtensionFactory(); + + /** + * This function creates StanzaExtensions from the given Tag and attaches them to the given Stanza. + * @param stanza The Stanza to attach the extensions to. + * @param tag The Tag to parse and create the StanzaExtension from. + */ + void addExtensions( Stanza& stanza, Tag* tag ); + + private: + typedef std::list SEList; + SEList m_extensions; + util::Mutex m_extensionsMutex; + + }; + +} + +#endif // STANZAEXTENSIONFACTORY_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/statisticshandler.h b/smack/smack/src/main/cpp/gloox/src/statisticshandler.h new file mode 100644 index 00000000..71d61614 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/statisticshandler.h @@ -0,0 +1,80 @@ +/* + Copyright (c) 2006-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef STATISTICSHANDLER_H__ +#define STATISTICSHANDLER_H__ + +#include "stanza.h" + +namespace gloox +{ + + /** + * A structure describing the current connection statistics. + */ + struct StatisticsStruct + { + long int totalBytesSent; /**< The total number of bytes sent over the wire. This does @b not + * include the TLS handshake nor any TLS-related overhead, but it does + * include anything sent before compression was switched on. */ + long int totalBytesReceived; /**< The total number of bytes received over the wire. This does @b not + * include the TLS handshake nor any TLS-related overhead, but it does + * include anything sent before compression was switched on. */ + long int compressedBytesSent; /**< Total number of bytes sent over the wire after compression was + * applied. */ + long int compressedBytesReceived; /**< Total number of bytes received over the wire before decompression + * was applied. */ + long int uncompressedBytesSent; /**< Total number of bytes sent over the wire before compression was + * applied. */ + long int uncompressedBytesReceived; /**< Total number of bytes received over the wire after decompression + * was applied. */ + long int totalStanzasSent; /**< The total number of Stanzas sent. */ + long int totalStanzasReceived; /**< The total number of Stanzas received. */ + long int iqStanzasSent; /**< The total number of IQ Stanzas sent. */ + long int iqStanzasReceived; /**< The total number of IQ Stanzas received. */ + long int messageStanzasSent; /**< The total number of Message Stanzas sent. */ + long int messageStanzasReceived; /**< The total number of Message Stanzas received. */ + long int s10nStanzasSent; /**< The total number of Subscription Stanzas sent. */ + long int s10nStanzasReceived; /**< The total number of Subscription Stanzas received. */ + long int presenceStanzasSent; /**< The total number of Presence Stanzas sent. */ + long int presenceStanzasReceived; /**< The total number of Presence Stanzas received. */ + bool encryption; /**< Whether or not the connection (to the server) is encrypted. */ + bool compression; /**< Whether or not the stream (to the server) gets compressed. */ + }; + + /** + * @brief A virtual interface which can be reimplemented to receive connection statistics. + * + * Derived classes can be registered as StatisticsHandlers with the ClientBase. + * + * @author Jakob Schröter + * @since 0.9 + */ + class GLOOX_API StatisticsHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~StatisticsHandler() {} + + /** + * This function is called when a Stanza has been sent or received. + * @param stats The updated connection statistics. + */ + virtual void handleStatistics( const StatisticsStruct stats ) = 0; + }; + +} + +#endif // STATISTICSHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/subscription.cpp b/smack/smack/src/main/cpp/gloox/src/subscription.cpp new file mode 100644 index 00000000..2ac2ab5e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/subscription.cpp @@ -0,0 +1,77 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#include "subscription.h" +#include "util.h" + +namespace gloox +{ + + static const char* msgTypeStringValues[] = + { + "subscribe", "subscribed", "unsubscribe", "unsubscribed" + }; + + static inline const std::string typeString( Subscription::S10nType type ) + { + return util::lookup( type, msgTypeStringValues ); + } + + Subscription::Subscription( Tag* tag ) + : Stanza( tag ), m_subtype( Invalid ), m_stati( 0 ) + { + if( !tag || tag->name() != "presence" ) + return; + + m_subtype = (S10nType)util::lookup( tag->findAttribute( TYPE ), msgTypeStringValues ); + + const ConstTagList& c = tag->findTagList( "/presence/status" ); + ConstTagList::const_iterator it = c.begin(); + for( ; it != c.end(); ++it ) + setLang( &m_stati, m_status, (*it) ); + } + + Subscription::Subscription( S10nType type, const JID& to, const std::string& status, + const std::string& xmllang ) + : Stanza( to ), m_subtype( type ), m_stati( 0 ) + { + setLang( &m_stati, m_status, status, xmllang ); + } + + Subscription::~Subscription() + { + delete m_stati; + } + + Tag* Subscription::tag() const + { + if( m_subtype == Invalid ) + return 0; + + Tag* t = new Tag( "presence" ); + if( m_to ) + t->addAttribute( "to", m_to.full() ); + if( m_from ) + t->addAttribute( "from", m_from.full() ); + + t->addAttribute( "type", typeString( m_subtype ) ); + + getLangs( m_stati, m_status, "status", t ); + + StanzaExtensionList::const_iterator it = m_extensionList.begin(); + for( ; it != m_extensionList.end(); ++it ) + t->addChild( (*it)->tag() ); + + return t; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/subscription.h b/smack/smack/src/main/cpp/gloox/src/subscription.h new file mode 100644 index 00000000..de6976da --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/subscription.h @@ -0,0 +1,106 @@ +/* + Copyright (c) 2007-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#ifndef SUBSCRIPTION_H__ +#define SUBSCRIPTION_H__ + +#include "stanza.h" + +#include + +namespace gloox +{ + + class JID; + + /** + * @brief An abstraction of a subscription stanza. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Subscription : public Stanza + { + + public: + + friend class ClientBase; + + /** + * Describes the different valid message types. + */ + enum S10nType + { + Subscribe, /**< A subscription request. */ + Subscribed, /**< A subscription notification. */ + Unsubscribe, /**< An unsubscription request. */ + Unsubscribed, /**< An unsubscription notification. */ + Invalid /**< The stanza is invalid. */ + }; + + /** + * Creates a Subscription request. + * @param type The presence type. + * @param to The intended receiver. Use an empty JID to create a broadcast packet. + * @param status An optional status message (e.g. "please authorize me"). + * @param xmllang An optional xml:lang for the status message. + */ + Subscription( S10nType type, const JID& to, const std::string& status = EmptyString, + const std::string& xmllang = EmptyString ); + /** + * Destructor. + */ + virtual ~Subscription(); + + /** + * Returns the subscription stanza's type. + * @return The subscription stanza's type. + * + */ + S10nType subtype() const { return m_subtype; } + + /** + * Returns the status text of a presence stanza for the given language if available. + * If the requested language is not available, the default status text (without a xml:lang + * attribute) will be returned. + * @param lang The language identifier for the desired language. It must conform to + * section 2.12 of the XML specification and RFC 3066. If empty, the default body + * will be returned, if any. + * @return The status text set by the sender. + */ + const std::string status( const std::string& lang = "default" ) const + { + return findLang( m_stati, m_status, lang ); + } + + // reimplemented from Stanza + virtual Tag* tag() const; + + private: +#ifdef SUBSCRIPTION_TEST + public: +#endif + /** + * Creates a Subscription request from the given Tag. The original Tag will be ripped off. + * @param tag The Tag to parse. + */ + Subscription( Tag* tag ); + + S10nType m_subtype; + StringMap* m_stati; + std::string m_status; + + }; + +} + +#endif // SUBSCRIPTION_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/subscriptionhandler.h b/smack/smack/src/main/cpp/gloox/src/subscriptionhandler.h new file mode 100644 index 00000000..9c84b2dc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/subscriptionhandler.h @@ -0,0 +1,49 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef SUBSCRIPTIONHANDLER_H__ +#define SUBSCRIPTIONHANDLER_H__ + +#include "subscription.h" + +namespace gloox +{ + + /** + * @brief A virtual interface which can be reimplemented to receive incoming subscription stanzas. + * + * Derived classes can be registered as SubscriptionHandlers with the Client. + * Upon an incoming Subscription packet @ref handleSubscription() will be called. + * @author Jakob Schröter + */ + class GLOOX_API SubscriptionHandler + { + public: + /** + * Virtual destructor. + */ + virtual ~SubscriptionHandler() {} + + /** + * Reimplement this function if you want to be notified about incoming + * subscriptions/subscription requests. + * @param subscription The complete Subscription stanza. + * @since 1.0 + */ + virtual void handleSubscription( const Subscription& subscription ) = 0; + + }; + +} + +#endif // SUBSCRIPTIONHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tag.cpp b/smack/smack/src/main/cpp/gloox/src/tag.cpp new file mode 100644 index 00000000..79d4a30b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tag.cpp @@ -0,0 +1,1377 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#include "tag.h" +#include "util.h" + +#include + +#include +#include + +namespace gloox +{ + + // ---- Tag::Attribute ---- + Tag::Attribute::Attribute( Tag* parent, const std::string& name, const std::string& value, + const std::string& xmlns ) + : m_parent( parent ) + { + if( m_parent ) + m_parent->addAttribute( this ); + + init( name, value, xmlns ); + } + + Tag::Attribute::Attribute( const std::string& name, const std::string& value, + const std::string& xmlns ) + : m_parent( 0 ) + { + init( name, value, xmlns ); + } + + Tag::Attribute::Attribute( const Attribute& attr ) + : m_parent( attr.m_parent ), m_name( attr.m_name ), m_value( attr.m_value ), + m_xmlns( attr.m_xmlns ), m_prefix( attr.m_prefix ) + { + } + + void Tag::Attribute::init( const std::string& name, const std::string& value, + const std::string& xmlns ) + { + if( util::checkValidXMLChars( xmlns ) ) + m_xmlns = xmlns; + else + return; + + if( util::checkValidXMLChars( value ) ) + m_value = value; + else + return; + + if( util::checkValidXMLChars( name ) ) + m_name = name; + else + return; + } + + bool Tag::Attribute::setValue( const std::string& value ) + { + if( !util::checkValidXMLChars( value ) ) + return false; + + m_value = value; + return true; + } + + bool Tag::Attribute::setXmlns( const std::string& xmlns ) + { + if( !util::checkValidXMLChars( xmlns ) ) + return false; + + m_xmlns = xmlns; + return true; + } + + bool Tag::Attribute::setPrefix( const std::string& prefix ) + { + if( !util::checkValidXMLChars( prefix ) ) + return false; + + m_prefix = prefix; + return true; + } + + const std::string& Tag::Attribute::xmlns() const + { + if( !m_xmlns.empty() ) + return m_xmlns; + + if( m_parent ) + return m_parent->xmlns( m_prefix ); + + return EmptyString; + } + + const std::string& Tag::Attribute::prefix() const + { + if( !m_prefix.empty() ) + return m_prefix; + + if( m_parent ) + return m_parent->prefix( m_xmlns ); + + return EmptyString; + } + + const std::string Tag::Attribute::xml() const + { + if( m_name.empty() ) + return EmptyString; + + std::string xml; + xml += ' '; + if( !m_prefix.empty() ) + { + xml += m_prefix; + xml += ':'; + } + xml += m_name; + xml += "='"; + util::appendEscaped( xml, m_value ); + xml += '\''; + + return xml; + } + // ---- ~Tag::Attribute ---- + + // ---- Tag ---- + Tag::Tag( const std::string& name, const std::string& cdata ) + : m_parent( 0 ), m_children( 0 ), m_cdata( 0 ), + m_attribs( 0 ), m_nodes( 0 ), + m_xmlnss( 0 ) + { + addCData( cdata ); // implicitly UTF-8 checked + + if( util::checkValidXMLChars( name ) ) + m_name = name; + } + + Tag::Tag( Tag* parent, const std::string& name, const std::string& cdata ) + : m_parent( parent ), m_children( 0 ), m_cdata( 0 ), + m_attribs( 0 ), m_nodes( 0 ), + m_xmlnss( 0 ) + { + if( m_parent ) + m_parent->addChild( this ); + + addCData( cdata ); // implicitly UTF-8 checked + + if( util::checkValidXMLChars( name ) ) + m_name = name; + } + + Tag::Tag( const std::string& name, + const std::string& attrib, + const std::string& value ) + : m_parent( 0 ), m_children( 0 ), m_cdata( 0 ), + m_attribs( 0 ), m_nodes( 0 ), + m_name( name ), m_xmlnss( 0 ) + { + addAttribute( attrib, value ); // implicitly UTF-8 checked + + if( util::checkValidXMLChars( name ) ) + m_name = name; + } + + Tag::Tag( Tag* parent, const std::string& name, + const std::string& attrib, + const std::string& value ) + : m_parent( parent ), m_children( 0 ), m_cdata( 0 ), + m_attribs( 0 ), m_nodes( 0 ), + m_name( name ), m_xmlnss( 0 ) + { + if( m_parent ) + m_parent->addChild( this ); + + addAttribute( attrib, value ); // implicitly UTF-8 checked + + if( util::checkValidXMLChars( name ) ) + m_name = name; + } + + Tag::Tag( Tag* tag ) + : m_parent( 0 ), m_children( 0 ), m_cdata( 0 ), m_attribs( 0 ), + m_nodes( 0 ), m_xmlnss( 0 ) + { + if( !tag ) + return; + + m_children = tag->m_children; + m_cdata = tag->m_cdata; + m_attribs = tag->m_attribs; + m_nodes = tag->m_nodes; + m_name = tag->m_name; + m_xmlns = tag->m_xmlns; + m_xmlnss = tag->m_xmlnss; + + tag->m_nodes = 0; + tag->m_cdata = 0; + tag->m_attribs = 0; + tag->m_children = 0; + tag->m_xmlnss = 0; + + if( m_attribs ) + { + AttributeList::iterator it = m_attribs->begin(); + while( it != m_attribs->end() ) + (*it++)->m_parent = this; + } + + if( m_children ) + { + TagList::iterator it = m_children->begin(); + while( it != m_children->end() ) + (*it++)->m_parent = this; + } + } + + Tag::~Tag() + { + if( m_cdata ) + util::clearList( *m_cdata ); + if( m_attribs ) + util::clearList( *m_attribs ); + if( m_children ) + util::clearList( *m_children ); + if( m_nodes ) + util::clearList( *m_nodes ); + + delete m_cdata; + delete m_attribs; + delete m_children; + delete m_nodes; + delete m_xmlnss; + + m_parent = 0; + } + + bool Tag::operator==( const Tag& right ) const + { + if( m_name != right.m_name || m_xmlns != right.m_xmlns ) + return false; + + if( m_cdata && right.m_cdata ) + { + StringPList::const_iterator ct = m_cdata->begin(); + StringPList::const_iterator ct_r = right.m_cdata->begin(); + while( ct != m_cdata->end() && ct_r != right.m_cdata->end() && *(*ct) == *(*ct_r) ) + { + ++ct; + ++ct_r; + } + if( ct != m_cdata->end() ) + return false; + } + else if( m_cdata || right.m_cdata ) + return false; + + if( m_children && right.m_children ) + { + TagList::const_iterator it = m_children->begin(); + TagList::const_iterator it_r = right.m_children->begin(); + while( it != m_children->end() && it_r != right.m_children->end() && *(*it) == *(*it_r) ) + { + ++it; + ++it_r; + } + if( it != m_children->end() ) + return false; + } + else if( m_children || right.m_children ) + return false; + + if( m_attribs && right.m_attribs ) + { + AttributeList::const_iterator at = m_attribs->begin(); + AttributeList::const_iterator at_r = right.m_attribs->begin(); + while( at != m_attribs->end() && at_r != right.m_attribs->end() && *(*at) == *(*at_r) ) + { + ++at; + ++at_r; + } + if( at != m_attribs->end() ) + return false; + } + else if( m_attribs || right.m_attribs ) + return false; + + return true; + } + + const std::string Tag::xml() const + { + if( m_name.empty() ) + return EmptyString; + + std::string xml = "<"; + if( !m_prefix.empty() ) + { + xml += m_prefix; + xml += ':'; + } + xml += m_name; + if( m_attribs && !m_attribs->empty() ) + { + AttributeList::const_iterator it_a = m_attribs->begin(); + for( ; it_a != m_attribs->end(); ++it_a ) + { + xml += (*it_a)->xml(); + } + } + + if( !m_nodes || m_nodes->empty() ) + xml += "/>"; + else + { + xml += '>'; + NodeList::const_iterator it_n = m_nodes->begin(); + for( ; it_n != m_nodes->end(); ++it_n ) + { + switch( (*it_n)->type ) + { + case TypeTag: + xml += (*it_n)->tag->xml(); + break; + case TypeString: + util::appendEscaped( xml, *((*it_n)->str) ); + break; + } + } + xml += "'; + } + + return xml; + } + + bool Tag::addAttribute( Attribute* attr ) + { + if( !attr ) + return false; + + if( !(*attr) ) + { + delete attr; + return false; + } + + if( !m_attribs ) + m_attribs = new AttributeList(); + + AttributeList::iterator it = m_attribs->begin(); + for( ; it != m_attribs->end(); ++it ) + { + if( (*it)->name() == attr->name() + && ( (*it)->xmlns() == attr->xmlns() || (*it)->prefix() == attr->prefix() ) ) + { + delete (*it); + (*it) = attr; + return true; + } + } + + m_attribs->push_back( attr ); + + return true; + } + + bool Tag::addAttribute( const std::string& name, const std::string& value ) + { + if( name.empty() || value.empty() ) + return false; + + return addAttribute( new Attribute( name, value ) ); + } + + bool Tag::addAttribute( const std::string& name, int value ) + { + if( name.empty() ) + return false; + + return addAttribute( name, util::int2string( value ) ); + } + + bool Tag::addAttribute( const std::string& name, long value ) + { + if( name.empty() ) + return false; + + return addAttribute( name, util::long2string( value ) ); + } + + void Tag::setAttributes( const AttributeList& attributes ) + { + if( !m_attribs ) + m_attribs = new AttributeList( attributes ); + else + { + util::clearList( *m_attribs ); + *m_attribs = attributes; + } + + AttributeList::iterator it = m_attribs->begin(); + for( ; it != m_attribs->end(); ++it ) + (*it)->m_parent = this; + } + + void Tag::addChild( Tag* child ) + { + if( !child ) + return; + + if( !m_nodes ) + m_nodes = new NodeList(); + if( !m_children ) + m_children = new TagList(); + + m_children->push_back( child ); + child->m_parent = this; + m_nodes->push_back( new Node( TypeTag, child ) ); + } + + void Tag::addChildCopy( const Tag* child ) + { + if( !child ) + return; + + addChild( child->clone() ); + } + + bool Tag::setCData( const std::string& cdata ) + { + if( cdata.empty() || !util::checkValidXMLChars( cdata ) ) + return false; + + if( !m_cdata ) + m_cdata = new StringPList(); + else + util::clearList( *m_cdata ); + + if( !m_nodes ) + m_nodes = new NodeList(); + else + { + NodeList::iterator it = m_nodes->begin(); + NodeList::iterator t; + while( it != m_nodes->end() ) + { + if( (*it)->type == TypeString ) + { + t = it++; + delete (*t); + m_nodes->erase( t ); + } + else + { + it++; + } + } + } + + return addCData( cdata ); + } + + bool Tag::addCData( const std::string& cdata ) + { + if( cdata.empty() || !util::checkValidXMLChars( cdata ) ) + return false; + + if( !m_cdata ) + m_cdata = new StringPList(); + if( !m_nodes ) + m_nodes = new NodeList(); + + std::string* str = new std::string( cdata ); + m_cdata->push_back( str ); + m_nodes->push_back( new Node( TypeString, str ) ); + return true; + } + + const std::string Tag::cdata() const + { + if( !m_cdata ) + return EmptyString; + + std::string str; + StringPList::const_iterator it = m_cdata->begin(); + for( ; it != m_cdata->end(); ++it ) + str += *(*it); + + return str; + } + + const TagList& Tag::children() const + { + static const TagList empty; + return m_children ? *m_children : empty; + } + + const Tag::AttributeList& Tag::attributes() const + { + static const AttributeList empty; + return m_attribs ? *m_attribs : empty; + } + + bool Tag::setXmlns( const std::string& xmlns, const std::string& prefix ) + { + if( !util::checkValidXMLChars( xmlns ) || !util::checkValidXMLChars( prefix ) ) + return false; + + if( prefix.empty() ) + { + m_xmlns = xmlns; + return addAttribute( XMLNS, m_xmlns ); + } + else + { + if( !m_xmlnss ) + m_xmlnss = new StringMap(); + + (*m_xmlnss)[prefix] = xmlns; + + return addAttribute( XMLNS + ":" + prefix, xmlns ); + } + } + + const std::string& Tag::xmlns() const + { + return xmlns( m_prefix ); + } + + const std::string& Tag::xmlns( const std::string& prefix ) const + { + if( prefix.empty() ) + { + return hasAttribute( XMLNS ) ? findAttribute( XMLNS ) : m_xmlns; + } + + if( m_xmlnss ) + { + StringMap::const_iterator it = m_xmlnss->find( prefix ); + if( it != m_xmlnss->end() ) + return (*it).second; + } + + return m_parent ? m_parent->xmlns( prefix ) : EmptyString; + } + + bool Tag::setPrefix( const std::string& prefix ) + { + if( !util::checkValidXMLChars( prefix ) ) + return false; + + m_prefix = prefix; + return true; + } + + const std::string& Tag::prefix( const std::string& xmlns ) const + { + if( xmlns.empty() || !m_xmlnss ) + return EmptyString; + + StringMap::const_iterator it = m_xmlnss->begin(); + for( ; it != m_xmlnss->end(); ++it ) + { + if( (*it).second == xmlns ) + return (*it).first; + } + + return EmptyString; + } + + const std::string& Tag::findAttribute( const std::string& name ) const + { + if( !m_attribs ) + return EmptyString; + + AttributeList::const_iterator it = m_attribs->begin(); + for( ; it != m_attribs->end(); ++it ) + if( (*it)->name() == name ) + return (*it)->value(); + + return EmptyString; + } + + bool Tag::hasAttribute( const std::string& name, const std::string& value ) const + { + if( name.empty() || !m_attribs ) + return false; + + AttributeList::const_iterator it = m_attribs->begin(); + for( ; it != m_attribs->end(); ++it ) + if( (*it)->name() == name ) + return value.empty() || (*it)->value() == value; + + return false; + } + + bool Tag::hasChild( const std::string& name, const std::string& attr, + const std::string& value ) const + { + if( attr.empty() ) + return findChild( name ) ? true : false; + else + return findChild( name, attr, value ) ? true : false; + } + + Tag* Tag::findChild( const std::string& name ) const + { + if( !m_children ) + return 0; + + TagList::const_iterator it = m_children->begin(); + while( it != m_children->end() && (*it)->name() != name ) + ++it; + return it != m_children->end() ? (*it) : 0; + } + + Tag* Tag::findChild( const std::string& name, const std::string& attr, + const std::string& value ) const + { + if( !m_children || name.empty() ) + return 0; + + TagList::const_iterator it = m_children->begin(); + while( it != m_children->end() && ( (*it)->name() != name || !(*it)->hasAttribute( attr, value ) ) ) + ++it; + return it != m_children->end() ? (*it) : 0; + } + + bool Tag::hasChildWithCData( const std::string& name, const std::string& cdata ) const + { + if( !m_children || name.empty() || cdata.empty() ) + return 0; + + TagList::const_iterator it = m_children->begin(); + while( it != m_children->end() && ( (*it)->name() != name + || ( !cdata.empty() && (*it)->cdata() != cdata ) ) ) + ++it; + return it != m_children->end(); + } + + Tag* Tag::findChildWithAttrib( const std::string& attr, const std::string& value ) const + { + if( !m_children || attr.empty() ) + return 0; + + TagList::const_iterator it = m_children->begin(); + while( it != m_children->end() && !(*it)->hasAttribute( attr, value ) ) + ++it; + return it != m_children->end() ? (*it) : 0; + } + + Tag* Tag::clone() const + { + Tag* t = new Tag( m_name ); + t->m_xmlns = m_xmlns; + t->m_prefix = m_prefix; + + if( m_attribs ) + { + t->m_attribs = new AttributeList(); + Tag::AttributeList::const_iterator at = m_attribs->begin(); + Attribute* attr; + for( ; at != m_attribs->end(); ++at ) + { + attr = new Attribute( *(*at) ); + attr->m_parent = t; + t->m_attribs->push_back( attr ); + } + } + + if( m_xmlnss ) + { + t->m_xmlnss = new StringMap( *m_xmlnss ); + } + + if( m_nodes ) + { + Tag::NodeList::const_iterator nt = m_nodes->begin(); + for( ; nt != m_nodes->end(); ++nt ) + { + switch( (*nt)->type ) + { + case TypeTag: + t->addChild( (*nt)->tag->clone() ); + break; + case TypeString: + t->addCData( *((*nt)->str) ); + break; + } + } + } + + return t; + } + + TagList Tag::findChildren( const std::string& name, + const std::string& xmlns ) const + { + return m_children ? findChildren( *m_children, name, xmlns ) : TagList(); + } + + TagList Tag::findChildren( const TagList& list, const std::string& name, + const std::string& xmlns ) const + { + TagList ret; + TagList::const_iterator it = list.begin(); + for( ; it != list.end(); ++it ) + { + if( (*it)->name() == name && ( xmlns.empty() || (*it)->xmlns() == xmlns ) ) + ret.push_back( (*it) ); + } + return ret; + } + + void Tag::removeChild( const std::string& name, const std::string& xmlns ) + { + if( name.empty() || !m_children || !m_nodes ) + return; + + TagList l = findChildren( name, xmlns ); + TagList::iterator it = l.begin(); + TagList::iterator it2; + while( it != l.end() ) + { + it2 = it++; + NodeList::iterator itn = m_nodes->begin(); + for( ; itn != m_nodes->end(); ++itn ) + { + if( (*itn)->type == TypeTag && (*itn)->tag == (*it2) ) + { + delete (*itn); + m_nodes->erase( itn ); + break; + } + } + m_children->remove( (*it2) ); + delete (*it2); + } + } + + void Tag::removeChild( Tag* tag ) + { + if( m_children ) + m_children->remove( tag ); + + if( !m_nodes ) + return; + + NodeList::iterator it = m_nodes->begin(); + for( ; it != m_nodes->end(); ++it ) + { + if( (*it)->type == TypeTag && (*it)->tag == tag ) + { + delete (*it); + m_nodes->erase( it ); + return; + } + } + } + + void Tag::removeAttribute( const std::string& attr, const std::string& value, + const std::string& xmlns ) + { + if( attr.empty() || !m_attribs ) + return; + + AttributeList::iterator it = m_attribs->begin(); + AttributeList::iterator it2; + while( it != m_attribs->end() ) + { + it2 = it++; + if( (*it2)->name() == attr && ( value.empty() || (*it2)->value() == value ) + && ( xmlns.empty() || (*it2)->xmlns() == xmlns ) ) + { + delete (*it2); + m_attribs->erase( it2 ); + } + } + } + + const std::string Tag::findCData( const std::string& expression ) const + { + const ConstTagList& l = findTagList( expression ); + return !l.empty() ? l.front()->cdata() : EmptyString; + } + + const Tag* Tag::findTag( const std::string& expression ) const + { + const ConstTagList& l = findTagList( expression ); + return !l.empty() ? l.front() : 0; + } + + ConstTagList Tag::findTagList( const std::string& expression ) const + { + ConstTagList l; + if( expression == "/" || expression == "//" ) + return l; + + if( m_parent && expression.length() >= 2 && expression[0] == '/' + && expression[1] != '/' ) + return m_parent->findTagList( expression ); + + unsigned len = 0; + Tag* p = parse( expression, len ); +// if( p ) +// printf( "parsed tree: %s\n", p->xml().c_str() ); + l = evaluateTagList( p ); + delete p; + return l; + } + + ConstTagList Tag::evaluateTagList( Tag* token ) const + { + ConstTagList result; + if( !token ) + return result; + +// printf( "evaluateTagList called in Tag %s and Token %s (type: %s)\n", name().c_str(), +// token->name().c_str(), token->findAttribute( TYPE ).c_str() ); + + TokenType tokenType = (TokenType)atoi( token->findAttribute( TYPE ).c_str() ); + switch( tokenType ) + { + case XTUnion: + add( result, evaluateUnion( token ) ); + break; + case XTElement: + { +// printf( "in XTElement, token: %s\n", token->name().c_str() ); + if( token->name() == name() || token->name() == "*" ) + { +// printf( "found %s\n", name().c_str() ); + const TagList& tokenChildren = token->children(); + if( tokenChildren.size() ) + { + bool predicatesSucceeded = true; + TagList::const_iterator cit = tokenChildren.begin(); + for( ; cit != tokenChildren.end(); ++cit ) + { + if( (*cit)->hasAttribute( "predicate", "true" ) ) + { + predicatesSucceeded = evaluatePredicate( (*cit) ); + if( !predicatesSucceeded ) + return result; + } + } + + bool hasElementChildren = false; + cit = tokenChildren.begin(); + for( ; cit != tokenChildren.end(); ++cit ) + { + if( (*cit)->hasAttribute( "predicate", "true" ) || + (*cit)->hasAttribute( "number", "true" ) ) + continue; + + hasElementChildren = true; + +// printf( "checking %d children of token %s\n", tokenChildren.size(), token->name().c_str() ); + if( m_children && !m_children->empty() ) + { + TagList::const_iterator it = m_children->begin(); + for( ; it != m_children->end(); ++it ) + { + add( result, (*it)->evaluateTagList( (*cit) ) ); + } + } + else if( atoi( (*cit)->findAttribute( TYPE ).c_str() ) == XTDoubleDot && m_parent ) + { + (*cit)->addAttribute( TYPE, XTDot ); + add( result, m_parent->evaluateTagList( (*cit) ) ); + } + } + + if( !hasElementChildren ) + result.push_back( this ); + } + else + { +// printf( "adding %s to result set\n", name().c_str() ); + result.push_back( this ); + } + } +// else +// printf( "found %s != %s\n", token->name().c_str(), name().c_str() ); + + break; + } + case XTDoubleSlash: + { +// printf( "in XTDoubleSlash\n" ); + Tag* t = token->clone(); +// printf( "original token: %s\ncloned token: %s\n", token->xml().c_str(), n->xml().c_str() ); + t->addAttribute( TYPE, XTElement ); + add( result, evaluateTagList( t ) ); + const ConstTagList& res2 = allDescendants(); + ConstTagList::const_iterator it = res2.begin(); + for( ; it != res2.end(); ++it ) + { + add( result, (*it)->evaluateTagList( t ) ); + } + delete t; + break; + } + case XTDot: + { + const TagList& tokenChildren = token->children(); + if( !tokenChildren.empty() ) + { + add( result, evaluateTagList( tokenChildren.front() ) ); + } + else + result.push_back( this ); + break; + } + case XTDoubleDot: + { +// printf( "in XTDoubleDot\n" ); + if( m_parent ) + { + const TagList& tokenChildren = token->children(); + if( tokenChildren.size() ) + { + Tag* testtoken = tokenChildren.front(); + if( testtoken->name() == "*" ) + { + add( result, m_parent->evaluateTagList( testtoken ) ); + } + else + { + Tag* t = token->clone(); + t->addAttribute( TYPE, XTElement ); + t->m_name = m_parent->m_name; + add( result, m_parent->evaluateTagList( t ) ); + delete t; + } + } + else + { + result.push_back( m_parent ); + } + } + } + case XTInteger: + { + const TagList& l = token->children(); + if( !l.size() ) + break; + + const ConstTagList& res = evaluateTagList( l.front() ); + + int pos = atoi( token->name().c_str() ); +// printf( "checking index %d\n", pos ); + if( pos > 0 && pos <= (int)res.size() ) + { + ConstTagList::const_iterator it = res.begin(); + while ( --pos ) + { + ++it; + } + result.push_back( *it ); + } + break; + } + default: + break; + } + return result; + } + + bool Tag::evaluateBoolean( Tag* token ) const + { + if( !token ) + return false; + + bool result = false; + TokenType tokenType = (TokenType)atoi( token->findAttribute( TYPE ).c_str() ); + switch( tokenType ) + { + case XTAttribute: + if( token->name() == "*" && m_attribs && m_attribs->size() ) + result = true; + else + result = hasAttribute( token->name() ); + break; + case XTOperatorEq: + result = evaluateEquals( token ); + break; + case XTOperatorLt: + break; + case XTOperatorLtEq: + break; + case XTOperatorGtEq: + break; + case XTOperatorGt: + break; + case XTUnion: + case XTElement: + { + Tag* t = new Tag( "." ); + t->addAttribute( TYPE, XTDot ); + t->addChild( token ); + result = !evaluateTagList( t ).empty(); + t->removeChild( token ); + delete t; + break; + } + default: + break; + } + + return result; + } + + bool Tag::evaluateEquals( Tag* token ) const + { + if( !token || token->children().size() != 2 ) + return false; + + bool result = false; + TagList::const_iterator it = token->children().begin(); + Tag* ch1 = (*it); + Tag* ch2 = (*++it); + + TokenType tt1 = (TokenType)atoi( ch1->findAttribute( TYPE ).c_str() ); + TokenType tt2 = (TokenType)atoi( ch2->findAttribute( TYPE ).c_str() ); + switch( tt1 ) + { + case XTAttribute: + switch( tt2 ) + { + case XTInteger: + case XTLiteral: + result = ( findAttribute( ch1->name() ) == ch2->name() ); + break; + case XTAttribute: + result = ( hasAttribute( ch1->name() ) && hasAttribute( ch2->name() ) && + findAttribute( ch1->name() ) == findAttribute( ch2->name() ) ); + break; + default: + break; + } + break; + case XTInteger: + case XTLiteral: + switch( tt2 ) + { + case XTAttribute: + result = ( ch1->name() == findAttribute( ch2->name() ) ); + break; + case XTLiteral: + case XTInteger: + result = ( ch1->name() == ch2->name() ); + break; + default: + break; + } + break; + default: + break; + } + + return result; + } + + ConstTagList Tag::allDescendants() const + { + ConstTagList result; + + if( !m_children ) + return result; + + TagList::const_iterator it = m_children->begin(); + for( ; it != m_children->end(); ++it ) + { + result.push_back( (*it) ); + add( result, (*it)->allDescendants() ); + } + return result; + } + + ConstTagList Tag::evaluateUnion( Tag* token ) const + { + ConstTagList result; + if( !token ) + return result; + + const TagList& l = token->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + add( result, evaluateTagList( (*it) ) ); + } + return result; + } + + void Tag::closePreviousToken( Tag** root, Tag** current, Tag::TokenType& type, std::string& tok ) const + { + if( !tok.empty() ) + { + addToken( root, current, type, tok ); + type = XTElement; + tok = EmptyString; + } + } + + Tag* Tag::parse( const std::string& expression, unsigned& len, Tag::TokenType border ) const + { + Tag* root = 0; + Tag* current = root; + std::string token; + +// XPathError error = XPNoError; +// XPathState state = Init; +// int expected = 0; +// bool run = true; +// bool ws = false; + + Tag::TokenType type = XTElement; + + char c; + for( ; len < expression.length(); ++len ) + { + c = expression[len]; + if( type == XTLiteralInside && c != '\'' ) + { + token += c; + continue; + } + + switch( c ) + { + case '/': + closePreviousToken( &root, ¤t, type, token ); + + if( len < expression.length()-1 && expression[len+1] == '/' ) + { +// addToken( &root, ¤t, XTDoubleSlash, "//" ); + type = XTDoubleSlash; + ++len; + } +// else +// { +// if( !current ) +// addToken( &root, ¤t, XTSlash, "/" ); +// } + break; + case ']': + closePreviousToken( &root, ¤t, type, token ); + return root; + case '[': + { + closePreviousToken( &root, ¤t, type, token ); + Tag* t = parse( expression, ++len, XTRightBracket ); + if( !addPredicate( &root, ¤t, t ) ) + delete t; + break; + } + case '(': + { + closePreviousToken( &root, ¤t, type, token ); + Tag* t = parse( expression, ++len, XTRightParenthesis ); + if( current ) + { +// printf( "added %s to %s\n", t->xml().c_str(), current->xml().c_str() ); + t->addAttribute( "argument", "true" ); + current->addChild( t ); + } + else + { + root = t; +// printf( "made %s new root\n", t->xml().c_str() ); + } + break; + } + case ')': + closePreviousToken( &root, ¤t, type, token ); + ++len; + return root; + case '\'': + if( type == XTLiteralInside ) + if( expression[len - 2] == '\\' ) + token[token.length() - 2] = c; + else + type = XTLiteral; + else + type = XTLiteralInside; + break; + case '@': + type = XTAttribute; + break; + case '.': + token += c; + if( token.size() == 1 ) + { + if( len < expression.length()-1 && expression[len+1] == '.' ) + { + type = XTDoubleDot; + ++len; + token += c; + } + else + { + type = XTDot; + } + } + break; + case '*': +// if( !root || ( current && ( current->tokenType() == XTSlash +// || current->tokenType() == XTDoubleSlash ) ) ) +// { +// addToken( &root, ¤t, type, "*" ); +// break; +// } + addToken( &root, ¤t, type, "*" ); + type = XTElement; + break; + case '+': + case '>': + case '<': + case '=': + case '|': + { + closePreviousToken( &root, ¤t, type, token ); + std::string s( 1, c ); + Tag::TokenType ttype = getType( s ); + if( ttype <= border ) + return root; + Tag* t = parse( expression, ++len, ttype ); + addOperator( &root, ¤t, t, ttype, s ); + if( border == XTRightBracket ) + return root; + break; + } + default: + token += c; + } + } + + if( !token.empty() ) + addToken( &root, ¤t, type, token ); + +// if( error != XPNoError ) +// printf( "error: %d\n", error ); + return root; + } + + void Tag::addToken( Tag **root, Tag **current, Tag::TokenType type, + const std::string& token ) const + { + Tag* t = new Tag( token ); + if( t->isNumber() && !t->children().size() ) + type = XTInteger; + t->addAttribute( TYPE, type ); + + if( *root ) + { +// printf( "new current %s, type: %d\n", token.c_str(), type ); + (*current)->addChild( t ); + *current = t; + } + else + { +// printf( "new root %s, type: %d\n", token.c_str(), type ); + *current = *root = t; + } + } + + void Tag::addOperator( Tag** root, Tag** current, Tag* arg, + Tag::TokenType type, const std::string& token ) const + { + Tag* t = new Tag( token ); + t->addAttribute( TYPE, type ); +// printf( "new operator: %s (arg1: %s, arg2: %s)\n", t->name().c_str(), (*root)->xml().c_str(), +// arg->xml().c_str() ); + t->addAttribute( "operator", "true" ); + t->addChild( *root ); + t->addChild( arg ); + *current = *root = t; + } + + bool Tag::addPredicate( Tag **root, Tag **current, Tag* token ) const + { + if( !*root || !*current ) + return false; + + if( ( token->isNumber() && !token->children().size() ) || token->name() == "+" ) + { +// printf( "found Index %s, full: %s\n", token->name().c_str(), token->xml().c_str() ); + if( !token->hasAttribute( "operator", "true" ) ) + { + token->addAttribute( TYPE, XTInteger ); + } + if( *root == *current ) + { + *root = token; +// printf( "made Index new root\n" ); + } + else + { + (*root)->removeChild( *current ); + (*root)->addChild( token ); +// printf( "added Index somewhere between root and current\n" ); + } + token->addChild( *current ); +// printf( "added Index %s, full: %s\n", token->name().c_str(), token->xml().c_str() ); + } + else + { + token->addAttribute( "predicate", "true" ); + (*current)->addChild( token ); + } + + return true; + } + + Tag::TokenType Tag::getType( const std::string& c ) + { + if( c == "|" ) + return XTUnion; + if( c == "<" ) + return XTOperatorLt; + if( c == ">" ) + return XTOperatorGt; + if( c == "*" ) + return XTOperatorMul; + if( c == "+" ) + return XTOperatorPlus; + if( c == "=" ) + return XTOperatorEq; + + return XTNone; + } + + bool Tag::isWhitespace( const char c ) + { + return ( c == 0x09 || c == 0x0a || c == 0x0d || c == 0x20 ); + } + + bool Tag::isNumber() const + { + if( m_name.empty() ) + return false; + + std::string::size_type l = m_name.length(); + std::string::size_type i = 0; + while( i < l && isdigit( m_name[i] ) ) + ++i; + return i == l; + } + + void Tag::add( ConstTagList& one, const ConstTagList& two ) + { + ConstTagList::const_iterator it = two.begin(); + for( ; it != two.end(); ++it ) + if( std::find( one.begin(), one.end(), (*it) ) == one.end() ) + one.push_back( (*it) ); + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tag.h b/smack/smack/src/main/cpp/gloox/src/tag.h new file mode 100644 index 00000000..d53d1d34 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tag.h @@ -0,0 +1,710 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef TAG_H__ +#define TAG_H__ + +#include "gloox.h" + +#include +#include +#include + +namespace gloox +{ + + class Tag; + + /** + * A list of Tags. + */ + typedef std::list TagList; + + /** + * A list of const Tags. + */ + typedef std::list ConstTagList; + + /** + * @brief This is an abstraction of an XML element. + * + * @note Use setXmlns() to set namespaces and namespace prefixes. + * + * @author Jakob Schröter + * @since 0.4 + */ + class GLOOX_API Tag + { + + friend class Parser; + + public: + + /** + * An XML element's attribute. + * + * @author Jakob Schröter + * @since 1.0 + */ + class GLOOX_API Attribute + { + + friend class Tag; + + public: + /** + * Creates a new Attribute from @c name, @c value and optional @c xmlns and attaches + * it to the given Tag. + * + * In the future: If @c xmlns is not empty, and if it is different from the Tag's + * default namespace, an appropriate and unique namespace declaration (prefix) will + * be added to the Tag and the attribute will be prefixed accordingly. + * @param parent The Tag to attach the Attribute to. + * @param name The attribute's name. Invalid (non-UTF-8) input will be ignored. + * @param value The attribute's value. Invalid (non-UTF-8) input will be ignored. + * @param xmlns The attribute's namespace. Invalid (non-UTF-8) input will be ignored. + */ + Attribute( Tag* parent, const std::string& name, const std::string& value, + const std::string& xmlns = EmptyString ); + + /** + * Creates a new Attribute from @c name, @c value and optional @c xmlns. + * @param name The attribute's name. Invalid (non-UTF-8) input will be ignored. + * @param value The attribute's value. Invalid (non-UTF-8) input will be ignored. + * @param xmlns The attribute's namespace. Invalid (non-UTF-8) input will be ignored. + */ + Attribute( const std::string& name, const std::string& value, + const std::string& xmlns = EmptyString ); + + /** + * Copy constructor. + * @param attr The Attribute to copy. + */ + Attribute( const Attribute& attr ); + + /** + * Destructor. + */ + virtual ~Attribute() {} + + /** + * Returns the attribute's name. + * @return The attribute's name. + */ + const std::string& name() const { return m_name; } + + /** + * Returns the attribute's value. + * @return The attribute's value. + */ + const std::string& value() const { return m_value; } + + /** + * Sets the attribute's value. + * @param value The new value. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + */ + bool setValue( const std::string& value ); + + /** + * Returns the attribute's namespace. + * @return The attribute's namespace. + */ + const std::string& xmlns() const; + + /** + * Sets the attribute's namespace. + * @param xmlns The new namespace. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + */ + bool setXmlns( const std::string& xmlns ); + + /** + * Sets the attribute's namespace prefix. + * @param prefix The new namespace prefix. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + */ + bool setPrefix( const std::string& prefix ); + + /** + * Returns the attribute's namespace prefix. + * @return The namespace prefix. + */ + const std::string& prefix() const; + + /** + * Returns a string representation of the attribute. + * @return A string representation. + */ + const std::string xml() const; + + /** + * Checks two Attributes for equality. + * @param right The Attribute to check against the current Attribute. + */ + bool operator==( const Attribute &right ) const + { return m_name == right.m_name && m_value == right.m_value && m_xmlns == right.m_xmlns; } + + /** + * Checks two Attributes for inequality. + * @param right The Attribute to check against the current Attribute. + */ + bool operator!=( const Attribute &right ) const + { return !( *this == right ); } + + /** + * Returns @b true if the Attribute is valid, @b false otherwise. + */ + operator bool() const { return !m_name.empty(); } + + private: + void init( const std::string& name, const std::string& value, + const std::string& xmlns ); + Tag* m_parent; + std::string m_name; + std::string m_value; + std::string m_xmlns; + std::string m_prefix; + + }; + + /** + * A list of XML element attributes. + */ + typedef std::list AttributeList; + + /** + * Creates a new tag with a given name (and XML character data, if given). + * @param name The name of the element. + * @param cdata The XML character data of the element. + */ + Tag( const std::string& name, const std::string& cdata = EmptyString ); + + /** + * Creates a new tag as a child tag of the given parent, with a given name (and + * XML character data, if given). + * @param parent The parent tag. + * @param name The name of the element. + * @param cdata The XML character data of the element. + */ + Tag( Tag* parent, const std::string& name, const std::string& cdata = EmptyString ); + + /** + * Creates a new tag with a given name and an attribute. + * @param name The name of the element. + * @param attrib The attribute name. + * @param value The attribute value. + */ + Tag( const std::string& name, const std::string& attrib, const std::string& value ); + + /** + * Creates a new tag as a child tag of the given parent, with a given name and + * an attribute. + * @param parent The parent tag. + * @param name The name of the element. + * @param attrib The attribute name. + * @param value The attribute value. + */ + Tag( Tag* parent, const std::string& name, const std::string& attrib, const std::string& value ); + + /** + * Virtual destructor. + */ + virtual ~Tag(); + + /** + * This function can be used to retrieve the complete XML of a tag as a string. + * It includes all the attributes, child nodes and character data. + * @return The complete XML. + */ + const std::string xml() const; + + /** + * Sets the Tag's namespace prefix. + * @param prefix The namespace prefix. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + * @since 1.0 + */ + bool setPrefix( const std::string& prefix ); + + /** + * Returns the namespace prefix for this Tag, if any. + * @return The namespace prefix. + * @since 1.0 + */ + const std::string& prefix() const { return m_prefix; } + + /** + * Returns the namespace prefix for the given namespace. + * @return The namespace prefix for the given namespace. + * @since 1.0 + */ + const std::string& prefix( const std::string& xmlns ) const; + + /* * + * Adds an XML namespace declaration to the Tag. If @b def is false, a unique prefix will + * be created, else the default namespace is set (no prefix). + * @param xmlns The namespace value. + * @param def If @b true, this sets the default namespace; if @b false, a unique namespace + * prefix will be created (unless one already exists for the namespace) and used for + * all subsequent references to the same namespace. + * @since 1.0 + */ +// const std::string addXmlns( const std::string& xmlns, bool def ); + + /** + * Sets an XML namespace with a given prefix, or the default namespace if @c prefix + * is empty. + * @param xmlns The namespace value. + * @param prefix An optional namespace prefix. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + * @since 1.0 + */ + bool setXmlns( const std::string& xmlns, const std::string& prefix = EmptyString ); + + /** + * Returns the namespace for this element. + * Namespace declarations in parent tags as well as prefixes will be taken into account. + * @return The namespace for this element. + * @since 1.0 + */ + const std::string& xmlns() const; + + /** + * Returns the namespace for the given prefix, or the default namespace if + * @c prefix is empty. Namespace declarations in parent tags will be taken into account. + * Consider the following XML: + * @code + * <foo:bar xmlns:foo='foobar'/> + * @endcode + * <bar/> is in the @c foobar namespace, having a prefix of @b foo. A call to prefix() + * will return 'foo'. A call to xmlns( "foo" ) or xmlns( prefix() ) will return 'foobar'. + * A call to xmlns() will also return 'foobar' (it is a shortcut to + * xmlns( prefix() ). + * @param prefix The namespace prefix to look up, or an empty string to fetch the + * default namespace. + * @return The namespace for the given prefix, or the empty string if no such prefix exists. + * The default namespace if an empty prefix is given. + * @since 1.0 + */ + const std::string& xmlns( const std::string& prefix ) const; + + /** + * Use this function to add a new attribute to the tag. The Tag will become the owner of the + * Attribute and take care of deletion. If an Attribute with the same name already exists, + * it will be replaced by the new one. + * @param attr A pointer to the attribute to add. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + * @since 1.0 + * @note Do not use this function to set XML namespaces, use setXmlns() instead. + */ + bool addAttribute( Attribute* attr ); + + /** + * Use this function to add a new attribute to the tag. + * @param name The name of the attribute. + * @param value The value of the attribute. + * @note Do not use this function to set XML namespaces, use setXmlns() instead. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + */ + bool addAttribute( const std::string& name, const std::string& value ); + + /** + * Use this function to add a new attribute to the tag. The value is an @c int here. + * @param name The name of the attribute. + * @param value The value of the attribute. + * @note Do not use this function to set XML namespaces, use setXmlns() instead. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + * @since 0.8 + */ + bool addAttribute( const std::string& name, int value ); + + /** + * Use this function to add a new attribute to the tag. The value is a @c long here. + * @param name The name of the attribute. + * @param value The value of the attribute. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + * @note Do not use this function to set XML namespaces, use setXmlns() instead. + * @since 0.9 + */ + bool addAttribute( const std::string& name, long value ); + + /** + * Sets the given attributes. Any existing attributes are lost. + * @param attributes The attributes to set. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + * @note Do not use this function to set XML namespaces, use setXmlns() instead. + * @since 0.9 + */ + void setAttributes( const AttributeList& attributes ); + + /** + * Use this function to add a child node to the tag. The Tag will be owned by Tag. + * @param child The node to be inserted. + */ + void addChild( Tag* child ); + + /** + * Use this function to add a copy of the given element to the tag. + * @param child The node to be inserted. + * @since 0.9 + */ + void addChildCopy( const Tag* child ); + + /** + * Sets the XML character data for this Tag. + * @param cdata The new cdata. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + */ + bool setCData( const std::string& cdata ); + + /** + * Adds the string to the existing XML character data for this Tag. + * @param cdata The additional cdata. + * @return @b True if the input is valid UTF-8, @b false otherwise. Invalid + * input will be ignored. + */ + bool addCData( const std::string& cdata ); + + /** + * Use this function to retrieve the name of an element. + * @return The name of the tag. + */ + const std::string& name() const { return m_name; } + + /** + * Use this function to retrieve the XML character data of an element. + * @return The cdata the element contains. + */ + const std::string cdata() const; + + /** + * Use this function to fetch a const list of attributes. + * @return A constant reference to the list of attributes. + */ + const AttributeList& attributes() const; + + /** + * Use this function to fetch a const list of child elements. + * @return A constant reference to the list of child elements. + */ + const TagList& children() const; + + /** + * This function can be used to retrieve the value of a Tag's attribute. + * @param name The name of the attribute to look for. + * @return The value of the attribute if found, an empty string otherwise. + */ + const std::string& findAttribute( const std::string& name ) const; + + /** + * Checks whether the tag has a attribute with given name and optional value. + * @param name The name of the attribute to check for. + * @param value The value of the attribute to check for. + * @return Whether the attribute exists (optionally with the given value). + */ + bool hasAttribute( const std::string& name, const std::string& value = EmptyString ) const; + + /** + * This function finds and returns the @b first element within the child elements of the current tag + * that has a matching tag name. + * @param name The name of the element to search for. + * @return The found Tag, or 0. + */ + Tag* findChild( const std::string& name ) const; + + /** + * This function finds and returns the @b first element within the child elements of the current tag, + * that has a certain name, and a certain attribute with a certain value. + * @param name The name of the element to search for. + * @param attr The name of the attribute of the child element. + * @param value The value of the attribute of the child element. + * @return The found Tag, or 0. + */ + Tag* findChild( const std::string& name, const std::string& attr, + const std::string& value = EmptyString ) const; + + /** + * This function checks whether the Tag has a child element with a given name, and optionally + * this child element is checked for having a given attribute with an optional value. + * @param name The name of the child element. + * @param attr The name of the attribute of the child element. + * @param value The value of the attribute of the child element. + * @return @b True if the given child element exists, @b false otherwise. + */ + bool hasChild( const std::string& name, const std::string& attr = EmptyString, + const std::string& value = EmptyString ) const; + + /** + * This function checks whether the Tag has a child element which posesses a given attribute + * with an optional value. The name of the child element does not matter. + * @param attr The name of the attribute of the child element. + * @param value The value of the attribute of the child element. + * @return The child if found, 0 otherwise. + */ + Tag* findChildWithAttrib( const std::string& attr, const std::string& value = EmptyString ) const; + + /** + * This function checks whether the Tag has a child element which posesses a given attribute + * with an optional value. The name of the child element does not matter. + * @param attr The name of the attribute of the child element. + * @param value The value of the attribute of the child element. + * @return @b True if any such child element exists, @b false otherwise. + */ + inline bool hasChildWithAttrib( const std::string& attr, + const std::string& value = EmptyString ) const + { return findChildWithAttrib( attr, value ) ? true : false; } + + /** + * Returns a list of child tags of the current tag with the given name. + * @param name The name of the tags to look for. + * @param xmlns An optional namespace to check for. + * @return A list of tags with the given name. + * @note The tags are still linked to the current Tag and should not be deleted. + * @since 0.9 + */ + TagList findChildren( const std::string& name, const std::string& xmlns = EmptyString ) const; + + /** + * Removes and deletes all child tags that have the given name and are, optionally, + * within the given namespace. + * @param name The name of the tag(s) to remove from the list of child tags. + * @param xmlns An optional namespace to check for. + */ + void removeChild( const std::string& name, const std::string& xmlns = EmptyString ); + + /** + * Removes the given Tag from the list of child Tags. + * @param tag The Tag to remove from the list of child Tags. + * @note The Tag @p tag is not deleted. + */ + void removeChild( Tag* tag ); + + /** + * Removes the attribute with the given name and optional value from this Tag. + * @param attr The attribute's name. + * @param value The attribute's optional value. + * @param xmlns An optional namespace to check for. + */ + void removeAttribute( const std::string& attr, const std::string& value = EmptyString, + const std::string& xmlns = EmptyString ); + + /** + * This function checks whether a child element with given name exists and has + * XML character data that equals the given cdata string. + * @param name The name of the child element. + * @param cdata The character data that has to exist in the child element. + * @return @b True if a child element with given cdata exists, @b false otherwise. + */ + bool hasChildWithCData( const std::string& name, const std::string& cdata ) const; + + /** + * Returns the tag's parent Tag. + * @return The Tag above the current Tag. May be @b 0. + */ + Tag* parent() const { return m_parent; } + + /** + * This function creates a deep copy of this Tag. + * @return An independent copy of the Tag. + * @since 0.7 + */ + Tag* clone() const; + + /** + * Evaluates the given XPath expression and returns the result Tag's character data, if any. + * If more than one Tag match, only the first one's character data is returned. + * @note Currently, XPath support is somewhat limited. However, it should be useable + * for basic expressions. For now, see src/tests/xpath/xpath_test.cpp for supported + * expressions. + * @param expression An XPath expression to evaluate. + * @return A matched Tag's character data, or the empty string. + * @since 1.0 + */ + const std::string findCData( const std::string& expression ) const; + + /** + * Evaluates the given XPath expression and returns the result Tag. If more than one + * Tag match, only the first one is returned. + * @note Currently, XPath support is somewhat limited. However, it should be useable + * for basic expressions. For now, see src/tests/xpath/xpath_test.cpp for supported + * expressions. + * @param expression An XPath expression to evaluate. + * @return A matched Tag, or 0. + * @since 0.9 + */ + const Tag* findTag( const std::string& expression ) const; + + /** + * Evaluates the given XPath expression and returns the matched Tags. + * @note Currently, XPath support is somewhat limited. However, it should be useable + * for basic expressions. For now, see src/tests/xpath/xpath_test.cpp for supported + * expressions. + * @param expression An XPath expression to evaluate. + * @return A list of matched Tags, or an empty TagList. + * @since 0.9 + */ + ConstTagList findTagList( const std::string& expression ) const; + + /** + * Checks two Tags for equality. Order of attributes and child tags does matter. + * @param right The Tag to check against the current Tag. + * @since 0.9 + */ + bool operator==( const Tag &right ) const; + + /** + * Checks two Tags for inequality. Order of attributes and child tags does matter. + * @param right The Tag to check against the current Tag. + * @since 0.9 + */ + bool operator!=( const Tag &right ) const { return !( *this == right ); } + + /** + * Returns @b true if the Tag is valid, @b false otherwise. + */ + operator bool() const { return !m_name.empty(); } + + private: + /** + * Creates a new Tag by stealing the original Tag's body (elements, attributes). The + * original Tag is pretty much useless afterwards. + * @param tag The Tag to rip off. + */ + Tag( Tag* tag ); + + /** + * XPath error conditions. + */ + enum XPathError + { + XPNoError, /**< No error occured. */ + XPExpectedLeftOperand, /**< Operator expected a left-hand operand. */ + XPUnexpectedToken + }; + + enum NodeType + { + TypeTag, /**< The Node is a Tag. */ + TypeString /**< The Node is a std::string. */ + }; + + struct Node + { + Node( NodeType _type, Tag* _tag ) : type( _type ), tag( _tag ) {} + Node( NodeType _type, std::string* _str ) : type( _type ), str( _str ) {} + ~Node() {} + + NodeType type; + union + { + Tag* tag; + std::string* str; + }; + }; + + typedef std::list NodeList; + + Tag* m_parent; + TagList* m_children; + StringPList* m_cdata; + AttributeList* m_attribs; + NodeList* m_nodes; + std::string m_name; + std::string m_xmlns; + StringMap* m_xmlnss; + std::string m_prefix; + + enum TokenType + { + XTNone, + XTLeftParenthesis, + XTRightParenthesis, + XTNodeSet, + XTInteger, + XTElement, + XTLeftBracket, + XTRightBracket, + XTFunction, + XTAsterisk, + XTAttribute, + XTLiteralInside, + XTLiteral, + XTDot, + XTDoubleDot, + XTOperatorOr, + XTOperatorAnd, + XTOperatorEq, + XTOperatorNe, + XTOperatorGt, + XTOperatorLt, + XTOperatorLtEq, + XTOperatorGtEq, + XTOperatorPlus, + XTOperatorMinus, + XTOperatorMul, + XTOperatorDiv, + XTOperatorMod, + XTUnion, + XTSlash, + XTDoubleSlash + }; + + /** + * Sets a list of namespaces. + * @param xmlnss The list of namespaces. + * @since 1.0 + */ + void setXmlns( StringMap* xmlns ) + { delete m_xmlnss; m_xmlnss = xmlns; } + + Tag* parse( const std::string& expression, unsigned& len, TokenType border = XTNone ) const; + + void closePreviousToken( Tag**, Tag**, TokenType&, std::string& ) const; + void addToken( Tag **root, Tag **current, TokenType type, const std::string& token ) const; + void addOperator( Tag **root, Tag **current, Tag* arg, TokenType type, + const std::string& token ) const; + bool addPredicate( Tag **root, Tag **current, Tag* token ) const; + + TagList findChildren( const TagList& list, const std::string& name, + const std::string& xmlns = EmptyString ) const; + ConstTagList evaluateTagList( Tag* token ) const; + ConstTagList evaluateUnion( Tag* token ) const; + ConstTagList allDescendants() const; + + static TokenType getType( const std::string& c ); + + static bool isWhitespace( const char c ); + bool isNumber() const; + + bool evaluateBoolean( Tag* token ) const; + bool evaluatePredicate( Tag* token ) const { return evaluateBoolean( token ); } + bool evaluateEquals( Tag* token ) const; + + static void add( ConstTagList& one, const ConstTagList& two ); + }; + +} + +#endif // TAG_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/taghandler.h b/smack/smack/src/main/cpp/gloox/src/taghandler.h new file mode 100644 index 00000000..ab57f5e6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/taghandler.h @@ -0,0 +1,51 @@ +/* + Copyright (c) 2005-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + + +#ifndef TAGHANDLER_H__ +#define TAGHANDLER_H__ + +#include "tag.h" + +namespace gloox +{ + + /** + * @brief A virtual interface which can be reimplemented to receive non-XMPP Core stanzas. + * + * Derived classes can be registered as TagHandlers with the ClientBase. + * A TagHandler can handle arbitrary elements not defined by RFC 3920, XMPP Core. + * + * It can also be used to handle Tags emitted by Parser. + * + * @author Jakob Schröter + */ + class GLOOX_API TagHandler + { + public: + /** + * Virtual Destructor. + */ + virtual ~TagHandler() {} + + /** + * This function is called when a registered XML element arrives. + * As with every handler in gloox, the Tag is going to be deleted after this function returned. + * If you need a copy afterwards, create it using Tag::clone(). + * @param tag The complete Tag. + */ + virtual void handleTag( Tag* tag ) = 0; + }; + +} + +#endif // TAGHANDLER_H__ diff --git a/smack/smack/src/main/cpp/gloox/src/tests/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/Makefile.am new file mode 100644 index 00000000..6c38a4f5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/Makefile.am @@ -0,0 +1,52 @@ +## +## Process this file with automake to produce Makefile.in +## + +SUBDIRS = adhoc adhoccommand adhoccommandnote amprule amp base64 \ + capabilities carbons chatstatefilter client clientbase connectionbosh \ + dataform dataformfield \ + dataformreported dataformitem delayeddelivery discoinfo discoitems disco \ + error \ + featureneg flexoffline flexofflineoffline forward \ + gpgencrypted gpgsigned \ + inbandbytestreamibb inbandbytestream iodata iq \ + jid jingleiceudp jinglesession jinglesessionjingle jinglesessionmanager \ + lastactivity lastactivityquery \ + md5 message messageeventfilter \ + mucroommuc mucroommucadmin mucroommucowner mucroommucuser \ + nickname nonsaslauthquery nonsaslauth \ + oob \ + parser prep presence privacymanager privacymanagerquery \ + privatexml \ + pubsubmanagerpubsub pubsubmanager pubsubevent\ + receipt \ + registrationquery registration \ + rostermanagerquery rostermanager \ + searchquery search \ + sha shim \ + simanager simanagersi stanzaextensionfactory subscription \ + tag tlsgnutls \ + uniquemucroomunique \ + vcard vcardupdate \ + xpath \ + zlib util + +check: test + +test: ${SUBDIRS} + @for i in $?; do \ + ${MAKE} -C $$i all || exit; \ + done; + @for i in $?; do \ + $$i/$${i}_test; \ + done; + +leaktest: leakcheck + +leakcheck: ${SUBDIRS} + @for i in $?; do \ + ${MAKE} -C $$i all || exit; \ + done; + @for i in $?; do \ + valgrind -q --leak-check=full --show-reachable=yes $$i/$${i}_test; \ + done; diff --git a/smack/smack/src/main/cpp/gloox/src/tests/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/Makefile.in new file mode 100644 index 00000000..bb27a496 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/Makefile.in @@ -0,0 +1,644 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src/tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-dvi-recursive install-exec-recursive \ + install-html-recursive install-info-recursive \ + install-pdf-recursive install-ps-recursive install-recursive \ + installcheck-recursive installdirs-recursive pdf-recursive \ + ps-recursive uninstall-recursive +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ + distclean-recursive maintainer-clean-recursive +AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ + $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ + distdir +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +am__relativize = \ + dir0=`pwd`; \ + sed_first='s,^\([^/]*\)/.*$$,\1,'; \ + sed_rest='s,^[^/]*/*,,'; \ + sed_last='s,^.*/\([^/]*\)$$,\1,'; \ + sed_butlast='s,/*[^/]*$$,,'; \ + while test -n "$$dir1"; do \ + first=`echo "$$dir1" | sed -e "$$sed_first"`; \ + if test "$$first" != "."; then \ + if test "$$first" = ".."; then \ + dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ + dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ + else \ + first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ + if test "$$first2" = "$$first"; then \ + dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ + else \ + dir2="../$$dir2"; \ + fi; \ + dir0="$$dir0"/"$$first"; \ + fi; \ + fi; \ + dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ + done; \ + reldir="$$dir2" +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +SUBDIRS = adhoc adhoccommand adhoccommandnote amprule amp base64 \ + capabilities carbons chatstatefilter client clientbase connectionbosh \ + dataform dataformfield \ + dataformreported dataformitem delayeddelivery discoinfo discoitems disco \ + error \ + featureneg flexoffline flexofflineoffline forward \ + gpgencrypted gpgsigned \ + inbandbytestreamibb inbandbytestream iodata iq \ + jid jingleiceudp jinglesession jinglesessionjingle jinglesessionmanager \ + lastactivity lastactivityquery \ + md5 message messageeventfilter \ + mucroommuc mucroommucadmin mucroommucowner mucroommucuser \ + nickname nonsaslauthquery nonsaslauth \ + oob \ + parser prep presence privacymanager privacymanagerquery \ + privatexml \ + pubsubmanagerpubsub pubsubmanager pubsubevent\ + receipt \ + registrationquery registration \ + rostermanagerquery rostermanager \ + searchquery search \ + sha shim \ + simanager simanagersi stanzaextensionfactory subscription \ + tag tlsgnutls \ + uniquemucroomunique \ + vcard vcardupdate \ + xpath \ + zlib util + +all: all-recursive + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +$(RECURSIVE_CLEAN_TARGETS): + @fail= failcom='exit 1'; \ + for f in x $$MAKEFLAGS; do \ + case $$f in \ + *=* | --[!k]*);; \ + *k*) failcom='fail=yes';; \ + esac; \ + done; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || eval $$failcom; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + $(am__make_dryrun) \ + || test -d "$(distdir)/$$subdir" \ + || $(MKDIR_P) "$(distdir)/$$subdir" \ + || exit 1; \ + dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ + $(am__relativize); \ + new_distdir=$$reldir; \ + dir1=$$subdir; dir2="$(top_distdir)"; \ + $(am__relativize); \ + new_top_distdir=$$reldir; \ + echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ + echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ + ($(am__cd) $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$$new_top_distdir" \ + distdir="$$new_distdir" \ + am__remove_distdir=: \ + am__skip_length_check=: \ + am__skip_mode_fix=: \ + distdir) \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-recursive +all-am: Makefile +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-recursive + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +html-am: + +info: info-recursive + +info-am: + +install-data-am: + +install-dvi: install-dvi-recursive + +install-dvi-am: + +install-exec-am: + +install-html: install-html-recursive + +install-html-am: + +install-info: install-info-recursive + +install-info-am: + +install-man: + +install-pdf: install-pdf-recursive + +install-pdf-am: + +install-ps: install-ps-recursive + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: + +.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \ + install-am install-strip tags-recursive + +.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ + all all-am check check-am clean clean-generic clean-libtool \ + ctags ctags-recursive distclean distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ + uninstall uninstall-am + + +check: test + +test: ${SUBDIRS} + @for i in $?; do \ + ${MAKE} -C $$i all || exit; \ + done; + @for i in $?; do \ + $$i/$${i}_test; \ + done; + +leaktest: leakcheck + +leakcheck: ${SUBDIRS} + @for i in $?; do \ + ${MAKE} -C $$i all || exit; \ + done; + @for i in $?; do \ + valgrind -q --leak-check=full --show-reachable=yes $$i/$${i}_test; \ + done; + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.am new file mode 100644 index 00000000..72794e5e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = adhoc_test + +adhoc_test_SOURCES = adhoc_test.cpp +adhoc_test_LDADD = ../../tag.o ../../stanza.o ../../gloox.o ../../iq.o ../../util.o \ + ../../error.o ../../jid.o ../../prep.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../softwareversion.o ../../mutex.o ../../iodata.o +adhoc_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.in new file mode 100644 index 00000000..c996659a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoc/Makefile.in @@ -0,0 +1,526 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = adhoc_test$(EXEEXT) +subdir = src/tests/adhoc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_adhoc_test_OBJECTS = adhoc_test.$(OBJEXT) +adhoc_test_OBJECTS = $(am_adhoc_test_OBJECTS) +adhoc_test_DEPENDENCIES = ../../tag.o ../../stanza.o ../../gloox.o \ + ../../iq.o ../../util.o ../../error.o ../../jid.o ../../prep.o \ + ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../softwareversion.o ../../mutex.o \ + ../../iodata.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(adhoc_test_SOURCES) +DIST_SOURCES = $(adhoc_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +adhoc_test_SOURCES = adhoc_test.cpp +adhoc_test_LDADD = ../../tag.o ../../stanza.o ../../gloox.o ../../iq.o ../../util.o \ + ../../error.o ../../jid.o ../../prep.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../softwareversion.o ../../mutex.o ../../iodata.o + +adhoc_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/adhoc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/adhoc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +adhoc_test$(EXEEXT): $(adhoc_test_OBJECTS) $(adhoc_test_DEPENDENCIES) $(EXTRA_adhoc_test_DEPENDENCIES) + @rm -f adhoc_test$(EXEEXT) + $(CXXLINK) $(adhoc_test_OBJECTS) $(adhoc_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adhoc_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoc/adhoc_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/adhoc/adhoc_test.cpp new file mode 100644 index 00000000..b9b19c67 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoc/adhoc_test.cpp @@ -0,0 +1,236 @@ +/* + Copyright (c) 2004-2015 by Jakob Schröter + This file is part of the gloox library. http://camaya.net/gloox + + This software is distributed under a license. The full license + agreement can be found in the file LICENSE in this distribution. + This software may not be copied, modified, sold or distributed + other than expressed in the named license agreement. + + This software is distributed without any warranty. +*/ + +#define GLOOX_TESTS +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../jid.h" +#include "../../mutex.h" +#include "../../mutexguard.h" + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() : m_disco( 0 ) {} + virtual ~ClientBase() {} + Disco* disco() { return m_disco; } + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ih ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + protected: + Disco* m_disco; + private: + JID m_jid; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::removeIDHandler( IqHandler* ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define DISCO_TEST +#define DISCO_INFO_TEST +#define ADHOC_TEST +#include "../../disco.h" +#include "../../disco.cpp" +#include "../../adhoc.h" +#include "../../adhoc.cpp" +#include "../../adhochandler.h" +#include "../../adhoccommandprovider.h" +class AdhocTest : public ClientBase, public AdhocCommandProvider, public AdhocHandler +{ + public: + AdhocTest() : m_result( false ) { m_disco = new Disco( this ); } + ~AdhocTest() { delete m_disco; } + void setTest( int test ) { m_test = test; } + void setAdhoc( Adhoc* adhoc ) { m_adhoc = adhoc; } + virtual void send( IQ& iq ); + virtual void send( const IQ& iq, IqHandler*, int ); + virtual void trackID( IqHandler *ih, const std::string& id, int context ); + virtual void handleAdhocCommand( const JID& /*from*/, const Adhoc::Command& command, + const std::string& /*sess*/ ) + { + if( m_test == 5 && command.node() == "foocmd" ) + m_result = true; + } + virtual void handleAdhocSupport( const JID& /*remote*/, bool support, int /*context*/ ) + { + if( m_test == 1 || m_test == 2 ) + m_result = support; + } + virtual void handleAdhocCommands( const JID& /*remote*/, const StringMap& commands, int /*context*/ ) + { + if( m_test == 3 && commands.find( "node" ) != commands.end() + && (*(commands.find( "node" ))).second == "name" ) + m_result = true; + } + virtual void handleAdhocError( const JID& /*remote*/, const Error* /*error*/, int /*context*/ ) {} + virtual void handleAdhocExecutionResult( const JID& /*remote*/, const Adhoc::Command& /*command*/, int /*context*/ ) + { + if( m_test == 4 ) + m_result = true; + } + bool checkResult() { bool t = m_result; m_result = false; return t; } + private: + Adhoc* m_adhoc; + int m_test; + bool m_result; +}; + +void AdhocTest::send( IQ& /*iq*/ ) +{ +} + +void AdhocTest::send( const IQ& iq, IqHandler*, int ctx ) +{ + switch( m_test ) + { + case 1: // getSupport() + { + Disco::Info i; + i.m_features.push_back( XMLNS_ADHOC_COMMANDS ); + m_adhoc->handleDiscoInfo( g_jid, i, Adhoc::CheckAdhocSupport ); + break; + } + case 2: // getSupport() fails + { + Disco::Info i; + m_adhoc->handleDiscoInfo( g_jid, i, Adhoc::CheckAdhocSupport ); + break; + } + case 3: // getCommands() + { + Disco::ItemList il; + il.push_back( new Disco::Item( g_jid, "node", "name" ) ); + Disco::Items i; + i.setItems( il ); + m_adhoc->handleDiscoItems( g_jid, i, Adhoc::FetchAdhocCommands ); + break; + } + case 4: // execute single stage command + { + IQ re( IQ::Result, iq.from(), iq.id() ); + re.setFrom( g_jid ); + re.addExtension( new Adhoc::Command( "foocmd", "somesess", Adhoc::Command::Completed, 0 ) ); + m_adhoc->handleIqID( re, ctx ); + break; + } + } +} +void AdhocTest::trackID( IqHandler*, const std::string&, int ) {} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + AdhocTest* at = new AdhocTest(); + Adhoc* ah = new Adhoc( at ); + at->setAdhoc( ah ); + + + // ------- + name = "check support"; + at->setTest( 1 ); + ah->checkSupport( g_jid, at ); + if( !at->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "check support fails"; + at->setTest( 2 ); + ah->checkSupport( g_jid, at ); + if( at->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "get commands"; + at->setTest( 3 ); + ah->getCommands( g_jid, at ); + if( !at->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "execute command"; + at->setTest( 4 ); + Adhoc::Command* cmd = new Adhoc::Command( "foocmd", Adhoc::Command::Execute ); + ah->execute( g_jid, cmd, at ); + if( !at->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + ah->registerAdhocCommandProvider( at, "foocmd", "fooname" ); + + // ------- + { + name = "execute local command"; + at->setTest( 5 ); + IQ iq( IQ::Set, g_jid, at->getID() ); + iq.setFrom( g_jid ); + iq.addExtension( new Adhoc::Command( "foocmd", Adhoc::Command::Execute ) ); + ah->handleIq( iq ); + if( !at->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + delete ah; + delete at; + + + + if( fail == 0 ) + { + printf( "Adhoc: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Adhoc: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.am new file mode 100644 index 00000000..5bbfcc04 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.am @@ -0,0 +1,22 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = adhoccommand_test + +adhoccommand_test_SOURCES = adhoccommand_test.cpp +adhoccommand_test_LDADD = ../../adhoc.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o ../../iodata.o +adhoccommand_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.in new file mode 100644 index 00000000..c7d5721b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/Makefile.in @@ -0,0 +1,544 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = adhoccommand_test$(EXEEXT) +subdir = src/tests/adhoccommand +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_adhoccommand_test_OBJECTS = adhoccommand_test.$(OBJEXT) +adhoccommand_test_OBJECTS = $(am_adhoccommand_test_OBJECTS) +adhoccommand_test_DEPENDENCIES = ../../adhoc.o \ + ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o \ + ../../base64.o ../../md5.o ../../tlsgnutlsclient.o \ + ../../tlsopensslclient.o ../../tlsopensslbase.o \ + ../../tlsopensslserver.o ../../tlsschannel.o ../../logsink.o \ + ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o ../../iodata.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(adhoccommand_test_SOURCES) +DIST_SOURCES = $(adhoccommand_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +adhoccommand_test_SOURCES = adhoccommand_test.cpp +adhoccommand_test_LDADD = ../../adhoc.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o ../../iodata.o + +adhoccommand_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/adhoccommand/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/adhoccommand/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +adhoccommand_test$(EXEEXT): $(adhoccommand_test_OBJECTS) $(adhoccommand_test_DEPENDENCIES) $(EXTRA_adhoccommand_test_DEPENDENCIES) + @rm -f adhoccommand_test$(EXEEXT) + $(CXXLINK) $(adhoccommand_test_OBJECTS) $(adhoccommand_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adhoccommand_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/adhoccommand_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/adhoccommand_test.cpp new file mode 100644 index 00000000..c1f2d65f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommand/adhoccommand_test.cpp @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define ADHOC_COMMANDS_TEST +#include "../../adhoc.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + + // ------- + { + name = "execute specific command"; + Adhoc::Command ac( "somecmd", Adhoc::Command::Execute ); + t = ac.tag(); + if( t->xml() != "" + || ac.node() != "somecmd" || ac.action() != Adhoc::Command::Execute ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "execute specific command /w session"; + Adhoc::Command ac( "somecmd", "somesession", Adhoc::Command::Execute ); + t = ac.tag(); + if( t->xml() != "" + || ac.node() != "somecmd" || ac.sessionID() != "somesession" + || ac.action() != Adhoc::Command::Execute ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "Tag ctor"; + t = new Tag( "command" ); + t->setXmlns( XMLNS_ADHOC_COMMANDS ); + t->addAttribute( "node", "somecmd" ); + t->addAttribute( "sessionid", "somesession" ); + t->addAttribute( "action", "execute" ); + Tag* f = new Tag( t, "x" ); + f->setXmlns( XMLNS_X_DATA ); + Adhoc::Command ac( t ); + if( ac.node() != "somecmd" || ac.sessionID() != "somesession" + || ac.action() != Adhoc::Command::Execute || ac.form() == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + name = "Adhoc::Command/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new Adhoc::Command( "foo", Adhoc::Command::Execute) ); + Tag* f = new Tag( "iq" ); + new Tag( f, "command", "xmlns", XMLNS_ADHOC_COMMANDS ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const Adhoc::Command* se = iq.findExtension( ExtAdhocCommand ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + if( fail == 0 ) + { + printf( "Adhoc::Command: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Adhoc::Command: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.am new file mode 100644 index 00000000..39757b04 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.am @@ -0,0 +1,22 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = adhoccommandnote_test + +adhoccommandnote_test_SOURCES = adhoccommandnote_test.cpp +adhoccommandnote_test_LDADD = ../../adhoc.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o ../../iodata.o +adhoccommandnote_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.in new file mode 100644 index 00000000..5da74f8b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/Makefile.in @@ -0,0 +1,544 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = adhoccommandnote_test$(EXEEXT) +subdir = src/tests/adhoccommandnote +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_adhoccommandnote_test_OBJECTS = adhoccommandnote_test.$(OBJEXT) +adhoccommandnote_test_OBJECTS = $(am_adhoccommandnote_test_OBJECTS) +adhoccommandnote_test_DEPENDENCIES = ../../adhoc.o \ + ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o \ + ../../base64.o ../../md5.o ../../tlsgnutlsclient.o \ + ../../tlsopensslclient.o ../../tlsopensslbase.o \ + ../../tlsopensslserver.o ../../tlsschannel.o ../../logsink.o \ + ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o ../../iodata.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(adhoccommandnote_test_SOURCES) +DIST_SOURCES = $(adhoccommandnote_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +adhoccommandnote_test_SOURCES = adhoccommandnote_test.cpp +adhoccommandnote_test_LDADD = ../../adhoc.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o ../../iodata.o + +adhoccommandnote_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/adhoccommandnote/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/adhoccommandnote/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +adhoccommandnote_test$(EXEEXT): $(adhoccommandnote_test_OBJECTS) $(adhoccommandnote_test_DEPENDENCIES) $(EXTRA_adhoccommandnote_test_DEPENDENCIES) + @rm -f adhoccommandnote_test$(EXEEXT) + $(CXXLINK) $(adhoccommandnote_test_OBJECTS) $(adhoccommandnote_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adhoccommandnote_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/adhoccommandnote_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/adhoccommandnote_test.cpp new file mode 100644 index 00000000..1c2683dc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/adhoccommandnote/adhoccommandnote_test.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define ADHOC_COMMANDS_TEST +#include "../../adhoc.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag* t; + + + // ------- + { + name = "info note"; + Adhoc::Command::Note n( Adhoc::Command::Note::Info, "content" ); + t = n.tag(); + if( n.severity() != Adhoc::Command::Note::Info || n.content() != "content" + || t->xml() != "content" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "warning note"; + Adhoc::Command::Note n( Adhoc::Command::Note::Warning, "content" ); + t = n.tag(); + if( n.severity() != Adhoc::Command::Note::Warning || n.content() != "content" + || t->xml() != "content" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "error note"; + Adhoc::Command::Note n( Adhoc::Command::Note::Error, "content" ); + t = n.tag(); + if( n.severity() != Adhoc::Command::Note::Error || n.content() != "content" + || t->xml() != "content" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "error note"; + Adhoc::Command::Note n( Adhoc::Command::Note::Error, "content" ); + t = n.tag(); + if( n.severity() != Adhoc::Command::Note::Error || n.content() != "content" + || t->xml() != "content" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + + // ------- + { + name = "parse Tag"; + Tag* b = new Tag( "note", "foo" ); + b->addAttribute( "type", "info" ); + Adhoc::Command::Note n( b ); + t = n.tag(); + if( *t != *b ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete b; + b = 0; + } + + // ------- + { + name = "parse Tag w/o type"; + Tag* b = new Tag( "note", "foo" ); + b->addAttribute( "type", "info" ); + Adhoc::Command::Note n( b ); + t = n.tag(); + if( *t != *b ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete b; + b = 0; + } + + + + if( fail == 0 ) + { + printf( "Adhoc::Command::Note: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Adhoc::Command::Note: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.am new file mode 100644 index 00000000..94c4b21a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = amp_test + +amp_test_SOURCES = amp_test.cpp +amp_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../amp.o ../../mutex.o +amp_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.in new file mode 100644 index 00000000..0bf183aa --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/amp/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = amp_test$(EXEEXT) +subdir = src/tests/amp +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_amp_test_OBJECTS = amp_test.$(OBJEXT) +amp_test_OBJECTS = $(am_amp_test_OBJECTS) +amp_test_DEPENDENCIES = ../../tag.o ../../stanza.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../gloox.o ../../message.o \ + ../../util.o ../../error.o ../../jid.o ../../amp.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(amp_test_SOURCES) +DIST_SOURCES = $(amp_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +amp_test_SOURCES = amp_test.cpp +amp_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../amp.o ../../mutex.o + +amp_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/amp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/amp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +amp_test$(EXEEXT): $(amp_test_OBJECTS) $(amp_test_DEPENDENCIES) $(EXTRA_amp_test_DEPENDENCIES) + @rm -f amp_test$(EXEEXT) + $(CXXLINK) $(amp_test_OBJECTS) $(amp_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amp_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/amp/amp_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/amp/amp_test.cpp new file mode 100644 index 00000000..cdab892e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/amp/amp_test.cpp @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../amp.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + + // ------- + { + name = "empty "; + AMP a; + t = a.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "empty , per-hop = true"; + AMP a( true ); + t = a.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "one rule"; + AMP a; + a.addRule( new AMP::Rule( "foodate", AMP::ActionDrop ) ); + t = a.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "one rule, per-hop = true"; + AMP a( true ); + a.addRule( new AMP::Rule( "foodate", AMP::ActionDrop ) ); + t = a.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "2 rules, per-hop = true"; + AMP a( true ); + a.addRule( new AMP::Rule( "foodate", AMP::ActionDrop ) ); + a.addRule( new AMP::Rule( AMP::DeliverNone, AMP::ActionDrop ) ); + t = a.tag(); + if( !t || t->xml() != "" + "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "2 rules()"; + AMP a( true ); + a.addRule( new AMP::Rule( "foodate", AMP::ActionDrop ) ); + a.addRule( new AMP::Rule( AMP::DeliverNone, AMP::ActionDrop ) ); + if( a.rules().size() != 2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + } + + // ------- + { + name = "Tag ctor"; + Tag* q = new Tag( "amp" ); + q->setXmlns( XMLNS_AMP ); + q->addAttribute( "from", "foofrom" ); + q->addAttribute( "to", "footo" ); + q->addAttribute( "status", "notify" ); + q->addAttribute( "per-hop", "true" ); + Tag* r = new Tag( q, "rule" ); + r->addAttribute( "condition", "deliver" ); + r->addAttribute( "action", "error" ); + r->addAttribute( "value", "forward" ); + AMP a( q ); + t = a.tag(); + if( *t != *q ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + t = 0; + delete q; + q = 0; + } + + // ------- + name = "AMP/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new AMP() ); + Tag* f = new Tag( "message" ); + new Tag( f, "amp", "xmlns", XMLNS_AMP ); + Message msg( Message::Normal, JID() ); + sef.addExtensions( msg, f ); + const AMP* se = msg.findExtension( ExtAMP ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + if( fail == 0 ) + { + printf( "AMP: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "AMP: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.am new file mode 100644 index 00000000..1410bb46 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = amprule_test + +amprule_test_SOURCES = amprule_test.cpp +amprule_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../amp.o ../../mutex.o +amprule_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.in new file mode 100644 index 00000000..3777f08e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/amprule/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = amprule_test$(EXEEXT) +subdir = src/tests/amprule +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_amprule_test_OBJECTS = amprule_test.$(OBJEXT) +amprule_test_OBJECTS = $(am_amprule_test_OBJECTS) +amprule_test_DEPENDENCIES = ../../tag.o ../../stanza.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../gloox.o ../../message.o \ + ../../util.o ../../error.o ../../jid.o ../../amp.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(amprule_test_SOURCES) +DIST_SOURCES = $(amprule_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +amprule_test_SOURCES = amprule_test.cpp +amprule_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../amp.o ../../mutex.o + +amprule_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/amprule/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/amprule/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +amprule_test$(EXEEXT): $(amprule_test_OBJECTS) $(amprule_test_DEPENDENCIES) $(EXTRA_amprule_test_DEPENDENCIES) + @rm -f amprule_test$(EXEEXT) + $(CXXLINK) $(amprule_test_OBJECTS) $(amprule_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/amprule_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/amprule/amprule_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/amprule/amprule_test.cpp new file mode 100644 index 00000000..0df853c2 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/amprule/amprule_test.cpp @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../amp.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + + int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "create condition 'deliver/direct -- notify' rule"; + AMP::Rule r( AMP::DeliverDirect, AMP::ActionNotify ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "create condition 'deliver/gateway -- error' rule"; + AMP::Rule r( AMP::DeliverGateway, AMP::ActionError ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "create condition 'deliver/stored -- drop' rule"; + AMP::Rule r( AMP::DeliverStored, AMP::ActionDrop ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "create condition 'expire-at/foodate -- notify' rule"; + AMP::Rule r( "foodate", AMP::ActionNotify ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "create condition 'match-resource/exact -- alert' rule"; + AMP::Rule r( AMP::MatchResourceExact, AMP::ActionAlert ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "string ctor 1"; + AMP::Rule r( "deliver", "drop", "direct" ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "string ctor 2"; + AMP::Rule r( "expire-at", "notify", "foodate" ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "string ctor 3"; + AMP::Rule r( "match-resource", "alert", "other" ); + t = r.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + + + + if( fail == 0 ) + { + printf( "AMP::Rule: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "AMP::Rule: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.am new file mode 100644 index 00000000..06335dfc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -g3 -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = base64_test + +base64_test_SOURCES = base64_test.cpp +base64_test_LDADD = ../../base64.o +base64_test_CFLAGS = $(CPPFLAGS) + +noinst_HEADERS = diff --git a/smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.in new file mode 100644 index 00000000..bfaa31b7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/base64/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = base64_test$(EXEEXT) +subdir = src/tests/base64 +DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_base64_test_OBJECTS = base64_test.$(OBJEXT) +base64_test_OBJECTS = $(am_base64_test_OBJECTS) +base64_test_DEPENDENCIES = ../../base64.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(base64_test_SOURCES) +DIST_SOURCES = $(base64_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +HEADERS = $(noinst_HEADERS) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -g3 -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +base64_test_SOURCES = base64_test.cpp +base64_test_LDADD = ../../base64.o +base64_test_CFLAGS = $(CPPFLAGS) +noinst_HEADERS = +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/base64/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/base64/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +base64_test$(EXEEXT): $(base64_test_OBJECTS) $(base64_test_DEPENDENCIES) $(EXTRA_base64_test_DEPENDENCIES) + @rm -f base64_test$(EXEEXT) + $(CXXLINK) $(base64_test_OBJECTS) $(base64_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/base64_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) $(HEADERS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/base64/base64_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/base64/base64_test.cpp new file mode 100644 index 00000000..2a89d710 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/base64/base64_test.cpp @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../base64.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + std::string b; + std::string sample; + + + + // ------- + name = "empty string"; + sample = ""; + b = Base64::encode64( sample ); + if( sample != Base64::decode64( b ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + b = ""; + sample = ""; + + // ------- + name = "leviathan test"; + sample = "Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure."; + b = Base64::encode64( sample ); + if( sample != Base64::decode64( b ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), b.c_str() ); + } + b = ""; + sample = ""; + + + + + if( fail == 0 ) + { + printf( "Base64: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Base64: %d test(s) failed\n", fail ); + return 1; + } + + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.am new file mode 100644 index 00000000..6138243a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = capabilities_test + +capabilities_test_SOURCES = capabilities_test.cpp +capabilities_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../base64.o ../../util.o ../../sha.o \ + ../../jid.o ../../iq.o ../../error.o ../../softwareversion.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../mutex.o +capabilities_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.in new file mode 100644 index 00000000..859f7343 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/capabilities/Makefile.in @@ -0,0 +1,526 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = capabilities_test$(EXEEXT) +subdir = src/tests/capabilities +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_capabilities_test_OBJECTS = capabilities_test.$(OBJEXT) +capabilities_test_OBJECTS = $(am_capabilities_test_OBJECTS) +capabilities_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../base64.o ../../util.o ../../sha.o ../../jid.o ../../iq.o \ + ../../error.o ../../softwareversion.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(capabilities_test_SOURCES) +DIST_SOURCES = $(capabilities_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +capabilities_test_SOURCES = capabilities_test.cpp +capabilities_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../base64.o ../../util.o ../../sha.o \ + ../../jid.o ../../iq.o ../../error.o ../../softwareversion.o \ + ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../mutex.o + +capabilities_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/capabilities/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/capabilities/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +capabilities_test$(EXEEXT): $(capabilities_test_OBJECTS) $(capabilities_test_DEPENDENCIES) $(EXTRA_capabilities_test_DEPENDENCIES) + @rm -f capabilities_test$(EXEEXT) + $(CXXLINK) $(capabilities_test_OBJECTS) $(capabilities_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/capabilities_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/capabilities/capabilities_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/capabilities/capabilities_test.cpp new file mode 100644 index 00000000..57a2ea1d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/capabilities/capabilities_test.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define GLOOX_TESTS +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../jid.h" + +#include +#include +#include // [s]print[f] + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() : m_disco( 0 ) {} + virtual ~ClientBase() {} + Disco* disco() { return m_disco; } + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) {}; + virtual void send( const IQ&, IqHandler*, int ) {}; + virtual void trackID( IqHandler *, const std::string&, int ) {}; + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ih ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + protected: + Disco* m_disco; + private: + JID m_jid; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::removeIDHandler( IqHandler* ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define DISCO_TEST +#define DISCO_INFO_TEST +#define ADHOC_TEST +#include "../../disco.h" +#include "../../disco.cpp" +#include "../../capabilities.h" +#include "../../capabilities.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + ClientBase cb; + Disco d( &cb ); + Capabilities c( &d ); + + + // ------- + name = "simple ver check"; + d.setIdentity( "client", "pc", "Exodus 0.9.1"); + d.removeFeature( "jabber:iq:version" ); + d.addFeature( "http://jabber.org/protocol/muc"); + d.addFeature( "http://jabber.org/protocol/caps" ); + if( c.ver() != "QgayPKawpkPSDYmwT/WM94uAlu0=" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + printf( "Capabilities: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.am new file mode 100644 index 00000000..5d86d21f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.am @@ -0,0 +1,30 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = carbons_test + +carbons_test_SOURCES = carbons_test.cpp +carbons_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../message.o \ + ../../forward.o ../../delayeddelivery.o \ + ../../clientbase.o ../../client.o \ + ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../messagesession.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../rostermanager.o ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../rosteritem.o ../../privatexml.o ../../tlsgnutlsbase.o \ + ../../tlsdefault.o ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../presence.o ../../subscription.o \ + ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o ../../attention.o ../../carbons.o +carbons_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.in new file mode 100644 index 00000000..c80e7d66 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/carbons/Makefile.in @@ -0,0 +1,555 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = carbons_test$(EXEEXT) +subdir = src/tests/carbons +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_carbons_test_OBJECTS = carbons_test.$(OBJEXT) +carbons_test_OBJECTS = $(am_carbons_test_OBJECTS) +carbons_test_DEPENDENCIES = ../../jid.o ../../tag.o ../../logsink.o \ + ../../prep.o ../../util.o ../../gloox.o ../../iq.o \ + ../../stanza.o ../../error.o ../../message.o ../../forward.o \ + ../../delayeddelivery.o ../../clientbase.o ../../client.o \ + ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../messagesession.o \ + ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../rostermanager.o \ + ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../rosteritem.o \ + ../../privatexml.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../presence.o ../../subscription.o \ + ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o ../../atomicrefcount.o \ + ../../attention.o ../../carbons.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(carbons_test_SOURCES) +DIST_SOURCES = $(carbons_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +carbons_test_SOURCES = carbons_test.cpp +carbons_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../message.o \ + ../../forward.o ../../delayeddelivery.o \ + ../../clientbase.o ../../client.o \ + ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../messagesession.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../rostermanager.o ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../rosteritem.o ../../privatexml.o ../../tlsgnutlsbase.o \ + ../../tlsdefault.o ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../presence.o ../../subscription.o \ + ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o ../../attention.o ../../carbons.o + +carbons_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/carbons/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/carbons/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +carbons_test$(EXEEXT): $(carbons_test_OBJECTS) $(carbons_test_DEPENDENCIES) $(EXTRA_carbons_test_DEPENDENCIES) + @rm -f carbons_test$(EXEEXT) + $(CXXLINK) $(carbons_test_OBJECTS) $(carbons_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/carbons_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/carbons/carbons_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/carbons/carbons_test.cpp new file mode 100644 index 00000000..c6774426 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/carbons/carbons_test.cpp @@ -0,0 +1,171 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../jid.h" +#include "../../delayeddelivery.h" +#include "../../forward.h" +#include "../../message.h" +#include "../../messagehandler.h" +#include "../../client.h" +#include "../../attention.h" +#include "../../carbons.h" + +#include +#include +#include // [s]print[f] + +using namespace gloox; + + + class CarbonsTest : public MessageHandler + { + public: + CarbonsTest() : cb( "foo" ) + { + cb.registerMessageHandler( this ); + cb.registerStanzaExtension( new Forward() ); + cb.registerStanzaExtension( new Carbons() ); + cb.registerStanzaExtension( new Attention() ); + } + ~CarbonsTest() {} + void testTag( Tag* tag ) { cb.handleTag( tag ); } + virtual void handleMessage( const Message& msg, MessageSession* ) + { + Tag* m = msg.tag(); + m_xml = m->xml(); +// printf( "msg: %s\n", m->xml().c_str() ); + delete m; + } + const std::string& getXml() { return m_xml; } + private: + Client cb; + std::string m_xml; + }; + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + Tag* tag = new Tag( "message", XMLNS, XMLNS_CLIENT ); + tag->addAttribute( "to", "foo@myserver/4444" ); + tag->addAttribute( "from", "foo@myserver" ); + tag->addAttribute( "id", "someid" ); + tag->addAttribute( "type", "chat" ); + Tag* c = new Tag( tag, "received", XMLNS, XMLNS_MESSAGE_CARBONS ); + Tag* f = new Tag( c, "forwarded", XMLNS, XMLNS_STANZA_FORWARDING ); + Tag* m = new Tag( f, "message", XMLNS, XMLNS_CLIENT ); + m->addAttribute( "to", "foo@myserver/0123" ); + m->addAttribute( "from", "bar@theirserver/home" ); + m->addAttribute( "id", "someotherid" ); + m->addAttribute( "type", "chat" ); + new Tag( m, "body", "a sample message body" ); + new Tag( m, "attention", XMLNS, XMLNS_ATTENTION ); + + CarbonsTest t; + t.testTag( tag ); + + // ------- + name = "parse Carbons"; + if( tag->xml() != t.getXml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed:\n%s\n---\n%s\n", name.c_str(), tag->xml().c_str(), t.getXml().c_str() ); + } + + + Carbons* cm = 0; + Tag* temp = 0; + + // ------- + name = "create Carbons::Received"; + cm = new Carbons( Carbons::Received ); + temp = cm->tag(); + if( cm->type() != Carbons::Received || temp->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: type: %d, tag: %s\n", name.c_str(), cm->type(), temp ? temp->xml().c_str() : "'0'" ); + } + delete temp; + delete cm; + + // ------- + name = "create Carbons::Sent"; + cm = new Carbons( Carbons::Sent ); + temp = cm->tag(); + if( cm->type() != Carbons::Sent || temp->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: type: %d, tag: %s\n", name.c_str(), cm->type(), temp ? temp->xml().c_str() : "'0'" ); + } + delete temp; + delete cm; + + // ------- + name = "create Carbons::Enable"; + cm = new Carbons( Carbons::Enable ); + temp = cm->tag(); + if( cm->type() != Carbons::Enable || temp->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: type: %d, tag: %s\n", name.c_str(), cm->type(), temp ? temp->xml().c_str() : "'0'" ); + } + delete temp; + delete cm; + + // ------- + name = "create Carbons::Disable"; + cm = new Carbons( Carbons::Disable ); + temp = cm->tag(); + if( cm->type() != Carbons::Disable || temp->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: type: %d, tag: %s\n", name.c_str(), cm->type(), temp ? temp->xml().c_str() : "'0'" ); + } + delete temp; + delete cm; + + // ------- + name = "create Carbons::Private"; + cm = new Carbons( Carbons::Private ); + temp = cm->tag(); + if( cm->type() != Carbons::Private || temp->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: type: %d, tag: %s\n", name.c_str(), cm->type(), temp ? temp->xml().c_str() : "'0'" ); + } + delete temp; + delete cm; + + + + + + + + + + + if( fail == 0 ) + { + printf( "Carbons: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Carbons: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.am new file mode 100644 index 00000000..dbe6f8cd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.am @@ -0,0 +1,14 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = chatstatefilter_test + +chatstatefilter_test_SOURCES = chatstatefilter_test.cpp +chatstatefilter_test_LDADD = ../../tag.o ../../stanza.o ../../stanzaextensionfactory.o \ + ../../jid.o ../../prep.o \ + ../../message.o ../../util.o \ + ../../gloox.o ../../chatstate.o ../../mutex.o +chatstatefilter_test_CPPFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.in new file mode 100644 index 00000000..d5c69b02 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/Makefile.in @@ -0,0 +1,538 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = chatstatefilter_test$(EXEEXT) +subdir = src/tests/chatstatefilter +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_chatstatefilter_test_OBJECTS = \ + chatstatefilter_test-chatstatefilter_test.$(OBJEXT) +chatstatefilter_test_OBJECTS = $(am_chatstatefilter_test_OBJECTS) +chatstatefilter_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../stanzaextensionfactory.o ../../jid.o ../../prep.o \ + ../../message.o ../../util.o ../../gloox.o ../../chatstate.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(chatstatefilter_test_SOURCES) +DIST_SOURCES = $(chatstatefilter_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +chatstatefilter_test_SOURCES = chatstatefilter_test.cpp +chatstatefilter_test_LDADD = ../../tag.o ../../stanza.o ../../stanzaextensionfactory.o \ + ../../jid.o ../../prep.o \ + ../../message.o ../../util.o \ + ../../gloox.o ../../chatstate.o ../../mutex.o + +chatstatefilter_test_CPPFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/chatstatefilter/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/chatstatefilter/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +chatstatefilter_test$(EXEEXT): $(chatstatefilter_test_OBJECTS) $(chatstatefilter_test_DEPENDENCIES) $(EXTRA_chatstatefilter_test_DEPENDENCIES) + @rm -f chatstatefilter_test$(EXEEXT) + $(CXXLINK) $(chatstatefilter_test_OBJECTS) $(chatstatefilter_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chatstatefilter_test-chatstatefilter_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +chatstatefilter_test-chatstatefilter_test.o: chatstatefilter_test.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chatstatefilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT chatstatefilter_test-chatstatefilter_test.o -MD -MP -MF $(DEPDIR)/chatstatefilter_test-chatstatefilter_test.Tpo -c -o chatstatefilter_test-chatstatefilter_test.o `test -f 'chatstatefilter_test.cpp' || echo '$(srcdir)/'`chatstatefilter_test.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/chatstatefilter_test-chatstatefilter_test.Tpo $(DEPDIR)/chatstatefilter_test-chatstatefilter_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='chatstatefilter_test.cpp' object='chatstatefilter_test-chatstatefilter_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chatstatefilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o chatstatefilter_test-chatstatefilter_test.o `test -f 'chatstatefilter_test.cpp' || echo '$(srcdir)/'`chatstatefilter_test.cpp + +chatstatefilter_test-chatstatefilter_test.obj: chatstatefilter_test.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chatstatefilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT chatstatefilter_test-chatstatefilter_test.obj -MD -MP -MF $(DEPDIR)/chatstatefilter_test-chatstatefilter_test.Tpo -c -o chatstatefilter_test-chatstatefilter_test.obj `if test -f 'chatstatefilter_test.cpp'; then $(CYGPATH_W) 'chatstatefilter_test.cpp'; else $(CYGPATH_W) '$(srcdir)/chatstatefilter_test.cpp'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/chatstatefilter_test-chatstatefilter_test.Tpo $(DEPDIR)/chatstatefilter_test-chatstatefilter_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='chatstatefilter_test.cpp' object='chatstatefilter_test-chatstatefilter_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(chatstatefilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o chatstatefilter_test-chatstatefilter_test.obj `if test -f 'chatstatefilter_test.cpp'; then $(CYGPATH_W) 'chatstatefilter_test.cpp'; else $(CYGPATH_W) '$(srcdir)/chatstatefilter_test.cpp'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/chatstatefilter_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/chatstatefilter_test.cpp new file mode 100644 index 00000000..7b2fdf1b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/chatstatefilter/chatstatefilter_test.cpp @@ -0,0 +1,310 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../message.h" +#include "../../tag.h" +#include "../../prep.h" +#include "../../gloox.h" +#include "../../jid.h" +#include "../../chatstatehandler.h" +#include "../../chatstate.h" + +#include +#include +#include // [s]print[f] + +namespace gloox +{ + class ClientBase; + + class MessageSession : public ChatStateHandler + { + public: + MessageSession() : m_jid( "abc@example.net/foo" ), m_test( 0 ), m_result( false ) {} + MessageSession( ClientBase*, const JID&, bool, int ); /*: m_jid( "abc@example.net/foo" ), m_test( 0 ), + m_result( false ) {}*/ + virtual ~MessageSession() {} + const JID& target() const { return m_jid; } + void send( Message& msg ) + { + if( msg.to() != m_jid ) + return; + + const ChatState* cs = msg.findExtension( ExtChatState ); + if( !cs ) + return; + + switch( m_test ) + { + case 0: + if( cs->state() == ChatStateGone ) + m_result = true; + break; + case 1: + if( cs->state() == ChatStateInactive ) + m_result = true; + break; + case 2: + if( cs->state() == ChatStateActive ) + m_result = true; + break; + case 3: + if( cs->state() == ChatStateComposing ) + m_result = true; + break; + case 4: + if( cs->state() == ChatStatePaused ) + m_result = true; + break; + default: + break; + } + } + void setTest( int test ) { m_test = test; } + bool ok() { bool ok = m_result; m_result = false; return ok; } + virtual void handleChatState( const JID& from, ChatStateType state ) + { + switch( m_test ) + { + case 0: + if( state == ChatStateGone ) + m_result = true; + break; + case 1: + if( state == ChatStateInactive ) + m_result = true; + break; + case 2: + if( state == ChatStateActive ) + m_result = true; + break; + case 3: + if( state == ChatStateComposing ) + m_result = true; + break; + case 4: + if( state == ChatStatePaused ) + m_result = true; + break; + default: + break; + } + } + private: + JID m_jid; + int m_test; + bool m_result; + }; + + MessageSession::MessageSession( ClientBase*, const JID&, bool, int ) + : m_jid( "abc@example.net/foo" ), m_test( 0 ), m_result( false ) {} + + class MessageFilter + { + public: + MessageFilter( MessageSession *parent ); + virtual ~MessageFilter(); + void attachTo( MessageSession *session ); + virtual void decorate( Message& msg ); + void send( Message& msg ); + protected: + MessageSession *m_parent; + }; + + MessageFilter::MessageFilter( MessageSession *parent ) : m_parent( parent ) {} + MessageFilter::~MessageFilter() { delete m_parent; } + void MessageFilter::attachTo( MessageSession *session ) {} + void MessageFilter::decorate( Message& msg ) {} + void MessageFilter::send( Message& msg ) { m_parent->send( msg ); } +} + +#define MESSAGEFILTER_H__ +#define MESSAGESESSION_H__ +#include "../../chatstatefilter.h" +#include "../../chatstatefilter.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + gloox::ChatStateFilter *f; + gloox::MessageSession *ms; + gloox::Tag *t = 0; + gloox::Tag *x = 0; + gloox::Message *s = 0; + + // ------- + { + name = "simple decorate"; + f = new gloox::ChatStateFilter( new gloox::MessageSession() ); + gloox::Message m( gloox::Message::Chat, gloox::JID() ); + f->decorate( m ); + if( m.findExtension( gloox::ExtChatState )->state() + != gloox::ChatStateActive ) + { + ++fail; + fprintf( stderr, "test '%s' failed:s %s\n", name.c_str(), t->xml().c_str() ); + } + delete f; + f = 0; + } + // ------- + ms = new gloox::MessageSession(); + f = new gloox::ChatStateFilter( ms ); + f->registerChatStateHandler( ms ); + + { + name = "filter gone"; + gloox::Message m( gloox::Message::Chat, gloox::JID() ); + m.addExtension( new gloox::ChatState( gloox::ChatStateGone ) ); + ms->setTest( 0 ); + f->filter( m ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "filter inactive"; + gloox::Message m( gloox::Message::Chat, gloox::JID() ); + m.addExtension( new gloox::ChatState( gloox::ChatStateInactive ) ); + ms->setTest( 1 ); + f->filter( m ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "filter active"; + gloox::Message m( gloox::Message::Chat, gloox::JID() ); + m.addExtension( new gloox::ChatState( gloox::ChatStateActive ) ); + ms->setTest( 2 ); + f->filter( m ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "filter composing"; + gloox::Message m( gloox::Message::Chat, gloox::JID() ); + m.addExtension( new gloox::ChatState( gloox::ChatStateComposing ) ); + ms->setTest( 3 ); + f->filter( m ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "filter paused"; + gloox::Message m( gloox::Message::Chat, gloox::JID() ); + m.addExtension( new gloox::ChatState( gloox::ChatStatePaused ) ); + ms->setTest( 4 ); + f->filter( m ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + name = "set inactive state"; + ms->setTest( 1 ); + f->setChatState( gloox::ChatStateInactive ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "set active state"; + ms->setTest( 2 ); + f->setChatState( gloox::ChatStateActive ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "set composing state"; + ms->setTest( 3 ); + f->setChatState( gloox::ChatStateComposing ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "set paused state"; + ms->setTest( 4 ); + f->setChatState( gloox::ChatStatePaused ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "set gone state"; + ms->setTest( 0 ); + f->setChatState( gloox::ChatStateGone ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + delete f; +// delete s; + f = 0; +// s = 0; + + + + + + + + + + + + if( fail == 0 ) + { + printf( "ChatStateFilter: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "ChatStateFilter: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.am new file mode 100644 index 00000000..1feb7a88 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.am @@ -0,0 +1,24 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual -Wno-long-long + +noinst_PROGRAMS = client_test + +client_test_SOURCES = client_test.cpp +client_test_LDADD = ../../client.o ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o ../../jid.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../rostermanager.o ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../rosteritem.o ../../privatexml.o ../../gloox.o ../../tlsgnutlsbase.o \ + ../../tlsdefault.o ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o ../../subscription.o \ + ../../util.o ../../error.o ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o +client_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.in new file mode 100644 index 00000000..a6ad29fe --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/client/Makefile.in @@ -0,0 +1,547 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = client_test$(EXEEXT) +subdir = src/tests/client +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_client_test_OBJECTS = client_test.$(OBJEXT) +client_test_OBJECTS = $(am_client_test_OBJECTS) +client_test_DEPENDENCIES = ../../client.o ../../connectiontcpbase.o \ + ../../connectiontcpclient.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../jid.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../rostermanager.o \ + ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../rosteritem.o \ + ../../privatexml.o ../../gloox.o ../../tlsgnutlsbase.o \ + ../../tlsdefault.o ../../tlsgnutlsclientanon.o \ + ../../tlsgnutlsserveranon.o ../../mutex.o ../../iq.o \ + ../../presence.o ../../message.o ../../subscription.o \ + ../../util.o ../../error.o ../../capabilities.o \ + ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(client_test_SOURCES) +DIST_SOURCES = $(client_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual -Wno-long-long +client_test_SOURCES = client_test.cpp +client_test_LDADD = ../../client.o ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o ../../jid.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../rostermanager.o ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../rosteritem.o ../../privatexml.o ../../gloox.o ../../tlsgnutlsbase.o \ + ../../tlsdefault.o ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o ../../subscription.o \ + ../../util.o ../../error.o ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +client_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/client/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/client/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +client_test$(EXEEXT): $(client_test_OBJECTS) $(client_test_DEPENDENCIES) $(EXTRA_client_test_DEPENDENCIES) + @rm -f client_test$(EXEEXT) + $(CXXLINK) $(client_test_OBJECTS) $(client_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/client_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/client/client_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/client/client_test.cpp new file mode 100644 index 00000000..31e58ab9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/client/client_test.cpp @@ -0,0 +1,495 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define CLIENTBASE_TEST +#include "../../client.h" +#include "../../clientbase.cpp" +#include "../../jid.h" +#include "../../connectionbase.h" +// #include "../../logsink.h" +// #include "../../loghandler.h" +#include "../../connectionlistener.h" +#include "../../gloox.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +class ClientTest : public Client, LogHandler, ConnectionListener +{ + public: + ClientTest( const JID& jid, const std::string& password, int port = -1 ) + : Client( jid, password, port ), m_connected( 0 ), m_disconnected( 0 ), m_log( false ) + { + logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + registerConnectionListener( this ); + jidCopy = jid.full(); + } + virtual ~ClientTest() {} + virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + if( m_log ) + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + } + virtual void onConnect() + { + ++m_connected; + + // magic jid + if( jidCopy == "a@b/c" ) + disconnect(); + } + virtual void onDisconnect( ConnectionError e ) + { + ++m_disconnected; + m_disconnect = e; + m_streamerror = streamError(); +// printf( "reason: %d\n", e ); + } + virtual void onResourceBindError( ResourceBindError /*error*/ ) + { /*printf( "res bind err: %d\n", error );*/ } + virtual void onSessionCreateError( SessionCreateError /*error*/ ) + { /*printf( "ses err: %d\n", error );*/ } + virtual bool onTLSConnect( const CertInfo& /*info*/ ) { return false; } + int connected() const { return m_connected; } + int disconnected() const { return m_disconnected; } + ConnectionError disconnectReason() const { return m_disconnect; } + StreamError streamErrorReason() const { return m_streamerror; } + void setLog( bool log ) { m_log = log; } + + protected: + + private: + int m_connected; + int m_disconnected; + ConnectionError m_disconnect; + StreamError m_streamerror; + bool m_log; + std::string jidCopy; +}; + +class ConnectionImpl : public ConnectionBase +{ + public: + ConnectionImpl( ConnectionDataHandler *cdh, int test ) + : ConnectionBase( cdh ), m_test( test ), m_pos( 0 ), m_run( true ) {} + virtual ~ConnectionImpl() {} + virtual ConnectionError connect() + { + m_run = true; + m_state = StateConnected; + m_handler->handleConnect( this ); + return ConnNoError; + } + virtual ConnectionError recv( int /*timeout = -1*/ ) + { + if( m_msgs[m_test][m_pos] ) + { + m_handler->handleReceivedData( this, m_msgs[m_test][m_pos++] ); + return ConnNoError; + } + else + { + m_handler->handleDisconnect( this, ConnIoError ); + return ConnIoError; + } + } + virtual bool send( const std::string& /*data*/ ) { return true; } + virtual ConnectionError receive() + { + ConnectionError ce = ConnNoError; + while( m_run && ce == ConnNoError ) + ce = recv( 0 ); + return ce; + } + virtual void disconnect() { m_run = false; } + virtual void cleanup() + { + m_state = StateDisconnected; + m_pos = 0; + } + virtual void getStatistics( long int& /*totalIn*/, long int& /*totalOut*/ ) {} + virtual ConnectionBase* newInstance() const { return 0; } + + private: + int m_test; + int m_pos; + bool m_run; + static const char* m_msgs[6][12]; + +}; + +const char* ConnectionImpl::m_msgs[6][12] = + { + { // connection/auth goes ok. + "" + "" + "" + "PLAIN" + "DIGEST-MD5" + "" + "", + "" + "bm9uY2U9ImhvS1I2VkZDSGFibUVYY01weFhlL0QrcVZjWEdyMUdFNzQ0MVFzM2MxY2M9IixyZWFsbT0iamFiYmV" + "yLmNjIixxb3A9ImF1dGgsYXV0aC1pbnQsYXV0aC1jb25mIixjaXBoZXI9InJjNC00MCxyYzQtNTYscmM0LGRlcyw" + "zZGVzIixtYXhidWY9MTAyNCxjaGFyc2V0PXV0Zi04LGFsZ29yaXRobT1tZDUtc2Vzcw==" + "", + "" + "cnNwYXV0aD1mNGFhZTM0YWY0N2I1MmM0MmQ2NWQzY2NjMGNjN2YyNA==" + "", + "", + "" + "" + "" + "" + "", + "" + "" + "hurkhurk@jabber.cc/gloox", + "", + "" + "::" + "", + 0 + }, + { // auth failure + "" + "" + "" + "PLAIN" + "DIGEST-MD5" + "" + "", + "" + "bm9uY2U9ImhvS1I2VkZDSGFibUVYY01weFhlL0QrcVZjWEdyMUdFNzQ0MVFzM2MxY2M9IixyZWFsbT0iamFiYmV" + "yLmNjIixxb3A9ImF1dGgsYXV0aC1pbnQsYXV0aC1jb25mIixjaXBoZXI9InJjNC00MCxyYzQtNTYscmM0LGRlcyw" + "zZGVzIixtYXhidWY9MTAyNCxjaGFyc2V0PXV0Zi04LGFsZ29yaXRobT1tZDUtc2Vzcw==" + "", + "", + 0, + }, + { // chokes in the middle + "" + "" + "" + "PLAIN" + "DIGEST-MD5" + "" + "", + "" + "bm9uY2U9ImhvS1I2VkZDSGFibUVYY01weFhlL0QrcVZjWEdyMUdFNzQ0MVFzM2MxY2M9IixyZWFsbT0iamFiYmV" + "yLmNjIixxb3A9ImF1dGgsYXV0aC1pbnQsYXV0aC1jb25mIixjaXBoZXI9InJjNC00MCxyYzQtNTYscmM0LGRlcyw" + "zZGVzIixtYXhidWY9MTAyNCxjaGFyc2V0PXV0Zi04LGFsZ29yaXRobT1tZDUtc2Vzcw==" + "", + 0, + }, + { // chokes on the xml + "" + "" + "" + "PLAIN" + "DIGEST-MD5" + "" + "", + "", + 0, + }, + { // connection/auth goes ok. basic xep-0198 (stream management) ack'ing + "" + "" + "" + "PLAIN" + "DIGEST-MD5" + "" + "", + "" + "bm9uY2U9ImhvS1I2VkZDSGFibUVYY01weFhlL0QrcVZjWEdyMUdFNzQ0MVFzM2MxY2M9IixyZWFsbT0iamFiYmV" + "yLmNjIixxb3A9ImF1dGgsYXV0aC1pbnQsYXV0aC1jb25mIixjaXBoZXI9InJjNC00MCxyYzQtNTYscmM0LGRlcyw" + "zZGVzIixtYXhidWY9MTAyNCxjaGFyc2V0PXV0Zi04LGFsZ29yaXRobT1tZDUtc2Vzcw==" + "", + "" + "cnNwYXV0aD1mNGFhZTM0YWY0N2I1MmM0MmQ2NWQzY2NjMGNjN2YyNA==" + "", + "", + "" + "" + "" + "" + "" + "", + "" + "" + "hurkhurk@jabber.cc/gloox", + "", + "", + "" + "::" + "", + 0 + }, + { // connection/auth goes ok. + "" + "" + "" + "PLAIN" + "DIGEST-MD5" + "" + "", + "" + "bm9uY2U9ImhvS1I2VkZDSGFibUVYY01weFhlL0QrcVZjWEdyMUdFNzQ0MVFzM2MxY2M9IixyZWFsbT0iamFiYmV" + "yLmNjIixxb3A9ImF1dGgsYXV0aC1pbnQsYXV0aC1jb25mIixjaXBoZXI9InJjNC00MCxyYzQtNTYscmM0LGRlcyw" + "zZGVzIixtYXhidWY9MTAyNCxjaGFyc2V0PXV0Zi04LGFsZ29yaXRobT1tZDUtc2Vzcw==" + "", + "" + "cnNwYXV0aD1mNGFhZTM0YWY0N2I1MmM0MmQ2NWQzY2NjMGNjN2YyNA==" + "", + "", + "" + "" + "" + "" + "" + "", + "", + "", + "something", + 0 + }, + }; + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + ClientTest *c = 0; + ConnectionImpl *conn = 0; + JID j( "a@b/c" ); + + + // ------- +// printf( "-----------------------------\n" ); + name = "connect test: ok"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 0 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + // c->setLog( true ); + c->connect(); +// printf( "connected: %d, disconnected: %d, reason: %d\n", c->connected(), c->disconnected(), c->disconnectReason() ); + if( c->connected() != 1 || c->disconnected() != 1 || c->disconnectReason() != ConnUserDisconnected ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + // ------- +// printf( "-----------------------------\n" ); + name = "connect test: auth failure"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 1 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + // c->setLog( true ); + c->connect(); + if( c->connected() != 0 || c->disconnected() != 1 || c->disconnectReason() != ConnAuthenticationFailed ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + // ------- +// printf( "-----------------------------\n" ); + name = "connect test: io error"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 2 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + // c->setLog( true ); + c->connect(); + if( c->connected() != 0 || c->disconnected() != 1 || c->disconnectReason() != ConnIoError ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + +// printf( "-----------------------------\n" ); + // ------- + name = "connect test: xml error"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 3 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + // c->setLog( true ); + c->connect(); + if( c->connected() != 0 || c->disconnected() != 1 || c->disconnectReason() != ConnStreamError + || c->streamErrorReason() != StreamErrorXmlNotWellFormed ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %d, %d\n", name.c_str(), c->disconnectReason(), c->streamErrorReason() ); + } + delete c; + c = 0; + + // ------- + name = "re-connect test 1"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 2 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + // c->setLog( true ); + for( int i = 1; i <= 100; ++i ) + { + c->connect(); + if( c->connected() != 0 || c->disconnected() != i || c->disconnectReason() != ConnIoError ) + { + ++fail; + fprintf( stderr, "test '%s' failed, %d, %d, %d\n", name.c_str(), + c->connected(), c->disconnected(), + c->disconnectReason() ); + break; + } + } + delete c; + c = 0; + + // ------- + name = "re-connect test 2"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 0 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + // c->setLog( true ); + for( int i = 1; i <= 100; ++i ) + { + c->connect(); + if( c->connected() != i || c->disconnected() != i || c->disconnectReason() != ConnUserDisconnected ) + { + ++fail; + fprintf( stderr, "test '%s' failed, %d, %d, %d\n", name.c_str(), + c->connected(), c->disconnected(), + c->disconnectReason() ); + break; + } + } + delete c; + c = 0; + + + + // ------- + name = "stream management test 1: basic ack"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 4 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + c->setStreamManagement( true, false ); +// c->setLog( true ); + c->connect(); + // printf( "connected: %d, disconnected: %d, reason: %d\n", c->connected(), c->disconnected(), c->disconnectReason() ); + if( c->connected() != 1 || c->disconnected() != 1 || c->disconnectReason() != ConnUserDisconnected ) + { + ++fail; + fprintf( stderr, "test '%s' failed, %d, %d, %d\n", name.c_str(), + c->connected(), c->disconnected(), + c->disconnectReason() ); + } + delete c; + c = 0; + + + j.setServer( "d" ); + // ------- + name = "stream management test 2: resume"; + c = new ClientTest( j, "b" ); + conn = new ConnectionImpl( c, 4 ); + c->setConnectionImpl( conn ); + c->setTls( TLSDisabled ); + c->setCompression( false ); + c->setStreamManagement( true, true ); +// c->setLog( true ); + c->connect(); + // printf( "connected: %d, disconnected: %d, reason: %d\n", c->connected(), c->disconnected(), c->disconnectReason() ); + if( c->connected() != 1 || c->disconnected() != 1 || c->disconnectReason() != ConnIoError ) + { + ++fail; + fprintf( stderr, "test '%s' part 1 failed, %d, %d, %d\n", name.c_str(), + c->connected(), c->disconnected(), + c->disconnectReason() ); + } + else + { + conn = new ConnectionImpl( c, 5 ); + c->setConnectionImpl( conn ); + c->connect(); + // printf( "connected: %d, disconnected: %d, reason: %d\n", c->connected(), c->disconnected(), c->disconnectReason() ); + if( c->connected() != 2 || c->disconnected() != 2 || c->disconnectReason() != ConnIoError ) + { + ++fail; + fprintf( stderr, "test '%s' part 2 failed, %d, %d, %d\n", name.c_str(), + c->connected(), c->disconnected(), + c->disconnectReason() ); + } + } + delete c; + c = 0; + + + + + + + + + + + + + + + + + if( fail == 0 ) + { + printf( "Client: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Client: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.am new file mode 100644 index 00000000..3e68b26c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.am @@ -0,0 +1,22 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual -Wno-long-long + +noinst_PROGRAMS = clientbase_test + +clientbase_test_SOURCES = clientbase_test.cpp +clientbase_test_LDADD = ../../clientbase.o ../../jid.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o +clientbase_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.in new file mode 100644 index 00000000..388b5b1e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/clientbase/Makefile.in @@ -0,0 +1,543 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = clientbase_test$(EXEEXT) +subdir = src/tests/clientbase +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_clientbase_test_OBJECTS = clientbase_test.$(OBJEXT) +clientbase_test_OBJECTS = $(am_clientbase_test_OBJECTS) +clientbase_test_DEPENDENCIES = ../../clientbase.o ../../jid.o \ + ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o \ + ../../base64.o ../../md5.o ../../tlsgnutlsclient.o \ + ../../tlsopensslclient.o ../../tlsopensslbase.o \ + ../../tlsopensslserver.o ../../tlsschannel.o ../../logsink.o \ + ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../tlsgnutlsbase.o ../../tlsdefault.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(clientbase_test_SOURCES) +DIST_SOURCES = $(clientbase_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual -Wno-long-long +clientbase_test_SOURCES = clientbase_test.cpp +clientbase_test_LDADD = ../../clientbase.o ../../jid.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o + +clientbase_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/clientbase/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/clientbase/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +clientbase_test$(EXEEXT): $(clientbase_test_OBJECTS) $(clientbase_test_DEPENDENCIES) $(EXTRA_clientbase_test_DEPENDENCIES) + @rm -f clientbase_test$(EXEEXT) + $(CXXLINK) $(clientbase_test_OBJECTS) $(clientbase_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/clientbase_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/clientbase/clientbase_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/clientbase/clientbase_test.cpp new file mode 100644 index 00000000..39ba4840 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/clientbase/clientbase_test.cpp @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../clientbase.h" +#include "../../connectionbase.h" +// #include "../../logsink.h" +// #include "../../loghandler.h" +#include "../../connectionlistener.h" +#include "../../gloox.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +class ClientBaseTest : public ClientBase, /*LogHandler,*/ ConnectionListener +{ + public: + ClientBaseTest( const std::string& ns, const std::string& server, int port = -1 ) + : ClientBase( ns, server, port ), m_handleStartNodeCalled( false ), + m_versionOK( false ) + { + m_jid.setUsername( "test" ); + m_jid.setServer( server ); + m_jid.setResource( "gloox" ); +// logInstance().registerLogHandler( LogLevelDebug, LogAreaAll, this ); + registerConnectionListener( this ); + } + virtual ~ClientBaseTest() {} + virtual void handleStartNode( const Tag* /*tag*/ ) { m_handleStartNodeCalled = true; } + virtual bool handleNormalNode(gloox::Tag*) { return true; } + virtual void rosterFilled() {} +/* virtual void handleLog( LogLevel level, LogArea area, const std::string& message ) + { + printf("log: level: %d, area: %d, %s\n", level, area, message.c_str() ); + }*/ + virtual void onConnect() { /*printf( "connect\n" );*/ } + virtual void onDisconnect( ConnectionError /*e*/ ) { /*printf( "disconnected: %d\n", e );*/ } + virtual void onResourceBindError( ResourceBindError /*error*/ ) { /*printf( "res bind err: %d\n", error );*/ } + virtual void onSessionCreateError( SessionCreateError /*error*/ ) { /*printf( "ses err: %d\n", error );*/ } + virtual bool onTLSConnect( const CertInfo& /*info*/ ) { return false; } + bool handleStartNodeCalled() const { return m_handleStartNodeCalled; } + bool sidOK() const { return ( m_sid == "testsid" ); } + bool versionOK() const { return m_versionOK; } + + protected: + virtual bool checkStreamVersion( const std::string& version ) + { + m_versionOK = ClientBase::checkStreamVersion( version ); + return m_versionOK; + } + + private: + bool m_handleStartNodeCalled; + bool m_versionOK; +}; + +class ConnectionImpl : public ConnectionBase +{ + public: + ConnectionImpl( ConnectionDataHandler *cdh ) + : ConnectionBase( cdh ), m_pos( 0 ) {} + virtual ~ConnectionImpl() {} + virtual ConnectionError connect() { m_state = StateConnected; return ConnNoError; } + virtual ConnectionError recv( int /*timeout = -1*/ ) { return ConnNoError; } + virtual bool send( const std::string& /*data*/ ) { return true; } + virtual ConnectionError receive() + { + ConnectionError ce = ConnNoError; + while( ce == ConnNoError && m_pos <= 8 ) + ce = recv( 0 ); + return ConnNotConnected; + } + virtual void disconnect() {} + + private: + int m_pos; + +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + ClientBaseTest *c = 0; + Tag *t = 0; + + + // ------- + name = "disconnected: recv()"; + c = new ClientBaseTest( "a", "b", 1 ); + if( c->recv() != ConnNotConnected ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + c = 0; + + // ------- + name = "disconnected: handleTag(): start node: handleStartNode"; + c = new ClientBaseTest( "a", "b", 1 ); + t = new Tag( "stream" ); + t->setXmlns( XMLNS_STREAM ); + t->addAttribute( "id", "testsid" ); + t->addAttribute( "version", "1.0" ); + c->handleTag( t ); + if( !c->handleStartNodeCalled() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + delete t; + c = 0; + t = 0; + + // ------- + name = "disconnected: handleTag(): start node: version"; + c = new ClientBaseTest( "a", "b", 1 ); + t = new Tag( "stream" ); + t->setXmlns( XMLNS_STREAM ); + t->addAttribute( "version", "1.0" ); + c->handleTag( t ); + if( !c->versionOK() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + delete t; + c = 0; + t = 0; + + // ------- + name = "disconnected: handleTag(): start node: version (fail 1)"; + c = new ClientBaseTest( "a", "b", 1 ); + t = new Tag( "stream" ); + t->setXmlns( XMLNS_STREAM ); + t->addAttribute( "version", "3.0" ); + c->handleTag( t ); + if( c->versionOK() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + delete t; + c = 0; + t = 0; + + // ------- + name = "disconnected: handleTag(): start node: version (fail 2)"; + c = new ClientBaseTest( "a", "b", 1 ); + t = new Tag( "stream:stream" ); + c->handleTag( t ); + if( c->versionOK() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + delete t; + c = 0; + t = 0; + + // ------- + name = "disconnected: handleTag(): start node: session id"; + c = new ClientBaseTest( "a", "b", 1 ); + t = new Tag( "stream" ); + t->setXmlns( XMLNS_STREAM ); + t->addAttribute( "version", "1.0" ); + t->addAttribute( "id", "testsid" ); + c->handleTag( t ); + if( !c->sidOK() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete c; + delete t; + c = 0; + t = 0; + + + + + + + + + + + + if( fail == 0 ) + { + printf( "ClientBase: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "ClientBase: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.am new file mode 100644 index 00000000..1926d5f4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = connectionbosh_test + +connectionbosh_test_SOURCES = connectionbosh_test.cpp +connectionbosh_test_LDADD = ../../connectionbosh.o ../../parser.o ../../tag.o ../../logsink.o \ + ../../gloox.o ../../prep.o ../../util.o +connectionbosh_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.in new file mode 100644 index 00000000..18c41d0b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = connectionbosh_test$(EXEEXT) +subdir = src/tests/connectionbosh +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_connectionbosh_test_OBJECTS = connectionbosh_test.$(OBJEXT) +connectionbosh_test_OBJECTS = $(am_connectionbosh_test_OBJECTS) +connectionbosh_test_DEPENDENCIES = ../../connectionbosh.o \ + ../../parser.o ../../tag.o ../../logsink.o ../../gloox.o \ + ../../prep.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(connectionbosh_test_SOURCES) +DIST_SOURCES = $(connectionbosh_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +connectionbosh_test_SOURCES = connectionbosh_test.cpp +connectionbosh_test_LDADD = ../../connectionbosh.o ../../parser.o ../../tag.o ../../logsink.o \ + ../../gloox.o ../../prep.o ../../util.o + +connectionbosh_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/connectionbosh/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/connectionbosh/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +connectionbosh_test$(EXEEXT): $(connectionbosh_test_OBJECTS) $(connectionbosh_test_DEPENDENCIES) $(EXTRA_connectionbosh_test_DEPENDENCIES) + @rm -f connectionbosh_test$(EXEEXT) + $(CXXLINK) $(connectionbosh_test_OBJECTS) $(connectionbosh_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/connectionbosh_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/connectionbosh_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/connectionbosh_test.cpp new file mode 100644 index 00000000..b2875346 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/connectionbosh/connectionbosh_test.cpp @@ -0,0 +1,220 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../connectionbase.h" +#include "../../connectionbosh.h" +#include "../../connectiondatahandler.h" +#include "../../logsink.h" +#include "../../loghandler.h" + +#include +#include +#include +#include // [s]print[f] + +int g_test = 0; + +namespace gloox +{ + class FakeConnection : public ConnectionBase + { + public: + FakeConnection() : ConnectionBase( 0 ) {} + virtual ~FakeConnection() {} + virtual ConnectionError connect(); + virtual ConnectionError recv( int timeout = -1 ); + virtual bool send( const std::string& data ); + virtual ConnectionError receive(); + virtual void disconnect(); + virtual void cleanup() {} + virtual ConnectionBase* newInstance() const + { +// printf( "FakeConnection::newInstance(): %d\n", g_test ); + return new FakeConnection(); + } + virtual void getStatistics( long int& /*totalIn*/, long int& /*totalOut*/ ) {} + void setTest( int test ) { g_test = test; } + }; + + ConnectionError FakeConnection::connect() + { +// printf( "FakeConnection::connect(): %d\n", g_test ); + m_state = StateConnecting; + return ConnNoError; + } + ConnectionError FakeConnection::recv( int ) + { +// printf( "FakeConnection::recv(): %d\n", g_test ); + if( g_test == 1 ) + { + m_state = StateConnected; + m_handler->handleConnect( this ); + ++g_test; + } + else if( g_test == 2 ) + { + ++g_test; + m_handler->handleReceivedData( this, "HTTP/1.0 200 OK\r\n" + "Date: Sun, 09 Dec 2007 17:49:11 GMT\r\n" + "Content-length: 592\r\n" + "Content-type: text/xml\r\n" + "Server: TwistedWeb/2.5.0\r\n\r\n" + "" + "" + "DIGEST-MD5" + "PLAIN" + "ANONYMOUS" + "CRAM-MD5" + "" + "" + "" ); + } + + return ConnNoError; + } + bool FakeConnection::send( const std::string& /*data*/ ) + { +// printf( "FakeConnection::send(): %d\n", g_test ); + return true; + } + ConnectionError FakeConnection::receive() + { +// printf( "FakeConnection::receive(): %d\n", g_test ); + return ConnNoError; + } + void FakeConnection::disconnect() + { +// printf( "FakeConnection::disconnect(): %d\n", g_test ); + } + + class FakeClientBase : public ConnectionDataHandler, public LogHandler + { + public: + FakeClientBase( ConnectionBOSH* cb ) : m_bosh( cb ) { m_bosh->registerConnectionDataHandler( this ); } + virtual ~FakeClientBase() {} + virtual void handleReceivedData( const ConnectionBase* connection, const std::string& data ); + virtual void handleConnect( const ConnectionBase* connection ); + virtual void handleDisconnect( const ConnectionBase* connection, ConnectionError reason ); + virtual void handleLog( LogLevel /*level*/, LogArea area, const std::string& /*message*/ ) + { +// printf("%d: ", int( time( 0 ) ) ); + switch(area) + { + case LogAreaXmlIncoming: +// printf("Received XML: "); + break; + case LogAreaXmlOutgoing: +// printf("Sent XML: "); + break; + case LogAreaClassConnectionBOSH: +// printf("BOSH: "); + break; + default: +// printf("log: level: %d, area: %d, ", level, area); + break; + } +// printf("%s\n", message.c_str() ); + } + void doLoop(); + private: + ConnectionBOSH* m_bosh; + bool m_stopLoop; + }; + + void FakeClientBase::handleConnect( const ConnectionBase* /*connection*/ ) + { +// printf( "FakeClientBase::handleConnect(): %d\n", g_test ); + m_stopLoop = true; + if( g_test == 3 ) // send outgoing stream opener + { + m_bosh->send( "" ); + ++g_test; + } + } + void FakeClientBase::handleReceivedData( const ConnectionBase* /*connection*/, const std::string& /*data*/ ) + { +// printf( "FakeClientBase::handleReceivedData(): %d\n", g_test ); + m_stopLoop = true; + if( g_test == 4 ) // + { + // stream opener, ignored, we'll wait for the stream features + ++g_test; + } + else if( g_test == 5 ) // stream features + { + m_bosh->send( "" ); + ++g_test; + } +// else +// printf( "RECEIVED UNHANDLED: %s\n", data.c_str() ); + } + void FakeClientBase::handleDisconnect( const ConnectionBase* /*connection*/, ConnectionError /*reason*/ ) + { +// printf( "FakeClientBase::handleDisconnect(): %d\n", g_test ); + m_stopLoop = true; + } + void FakeClientBase::doLoop() + { + m_stopLoop = false; + while( !m_stopLoop ) + m_bosh->recv(); + } +} + +using namespace gloox; + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + LogSink ls; + FakeConnection* fc = new FakeConnection(); + ConnectionBOSH* cb = new ConnectionBOSH( fc, ls, "example.net" ,"example.net" ); + FakeClientBase* fcb = new FakeClientBase( cb ); + ls.registerLogHandler( LogLevelDebug, LogAreaAll, fcb ); + + + + // ------- + name = "connect"; + fc->setTest( 1 ); + cb->connect(); + fcb->doLoop(); + if( 1 ) + { + ++fail; +// fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + delete cb; + delete fcb; + + + if( fail == 0 ) + { + printf( "ConnectionBOSH: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "ConnectionBOSH: %d test(s) failed\n", fail ); + return 1; + } + + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.am new file mode 100644 index 00000000..121909ab --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = dataform_test + +dataform_test_SOURCES = dataform_test.cpp +dataform_test_LDADD = ../../tag.o ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../gloox.o ../../util.o +dataform_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.in new file mode 100644 index 00000000..aa755e07 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataform/Makefile.in @@ -0,0 +1,519 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = dataform_test$(EXEEXT) +subdir = src/tests/dataform +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_dataform_test_OBJECTS = dataform_test.$(OBJEXT) +dataform_test_OBJECTS = $(am_dataform_test_OBJECTS) +dataform_test_DEPENDENCIES = ../../tag.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../gloox.o \ + ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(dataform_test_SOURCES) +DIST_SOURCES = $(dataform_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +dataform_test_SOURCES = dataform_test.cpp +dataform_test_LDADD = ../../tag.o ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../gloox.o ../../util.o +dataform_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/dataform/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/dataform/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +dataform_test$(EXEEXT): $(dataform_test_OBJECTS) $(dataform_test_DEPENDENCIES) $(EXTRA_dataform_test_DEPENDENCIES) + @rm -f dataform_test$(EXEEXT) + $(CXXLINK) $(dataform_test_OBJECTS) $(dataform_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataform_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataform/dataform_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/dataform/dataform_test.cpp new file mode 100644 index 00000000..e255fa05 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataform/dataform_test.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../dataformfield.h" +#include "../../dataform.h" +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + DataForm *f; + + std::string title = "form test title"; + StringList instructions; + instructions.push_back( "form test instructions" ); + instructions.push_back( "line 2" ); + instructions.push_back( "line 3" ); + // ------- + name = "form type, title, instructions"; + // using StringList instructions from previous test case + // using std::string title from pre-previous test case + f = new DataForm( TypeForm, instructions, title ); + if( f->instructions() != instructions ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + if( f->title() != title ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + if( f->type() != TypeForm ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + + + + if( fail == 0 ) + { + printf( "DataForm: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "DataForm: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.am new file mode 100644 index 00000000..6810921b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = dataformfield_test + +dataformfield_test_SOURCES = dataformfield_test.cpp +dataformfield_test_LDADD = ../../tag.o ../../dataformfield.o ../../util.o ../../gloox.o +dataformfield_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.in new file mode 100644 index 00000000..56731ddb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = dataformfield_test$(EXEEXT) +subdir = src/tests/dataformfield +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_dataformfield_test_OBJECTS = dataformfield_test.$(OBJEXT) +dataformfield_test_OBJECTS = $(am_dataformfield_test_OBJECTS) +dataformfield_test_DEPENDENCIES = ../../tag.o ../../dataformfield.o \ + ../../util.o ../../gloox.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(dataformfield_test_SOURCES) +DIST_SOURCES = $(dataformfield_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +dataformfield_test_SOURCES = dataformfield_test.cpp +dataformfield_test_LDADD = ../../tag.o ../../dataformfield.o ../../util.o ../../gloox.o +dataformfield_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/dataformfield/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/dataformfield/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +dataformfield_test$(EXEEXT): $(dataformfield_test_OBJECTS) $(dataformfield_test_DEPENDENCIES) $(EXTRA_dataformfield_test_DEPENDENCIES) + @rm -f dataformfield_test$(EXEEXT) + $(CXXLINK) $(dataformfield_test_OBJECTS) $(dataformfield_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformfield_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/dataformfield_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/dataformfield_test.cpp new file mode 100644 index 00000000..273fb900 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformfield/dataformfield_test.cpp @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../dataformfield.h" +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + DataFormField *f; + + // ------- + name = "empty field"; + f = new DataFormField(); + if( f->type() != DataFormField::TypeTextSingle ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "TypeBoolean field"; + f = new DataFormField( DataFormField::TypeBoolean ); + if( f->type() != DataFormField::TypeBoolean ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "2nd ctor"; + f = new DataFormField( "fieldName", "fieldValue", "fieldLabel", DataFormField::TypeBoolean ); + if( f->type() != DataFormField::TypeBoolean || f->name() != "fieldName" || + f->value() != "fieldValue" || f->label() != "fieldLabel" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "parse 0"; + f = new DataFormField( 0 ); + if( f->type() != DataFormField::TypeInvalid ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + Tag*t; + + // ------- + name = "set name"; + f = new DataFormField(); + f->setName( name ); + if( f->name() != name ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "set required"; + f = new DataFormField(); + bool req = true; + f->setRequired( req ); + if( f->required() != req ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "set label"; + f = new DataFormField(); + f->setLabel( name ); + if( f->label() != name ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "set value"; + f = new DataFormField(); + f->setValue( name ); + if( f->value() != name ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "set values"; + f = new DataFormField(); + StringList val; + val.push_back( "val 1" ); + val.push_back( "val 2" ); + val.push_back( "val 3" ); + f->setValues( val ); + if( f->values() != val ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "set values"; + f = new DataFormField(); + StringMultiMap opt; + opt.insert( std::make_pair( "lock", "1" ) ); + opt.insert( std::make_pair( "stock", "1" ) ); + opt.insert( std::make_pair( "smoking barrel", "2" ) ); + f->setOptions( opt ); + if( f->options() != opt ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + + // ------- + name = "parse Tag 1"; + t = new Tag( "field"); + t->addAttribute( "type", "fixed" ); + new Tag( t, "value", "abc" ); + f = new DataFormField( t ); + Tag *ft = f->tag(); + if( *ft != *t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + delete f; + delete t; + delete ft; + f = 0; + + // ------- + t = new Tag( "field"); + t->addAttribute( "type", "list-multi" ); + t->addAttribute( "label", "blabla label" ); + t->addAttribute( "var", "features" ); + Tag *o = new Tag( t, "option" ); + o->addAttribute( "label", "lock" ); + new Tag( o, "value", "lock" ); + o = new Tag( t, "option" ); + o->addAttribute( "label", "stock" ); + new Tag( o, "value", "stock" ); + o = new Tag( t, "option" ); + o->addAttribute( "label", "smoking barrel" ); + new Tag( o, "value", "smoking barrel" ); + new Tag( t, "value", "lock" ); + new Tag( t, "value", "stock" ); + f = new DataFormField( t ); + Tag *r = f->tag(); + name = "parse Tag 2.1"; + if( r->name() != "field" || !r->hasAttribute( "type", "list-multi" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + + name = "parse Tag 2.2"; + if( !r->hasAttribute( "label", "blabla label" ) || !r->hasAttribute( "var", "features" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + + name = "parse Tag 2.3"; + if( !r->hasChild( "option" ) || !r->findChild( "option" )->hasAttribute( "label", "lock" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + + name = "parse Tag 2.4"; + if( !r->hasChild( "option", "label", "stock" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + + name = "parse Tag 2.5"; + if( !r->hasChild( "option", "label", "smoking barrel" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + + name = "parse Tag 2.6"; + if( !r->findChild( "option" )->findChild( "value" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + + name = "parse Tag 2.7"; + if( r->findChild( "option" )->findChild( "value" )->cdata() != "lock" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + + name = "parse Tag 2.8"; + TagList l = r->children(); + TagList::const_iterator it = l.begin(); + for( ; it != l.end(); ++it ) + { + if( (*it)->name() == "option" && ( !(*it)->hasChildWithCData( "value", "lock" ) && + !(*it)->hasChildWithCData( "value", "stock" ) && + !(*it)->hasChildWithCData( "value", "smoking barrel" ) ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + } + + name = "parse Tag 2.9"; + if( !r->hasChildWithCData( "value", "lock" ) || !r->hasChildWithCData( "value", "stock" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( "f->tag(): %s\n", f->tag()->xml().c_str() ); + printf( " t: %s\n", t->xml().c_str() ); + } + delete f; + delete t; + delete r; + f = 0; + + + + // ------- + name = "boolean duplicate "; + f = new DataFormField( DataFormField::TypeBoolean ); + f->setName( "name" ); + f->setValue( "1" ); + f->setLabel( "label" ); + t = f->tag(); + if( t->children().size() != 1 || t->xml() != "1" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete f; + delete t; + f = 0; + t = 0; + + + + + + + + + + if( fail == 0 ) + { + printf( "DataFormField: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "DataFormField: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.am new file mode 100644 index 00000000..a2b65d89 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = dataformitem_test + +dataformitem_test_SOURCES = dataformitem_test.cpp +dataformitem_test_LDADD = ../../dataformreported.o ../../tag.o \ + ../../dataform.o ../../gloox.o ../../dataformfieldcontainer.o ../../dataformfield.o ../../dataformitem.o \ + ../../util.o +dataformitem_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.in new file mode 100644 index 00000000..67b7b680 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/Makefile.in @@ -0,0 +1,521 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = dataformitem_test$(EXEEXT) +subdir = src/tests/dataformitem +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_dataformitem_test_OBJECTS = dataformitem_test.$(OBJEXT) +dataformitem_test_OBJECTS = $(am_dataformitem_test_OBJECTS) +dataformitem_test_DEPENDENCIES = ../../dataformreported.o ../../tag.o \ + ../../dataform.o ../../gloox.o ../../dataformfieldcontainer.o \ + ../../dataformfield.o ../../dataformitem.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(dataformitem_test_SOURCES) +DIST_SOURCES = $(dataformitem_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +dataformitem_test_SOURCES = dataformitem_test.cpp +dataformitem_test_LDADD = ../../dataformreported.o ../../tag.o \ + ../../dataform.o ../../gloox.o ../../dataformfieldcontainer.o ../../dataformfield.o ../../dataformitem.o \ + ../../util.o + +dataformitem_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/dataformitem/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/dataformitem/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +dataformitem_test$(EXEEXT): $(dataformitem_test_OBJECTS) $(dataformitem_test_DEPENDENCIES) $(EXTRA_dataformitem_test_DEPENDENCIES) + @rm -f dataformitem_test$(EXEEXT) + $(CXXLINK) $(dataformitem_test_OBJECTS) $(dataformitem_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformitem_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/dataformitem_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/dataformitem_test.cpp new file mode 100644 index 00000000..28ed9e87 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformitem/dataformitem_test.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../dataformitem.h" +#include "../../dataformfield.h" +#include "../../dataform.h" +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + DataFormItem *f; + Tag* t; + + // ------- + name = "empty form"; + f = new DataFormItem(); + t = f->tag(); + if( t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + delete t; + f = 0; + t = 0; + + // ------- + name = "one child"; + f = new DataFormItem(); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + t = f->tag(); + if( !t || t->xml() != "" + "value" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete f; + delete t; + f = 0; + t = 0; + + // ------- + name = "many children"; + f = new DataFormItem(); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeJidSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextMulti, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeJidMulti, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeListSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeListMulti, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + t = f->tag(); + if( !t || t->xml() != "" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete f; + delete t; + f = 0; + t = 0; + + + + + + + + + if( fail == 0 ) + { + printf( "DataFormItem: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "DataFormItem: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.am new file mode 100644 index 00000000..7c5f5d6c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = dataformreported_test + +dataformreported_test_SOURCES = dataformreported_test.cpp +dataformreported_test_LDADD = ../../dataformreported.o ../../tag.o \ + ../../dataform.o ../../gloox.o ../../dataformfieldcontainer.o ../../dataformfield.o ../../dataformitem.o \ + ../../util.o +dataformreported_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.in new file mode 100644 index 00000000..cf9a9f50 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = dataformreported_test$(EXEEXT) +subdir = src/tests/dataformreported +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_dataformreported_test_OBJECTS = dataformreported_test.$(OBJEXT) +dataformreported_test_OBJECTS = $(am_dataformreported_test_OBJECTS) +dataformreported_test_DEPENDENCIES = ../../dataformreported.o \ + ../../tag.o ../../dataform.o ../../gloox.o \ + ../../dataformfieldcontainer.o ../../dataformfield.o \ + ../../dataformitem.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(dataformreported_test_SOURCES) +DIST_SOURCES = $(dataformreported_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +dataformreported_test_SOURCES = dataformreported_test.cpp +dataformreported_test_LDADD = ../../dataformreported.o ../../tag.o \ + ../../dataform.o ../../gloox.o ../../dataformfieldcontainer.o ../../dataformfield.o ../../dataformitem.o \ + ../../util.o + +dataformreported_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/dataformreported/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/dataformreported/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +dataformreported_test$(EXEEXT): $(dataformreported_test_OBJECTS) $(dataformreported_test_DEPENDENCIES) $(EXTRA_dataformreported_test_DEPENDENCIES) + @rm -f dataformreported_test$(EXEEXT) + $(CXXLINK) $(dataformreported_test_OBJECTS) $(dataformreported_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dataformreported_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/dataformreported_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/dataformreported_test.cpp new file mode 100644 index 00000000..0e2da74f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/dataformreported/dataformreported_test.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../dataformreported.h" +#include "../../dataformfield.h" +#include "../../dataform.h" +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + DataFormReported *f; + Tag* t; + + // ------- + name = "empty form"; + f = new DataFormReported(); + t = f->tag(); + if( t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + delete t; + f = 0; + t = 0; + + // ------- + name = "one child"; + f = new DataFormReported(); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + t = f->tag(); + if( !t || t->xml() != "" + "value" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete f; + delete t; + f = 0; + t = 0; + + // ------- + name = "many children"; + f = new DataFormReported(); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeJidSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextMulti, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeJidMulti, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeListSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeListMulti, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + f->addField( DataFormField::TypeTextSingle, "name", "value", "label" ); + t = f->tag(); + if( !t || t->xml() != "" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "value" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete f; + delete t; + f = 0; + t = 0; + + + + + + + + + if( fail == 0 ) + { + printf( "DataFormReported: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "DataFormReported: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.am new file mode 100644 index 00000000..c7d57e8e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = delayeddelivery_test + +delayeddelivery_test_SOURCES = delayeddelivery_test.cpp +delayeddelivery_test_LDADD = ../../delayeddelivery.o ../../tag.o \ + ../../jid.o ../../prep.o ../../gloox.o ../../util.o +delayeddelivery_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.in new file mode 100644 index 00000000..dc7abe8b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = delayeddelivery_test$(EXEEXT) +subdir = src/tests/delayeddelivery +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_delayeddelivery_test_OBJECTS = delayeddelivery_test.$(OBJEXT) +delayeddelivery_test_OBJECTS = $(am_delayeddelivery_test_OBJECTS) +delayeddelivery_test_DEPENDENCIES = ../../delayeddelivery.o \ + ../../tag.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(delayeddelivery_test_SOURCES) +DIST_SOURCES = $(delayeddelivery_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +delayeddelivery_test_SOURCES = delayeddelivery_test.cpp +delayeddelivery_test_LDADD = ../../delayeddelivery.o ../../tag.o \ + ../../jid.o ../../prep.o ../../gloox.o ../../util.o + +delayeddelivery_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/delayeddelivery/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/delayeddelivery/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +delayeddelivery_test$(EXEEXT): $(delayeddelivery_test_OBJECTS) $(delayeddelivery_test_DEPENDENCIES) $(EXTRA_delayeddelivery_test_DEPENDENCIES) + @rm -f delayeddelivery_test$(EXEEXT) + $(CXXLINK) $(delayeddelivery_test_OBJECTS) $(delayeddelivery_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delayeddelivery_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/delayeddelivery_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/delayeddelivery_test.cpp new file mode 100644 index 00000000..68906a4d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/delayeddelivery/delayeddelivery_test.cpp @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../delayeddelivery.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + DelayedDelivery *d; + JID j( "abc@def/ghi" ); + Tag *x = new Tag( "delay", "reason" ); + x->addAttribute( "stamp", "invalidstamp" ); + x->addAttribute( "from", j.full() ); + x->addAttribute( "xmlns", XMLNS_DELAY ); + + // ------- + name = "parsing 0 tag"; + d = new DelayedDelivery( 0 ); + if( d->tag() != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/getters"; + d = new DelayedDelivery( j, "invalidstamp", "reason" ); + if( d->reason() != "reason" || d->stamp() != "invalidstamp" || d->from() != j ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + t = 0; + + // ------- + name = "filled object/tag()"; + d = new DelayedDelivery( j, "invalidstamp", "reason" ); + t = d->tag(); + if( !t || t->name() != "delay" || !t->hasAttribute( "xmlns", XMLNS_DELAY ) + || !t->hasAttribute( "from", j.full() ) || !t->hasAttribute( "stamp", "invalidstamp" ) + || t->cdata() != "reason" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + // ------- + name = "from Tag/getters"; + d = new DelayedDelivery( x ); + if( d->reason() != "reason" || d->stamp() != "invalidstamp" || d->from() != j ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + // ------- + name = "from Tag/tag()"; + d = new DelayedDelivery( x ); + t = d->tag(); + if( !t || t->name() != "delay" || !t->hasAttribute( "xmlns", XMLNS_DELAY ) + || !t->hasAttribute( "from", j.full() ) || !t->hasAttribute( "stamp", "invalidstamp" ) + || t->cdata() != "reason" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + + + delete x; + x = 0; + + + + if( fail == 0 ) + { + printf( "DelayedDelivery: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "DelayedDelivery: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.am new file mode 100644 index 00000000..cc0a7025 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.am @@ -0,0 +1,17 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = disco_test + +disco_test_SOURCES = disco_test.cpp +disco_test_LDADD = ../../tag.o ../../stanza.o \ + ../../prep.o \ + ../../gloox.o \ + ../../iq.o ../../util.o \ + ../../error.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../softwareversion.o +disco_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.in new file mode 100644 index 00000000..5a217897 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/disco/Makefile.in @@ -0,0 +1,527 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = disco_test$(EXEEXT) +subdir = src/tests/disco +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_disco_test_OBJECTS = disco_test.$(OBJEXT) +disco_test_OBJECTS = $(am_disco_test_OBJECTS) +disco_test_DEPENDENCIES = ../../tag.o ../../stanza.o ../../prep.o \ + ../../gloox.o ../../iq.o ../../util.o ../../error.o \ + ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../softwareversion.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(disco_test_SOURCES) +DIST_SOURCES = $(disco_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +disco_test_SOURCES = disco_test.cpp +disco_test_LDADD = ../../tag.o ../../stanza.o \ + ../../prep.o \ + ../../gloox.o \ + ../../iq.o ../../util.o \ + ../../error.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../softwareversion.o + +disco_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/disco/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/disco/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +disco_test$(EXEEXT): $(disco_test_OBJECTS) $(disco_test_DEPENDENCIES) $(EXTRA_disco_test_DEPENDENCIES) + @rm -f disco_test$(EXEEXT) + $(CXXLINK) $(disco_test_OBJECTS) $(disco_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/disco_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/disco/disco_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/disco/disco_test.cpp new file mode 100644 index 00000000..c6e320ee --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/disco/disco_test.cpp @@ -0,0 +1,414 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../jid.h" +#include "../../error.h" + +#include +#include +#include +#include // [s]print[f] + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() : m_disco( 0 ) {} + virtual ~ClientBase() {} + Disco* disco() { return m_disco; } + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( const IQ& iq ) = 0; + virtual void send( const IQ& iq, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ih ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + protected: + Disco* m_disco; + private: + JID m_jid; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::removeIDHandler( IqHandler* ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* ext ) { delete ext; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define DISCO_TEST +#define DISCO_INFO_TEST +#define DISCO_ITEMS_TEST +#include "../../disco.h" +#include "../../disco.cpp" +#include "../../discohandler.h" +#include "../../disconodehandler.h" +class DiscoTest : public ClientBase, public DiscoHandler, public DiscoNodeHandler +{ + public: + DiscoTest() : m_result( false ) {} + ~DiscoTest() {} + void setTest( int test ) { m_test = test; } + void setDisco( Disco* disco ) { m_disco = disco; } + virtual void send( const IQ& iq ); + virtual void send( const IQ& iq, IqHandler*, int ); + virtual void trackID( IqHandler *ih, const std::string& id, int context ); + virtual StringList handleDiscoNodeFeatures( const JID&, const std::string& ) + { + StringList sl; + if( m_test == 6 ) + sl.push_back( "test6-feature" ); + return sl; + } + virtual Disco::IdentityList handleDiscoNodeIdentities( const JID&, + const std::string& ) + { + Disco::IdentityList dil; + if( m_test == 6 ) + dil.push_back( new Disco::Identity( "6cat", "6type", "6name" ) ); + return dil; + } + virtual Disco::ItemList handleDiscoNodeItems( const JID&, + const JID&, const std::string& = EmptyString ) + { + Disco::ItemList dil; + if( m_test == 7 ) + dil.push_back( new Disco::Item( JID( "6jid" ), "6node", "6name" ) ); + return dil; + } + + virtual void handleDiscoInfo( const JID& /*from*/, const Disco::Info& info, int /*context*/ ) + { + if( m_test == 8 && info.hasFeature( XMLNS_DISCO_INFO ) && info.hasFeature( "foofeature" ) + && info.hasFeature( "foofeature2" ) ) + m_result = true; + } + virtual void handleDiscoInfoResult( IQ*, int ) {} // FIXME remove for 1.1 + virtual void handleDiscoItems( const JID& /*from*/, const Disco::Items& items, int /*context*/ ) + { + if( m_test == 9 && items.node() == "foonode" && items.items().size() == 2 ) + m_result = true; + } + virtual void handleDiscoItemsResult( IQ*, int ) {} // FIXME remove for 1.1 + virtual void handleDiscoError( const JID& /*from*/, const Error* error, int /*context*/ ) + { + if( m_test == 10 && error && error->error() == StanzaErrorItemNotFound ) + m_result = true; + } + virtual void handleDiscoError( IQ*, int ) {} // FIXME remove for 1.1 + virtual bool handleDiscoSet( IQ* iq ) { (void)iq; return false; } + bool checkResult() { bool t = m_result; m_result = false; return t; } + private: + Disco* m_disco; + int m_test; + bool m_result; +}; + +void DiscoTest::send( const IQ& iq ) +{ +// printf( "send: %s\n", iq.tag()->xml().c_str() ); + if( m_test == 1 ) + { + const Disco::Info* se = iq.findExtension( ExtDiscoInfo ); + if( se && se->hasFeature( "foofeature" ) && se->hasFeature( "foofeature2" ) + && se->identities().size() == 2 ) + { + m_result = true; + } + } + else if( m_test == 2 ) + { + const Disco::Info* se = iq.findExtension( ExtDiscoInfo ); + if( se && se->hasFeature( "foofeature" ) && !se->hasFeature( "foofeature2" ) + && se->identities().size() == 1 ) + { + m_result = true; + } + } + else if( m_test == 3 ) + { + const Disco::Items* se = iq.findExtension( ExtDiscoItems ); + if( se && se->node().empty() && se->items().size() == 0 ) + { + m_result = true; + } + } + else if( m_test == 4 ) + { + const Error* e = iq.findExtension( ExtError ); + if( e && e->error() == StanzaErrorItemNotFound ) + { + m_result = true; + } + } + else if( m_test == 5 ) + { + const Error* e = iq.findExtension( ExtError ); + if( e && e->error() == StanzaErrorItemNotFound ) + { + m_result = true; + } + } + else if( m_test == 6 ) + { + const Disco::Info* se = iq.findExtension( ExtDiscoInfo ); + if( se && se->node() == "foonode" && se->hasFeature( XMLNS_DISCO_INFO ) + && se->hasFeature( XMLNS_DISCO_ITEMS ) + && se->hasFeature( "test6-feature" ) && se->features().size() == 3 ) + { + m_result = true; + } + } + else if( m_test == 7 ) + { + const Disco::Items* se = iq.findExtension( ExtDiscoItems ); + if( se && se->node() == "foonode" && se->items().size() == 1 ) + { + m_result = true; + } + } +} +void DiscoTest::send( const IQ& iq, IqHandler*, int ctx ) +{ + Tag* q = 0; + if( m_test == 8 ) + { + IQ re( IQ::Result, iq.from(), iq.id() ); + q = new Tag( "query" ); + q->setXmlns( XMLNS_DISCO_INFO ); + new Tag( q, "feature", "var", XMLNS_DISCO_INFO ); + new Tag( q, "feature", "var", "foofeature" ); + new Tag( q, "feature", "var", "foofeature2" ); + re.addExtension( new Disco::Info( q ) ); + m_disco->handleIqID( re, ctx ); + } + else if( m_test == 9 ) + { + IQ re( IQ::Result, iq.from(), iq.id() ); + q = new Tag( "query" ); + q->setXmlns( XMLNS_DISCO_ITEMS ); + q->addAttribute( "node", "foonode" ); + Tag* i = new Tag( q, "item", "jid", "jid1" ); + i->addAttribute( "node", "node1" ); + i->addAttribute( "name", "name1" ); + i = new Tag( q, "item", "jid", "jid2" ); + i->addAttribute( "node", "node2" ); + i->addAttribute( "name", "name2" ); + re.addExtension( new Disco::Items( q ) ); + m_disco->handleIqID( re, ctx ); + } + else if( m_test == 10 ) + { + IQ re( IQ::Error, iq.from(), iq.id() ); + re.addExtension( new Error( StanzaErrorTypeCancel, StanzaErrorItemNotFound ) ); + m_disco->handleIqID( re, ctx ); + } + + delete q; +} +void DiscoTest::trackID( IqHandler*, const std::string&, int ) {} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + DiscoTest* dt = new DiscoTest(); + Disco* d = new Disco( dt ); + dt->setDisco( d ); + + + // ------- + { + name = "disco info"; + dt->setTest( 1 ); + d->addFeature( "foofeature" ); + d->addFeature( "foofeature2" ); + d->setIdentity( "foocat", "footype", "fooname" ); + d->addIdentity( "foocat2", "footype2", "fooname2" ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Info() ); + d->handleIq( iq ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "disco info"; + dt->setTest( 2 ); + d->removeFeature( "foofeature2" ); + d->setIdentity( "foocat", "footype", "fooname" ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Info() ); + d->handleIq( iq ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "disco items"; + dt->setTest( 3 ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Items() ); + d->handleIq( iq ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "info for non-existant node"; + dt->setTest( 4 ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Info( "foonode" ) ); + d->handleIq( iq ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "items for non-existant node"; + dt->setTest( 5 ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Items( "foonode" ) ); + d->handleIq( iq ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "info for a specific node"; + dt->setTest( 6 ); + d->registerNodeHandler( dt, "foonode" ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Info( "foonode" ) ); + d->handleIq( iq ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "items for a specific node"; + dt->setTest( 7 ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Items( "foonode" ) ); + d->handleIq( iq ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "getDiscoInfo()"; + dt->setTest( 8 ); + d->getDiscoInfo( JID( "foof" ), EmptyString, dt, 0 ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "getDiscoItems()"; + dt->setTest( 9 ); + d->getDiscoItems( JID( "foof" ), "foonode", dt, 0 ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "getDiscoInfo() error"; + dt->setTest( 10 ); + d->getDiscoInfo( JID( "foof" ), "fooof", dt, 0 ); + if( !dt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "remove node handlers"; + dt->setTest( 7 ); // intentional + d->removeNodeHandlers( dt ); + IQ iq( IQ::Get, JID(), dt->getID() ); + iq.addExtension( new Disco::Items( "foonode" ) ); + d->handleIq( iq ); + if( dt->checkResult() ) // should fail, as there's no handler for foonode anymore + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + + + + + delete d; + delete dt; + + + if( fail == 0 ) + { + printf( "Disco: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Disco: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.am new file mode 100644 index 00000000..62372ac3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.am @@ -0,0 +1,23 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = discoinfo_test + +discoinfo_test_SOURCES = discoinfo_test.cpp +discoinfo_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o +discoinfo_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.in new file mode 100644 index 00000000..e08738d6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/Makefile.in @@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = discoinfo_test$(EXEEXT) +subdir = src/tests/discoinfo +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_discoinfo_test_OBJECTS = discoinfo_test.$(OBJEXT) +discoinfo_test_OBJECTS = $(am_discoinfo_test_OBJECTS) +discoinfo_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../gloox.o \ + ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(discoinfo_test_SOURCES) +DIST_SOURCES = $(discoinfo_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +discoinfo_test_SOURCES = discoinfo_test.cpp +discoinfo_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +discoinfo_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/discoinfo/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/discoinfo/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +discoinfo_test$(EXEEXT): $(discoinfo_test_OBJECTS) $(discoinfo_test_DEPENDENCIES) $(EXTRA_discoinfo_test_DEPENDENCIES) + @rm -f discoinfo_test$(EXEEXT) + $(CXXLINK) $(discoinfo_test_OBJECTS) $(discoinfo_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discoinfo_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/discoinfo_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/discoinfo_test.cpp new file mode 100644 index 00000000..06bb8810 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/discoinfo/discoinfo_test.cpp @@ -0,0 +1,166 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define DISCO_INFO_TEST +#include "../../disco.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty disco#info request"; + Disco::Info di; + t = di.tag(); + if( t->xml() != "" + || !di.node().empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "empty (default) disco#info reply"; + Disco::Info di( EmptyString, true ); + t = di.tag(); + if( t->xml() != "" + "" + "" + "" + || !di.node().empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "empty disco#info request + node + default features"; + Disco::Info di( "somenode", true ); + t = di.tag(); + if( t->xml() != "" + "" + "" + "" + || di.node() != "somenode" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "empty disco#info request + node - default features"; + Disco::Info di( "somenode" ); + t = di.tag(); + if( t->xml() != "" + || di.node() != "somenode" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "setnode()"; + Disco::Info di( "somenode" ); + di.setNode( "othernode" ); + if( di.node() != "othernode" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "Tag ctor"; + t = new Tag( "query" ); + t->setXmlns( XMLNS_DISCO_INFO ); + t->addAttribute( "node", "somenode" ); + Tag* i = new Tag( t, "identity", "category", "category1" ); + i->addAttribute( "type", "type1" ); + i->addAttribute( "name", "name1" ); + i = new Tag( t, "identity", "category", "category2" ); + i->addAttribute( "type", "type1" ); + i->addAttribute( "name", "name1" ); + i = new Tag( t, "identity", "category", "category3" ); + i->addAttribute( "type", "type1" ); + i->addAttribute( "name", "name1" ); + new Tag( t, "feature", "var", "foo1" ); + new Tag( t, "feature", "var", "foo2" ); + new Tag( t, "feature", "var", "foo3" ); + Disco::Info di( t ); + if( di.node() != "somenode" || di.identities().size() != 3 || di.features().size() != 3 + || !di.hasFeature( "foo1" ) || !di.hasFeature( "foo2" ) || !di.hasFeature( "foo3" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + name = "Disco::Info/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new Disco::Info() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_DISCO_INFO ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const Disco::Info* se = iq.findExtension( ExtDiscoInfo ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + if( fail == 0 ) + { + printf( "Disco::Info: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Disco::Info: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.am new file mode 100644 index 00000000..3ef46daa --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.am @@ -0,0 +1,23 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = discoitems_test + +discoitems_test_SOURCES = discoitems_test.cpp +discoitems_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o +discoitems_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.in new file mode 100644 index 00000000..0c473f12 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/discoitems/Makefile.in @@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = discoitems_test$(EXEEXT) +subdir = src/tests/discoitems +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_discoitems_test_OBJECTS = discoitems_test.$(OBJEXT) +discoitems_test_OBJECTS = $(am_discoitems_test_OBJECTS) +discoitems_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../gloox.o \ + ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(discoitems_test_SOURCES) +DIST_SOURCES = $(discoitems_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +discoitems_test_SOURCES = discoitems_test.cpp +discoitems_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +discoitems_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/discoitems/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/discoitems/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +discoitems_test$(EXEEXT): $(discoitems_test_OBJECTS) $(discoitems_test_DEPENDENCIES) $(EXTRA_discoitems_test_DEPENDENCIES) + @rm -f discoitems_test$(EXEEXT) + $(CXXLINK) $(discoitems_test_OBJECTS) $(discoitems_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/discoitems_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/discoitems/discoitems_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/discoitems/discoitems_test.cpp new file mode 100644 index 00000000..df24d2a7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/discoitems/discoitems_test.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define DISCO_ITEMS_TEST +#include "../../disco.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty disco#items request"; + Disco::Items di; + t = di.tag(); + if( !t || t->xml() != "" + || !di.node().empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "empty disco#items request + node"; + Disco::Items di( "somenode" ); + t = di.tag(); + if( t->xml() != "" + || di.node() != "somenode" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "Tag ctor"; + t = new Tag( "query" ); + t->setXmlns( XMLNS_DISCO_ITEMS ); + t->addAttribute( "node", "somenode" ); + Tag* i = new Tag( t, "item", "jid", "jid1" ); + i->addAttribute( "node", "node1" ); + i->addAttribute( "name", "name1" ); + i = new Tag( t, "item", "jid", "jid2" ); + i->addAttribute( "node", "node2" ); + i->addAttribute( "name", "name2" ); + i = new Tag( t, "item", "jid", "jid3" ); + i->addAttribute( "node", "node3" ); + i->addAttribute( "name", "name3" ); + Disco::Items di( t ); + Disco::Item* item = 0; + if( di.node() != "somenode" || di.items().size() != 3 || !( item = *(di.items().begin()) ) + || item->name() != "name1" || item->node() != "node1" || item->jid() != "jid1" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + name = "Disco::Items/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new Disco::Items() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_DISCO_ITEMS ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const Disco::Items* se = iq.findExtension( ExtDiscoItems ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + if( fail == 0 ) + { + printf( "Disco::Items: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Disco::Items: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.am new file mode 100644 index 00000000..9c437587 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = error_test + +error_test_SOURCES = error_test.cpp +error_test_LDADD = ../../error.o ../../tag.o ../../gloox.o ../../util.o +error_test_CFLAGS = $(CPPFLAGS) + diff --git a/smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.in new file mode 100644 index 00000000..88180c59 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/error/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = error_test$(EXEEXT) +subdir = src/tests/error +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_error_test_OBJECTS = error_test.$(OBJEXT) +error_test_OBJECTS = $(am_error_test_OBJECTS) +error_test_DEPENDENCIES = ../../error.o ../../tag.o ../../gloox.o \ + ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(error_test_SOURCES) +DIST_SOURCES = $(error_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +error_test_SOURCES = error_test.cpp +error_test_LDADD = ../../error.o ../../tag.o ../../gloox.o ../../util.o +error_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/error/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/error/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +error_test$(EXEEXT): $(error_test_OBJECTS) $(error_test_DEPENDENCIES) $(EXTRA_error_test_DEPENDENCIES) + @rm -f error_test$(EXEEXT) + $(CXXLINK) $(error_test_OBJECTS) $(error_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/error_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/error/error_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/error/error_test.cpp new file mode 100644 index 00000000..f759bc7a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/error/error_test.cpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../error.h" +#include "../../tag.h" +#include "../../gloox.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + + Tag * error = new Tag( "error" ); + error->addAttribute( "type", "auth" ); + new Tag( error, "feature-not-implemented", "xmlns", XMLNS_XMPP_STANZAS ); + Tag * text = new Tag( error, "text", "xmlns", XMLNS_XMPP_STANZAS ); + text->addAttribute( "xml:lang", "" ); + text->setCData( "shit happens" ); + Tag * appErr = new Tag( error, "unsupported", "xmlns", "errorNS" ); + appErr->addAttribute( "feature", "f" ); + + std::string name = ""; + Error *e = new Error( error ); + if( e->type() != StanzaErrorTypeAuth || e->error() != StanzaErrorFeatureNotImplemented + || e->appError()->xml() != "" + || e->text() != "shit happens" ) + { + fprintf( stderr, "failed: '%s' test\n", name.c_str() ); + printf( "type == %d, should be %d\n", e->type(), StanzaErrorTypeAuth ); + printf( "err == %d, should be %d\n", e->error(), StanzaErrorFeatureNotImplemented ); + printf( "xml: %s\n", e->appError()->xml().c_str() ); + printf( "text: %s\n", e->text().c_str() ); + ++fail; + } + // ------- + + delete error; + delete e; + + + if( fail == 0 ) + { + printf( "Error: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Error: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.am new file mode 100644 index 00000000..64b58757 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.am @@ -0,0 +1,14 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = featureneg_test + +featureneg_test_SOURCES = featureneg_test.cpp +featureneg_test_LDADD = ../../tag.o ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../gloox.o ../../util.o \ + ../../featureneg.o ../../stanzaextensionfactory.o ../../iq.o ../../message.o \ + ../../stanza.o ../../jid.o ../../prep.o ../../mutex.o +featureneg_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.in new file mode 100644 index 00000000..498d4105 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/featureneg/Makefile.in @@ -0,0 +1,525 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = featureneg_test$(EXEEXT) +subdir = src/tests/featureneg +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_featureneg_test_OBJECTS = featureneg_test.$(OBJEXT) +featureneg_test_OBJECTS = $(am_featureneg_test_OBJECTS) +featureneg_test_DEPENDENCIES = ../../tag.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../gloox.o \ + ../../util.o ../../featureneg.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../message.o ../../stanza.o ../../jid.o \ + ../../prep.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(featureneg_test_SOURCES) +DIST_SOURCES = $(featureneg_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +featureneg_test_SOURCES = featureneg_test.cpp +featureneg_test_LDADD = ../../tag.o ../../dataform.o ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../gloox.o ../../util.o \ + ../../featureneg.o ../../stanzaextensionfactory.o ../../iq.o ../../message.o \ + ../../stanza.o ../../jid.o ../../prep.o ../../mutex.o + +featureneg_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/featureneg/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/featureneg/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +featureneg_test$(EXEEXT): $(featureneg_test_OBJECTS) $(featureneg_test_DEPENDENCIES) $(EXTRA_featureneg_test_DEPENDENCIES) + @rm -f featureneg_test$(EXEEXT) + $(CXXLINK) $(featureneg_test_OBJECTS) $(featureneg_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/featureneg_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/featureneg/featureneg_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/featureneg/featureneg_test.cpp new file mode 100644 index 00000000..3654908a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/featureneg/featureneg_test.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../message.h" +#include "../../featureneg.h" +#include "../../dataform.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + + int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty tag() test"; + FeatureNeg fn; + t = fn.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "tag() test"; + FeatureNeg fn( new DataForm( TypeForm ) ); + t = fn.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + // t re-used in next test + } + + // ------- + { + name = "parse tag"; + FeatureNeg fn( t ); // re-using t from previous test + Tag* t2 = fn.tag(); + if( !t2 || *t2 != *t ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t2; + delete t; + t = 0; + } + + // ------- + name = "FeatureNeg/SEFactory test (IQ)"; + StanzaExtensionFactory sef; + sef.registerExtension( new FeatureNeg() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "feature", "xmlns", XMLNS_FEATURE_NEG ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const FeatureNeg* se = iq.findExtension( ExtFeatureNeg ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + // ------- + name = "FeatureNeg/SEFactory test (Message)"; + f = new Tag( "message" ); + new Tag( f, "feature", "xmlns", XMLNS_FEATURE_NEG ); + Message msg( Message::Normal, JID() ); + sef.addExtensions( msg, f ); + se = msg.findExtension( ExtFeatureNeg ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + if( fail == 0 ) + { + printf( "FeatureNeg: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "FeatureNeg: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.am new file mode 100644 index 00000000..d2cf3de1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.am @@ -0,0 +1,17 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = flexoffline_test + +flexoffline_test_SOURCES = flexoffline_test.cpp +flexoffline_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o +flexoffline_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.in new file mode 100644 index 00000000..231d0747 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/Makefile.in @@ -0,0 +1,528 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = flexoffline_test$(EXEEXT) +subdir = src/tests/flexoffline +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_flexoffline_test_OBJECTS = flexoffline_test.$(OBJEXT) +flexoffline_test_OBJECTS = $(am_flexoffline_test_OBJECTS) +flexoffline_test_DEPENDENCIES = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o ../../gloox.o \ + ../../iq.o ../../stanza.o ../../error.o \ + ../../dataformfieldcontainer.o ../../dataform.o \ + ../../dataformfield.o ../../dataformitem.o \ + ../../softwareversion.o ../../dataformreported.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(flexoffline_test_SOURCES) +DIST_SOURCES = $(flexoffline_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +flexoffline_test_SOURCES = flexoffline_test.cpp +flexoffline_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o + +flexoffline_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/flexoffline/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/flexoffline/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +flexoffline_test$(EXEEXT): $(flexoffline_test_OBJECTS) $(flexoffline_test_DEPENDENCIES) $(EXTRA_flexoffline_test_DEPENDENCIES) + @rm -f flexoffline_test$(EXEEXT) + $(CXXLINK) $(flexoffline_test_OBJECTS) $(flexoffline_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flexoffline_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/flexoffline_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/flexoffline_test.cpp new file mode 100644 index 00000000..08ce1260 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/flexoffline/flexoffline_test.cpp @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../jid.h" +#include "../../tag.h" +#include "../../iqhandler.h" +#include "../../disco.h" +#include "../../flexoffhandler.h" + +#include +#include +#include +#include // [s]print[f] + +const std::string& g_dir = "test.dir"; +const std::string& g_inst = "the instructions"; +const std::string& g_profile = "test-prof"; + +gloox::Tag* t1 = 0; +gloox::Tag* t2 = 0; +const gloox::JID g_jid( "abc@def.gh/ijk" ); + +namespace gloox +{ + +// class Disco +// { +// public: +// Disco(); +// ~Disco(); +// void addFeature( const std::string& feature ); +// void removeFeature( const std::string& feature ); +// }; +// Disco::Disco() {} +// Disco::~Disco() {} +// void Disco::addFeature( const std::string& /*feature*/ ) {} +// void Disco::removeFeature( const std::string& /*feature*/ ) {} + + class ClientBase : public FlexibleOfflineHandler + { + public: + ClientBase(); + ~ClientBase(); + const std::string getID(); + Disco* disco(); + void send( IQ& iq, IqHandler* = 0 , int = 0 ); + void trackID( IqHandler *ih, const std::string& id, int context ); + void registerIqHandler( IqHandler *ih, const int ext ); + void removeIqHandler( IqHandler* ih, const int ext ); + void removeIDHandler( IqHandler* ) {} + void registerStanzaExtension( StanzaExtension* se ); + void removeStanzaExtension( int /*ext*/ ) {} + virtual void handleFlexibleOfflineSupport( bool /*support*/ ) {} + virtual void handleFlexibleOfflineMsgNum( int /*num*/ ) {} + virtual void handleFlexibleOfflineMessageHeaders( const Disco::ItemList& /*headers*/ ) {} + virtual void handleFlexibleOfflineResult( FlexibleOfflineResult /*foResult*/ ) {} + const JID& jid() const { return g_jid; } + void setTest( int test ); + bool ok(); + private: + Disco* m_disco; + int m_test; + bool m_ok; + }; + ClientBase::ClientBase() : m_disco( new Disco( this ) ), m_test( 0 ), m_ok( false ) {} + ClientBase::~ClientBase() { delete m_disco; } + const std::string ClientBase::getID() { return "id"; } + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::send( IQ& iq, IqHandler*, int ) + { + Tag* tag = iq.tag(); + switch( m_test ) + { + case 1: + { + break; + } + } + delete tag; + } + void ClientBase::trackID( IqHandler* /*ih*/, const std::string& /*id*/, int /*context*/ ) {} + void ClientBase::registerIqHandler( IqHandler* /*ih*/, const int /*ext*/ ) {} + void ClientBase::removeIqHandler( IqHandler* /*ih*/, const int /*ext*/ ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* /*se*/ ) {} + void ClientBase::setTest( int test ) { m_test = test; } + bool ClientBase::ok() { bool t = m_ok; m_ok = false; return t; } +} + +#define CLIENTBASE_H__ +#define DISCO_H__ +#include "../../disco.cpp" +#include "../../flexoff.h" +#include "../../flexoff.cpp" +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + gloox::FlexibleOffline* fo = 0; + + gloox::ClientBase* cb = new gloox::ClientBase(); + fo = new gloox::FlexibleOffline( cb ); + + + // ------- + name = "request si"; + // ... + if( false ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + + + + + delete fo; + delete cb; + + printf( "FlexOffline: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.am new file mode 100644 index 00000000..fc9bd07d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.am @@ -0,0 +1,16 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = flexofflineoffline_test + +flexofflineoffline_test_SOURCES = flexofflineoffline_test.cpp +flexofflineoffline_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o ../../mutex.o +flexofflineoffline_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.in new file mode 100644 index 00000000..9ac49714 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/Makefile.in @@ -0,0 +1,529 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = flexofflineoffline_test$(EXEEXT) +subdir = src/tests/flexofflineoffline +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_flexofflineoffline_test_OBJECTS = \ + flexofflineoffline_test.$(OBJEXT) +flexofflineoffline_test_OBJECTS = \ + $(am_flexofflineoffline_test_OBJECTS) +flexofflineoffline_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o ../../dataformitem.o \ + ../../softwareversion.o ../../dataformreported.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(flexofflineoffline_test_SOURCES) +DIST_SOURCES = $(flexofflineoffline_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +flexofflineoffline_test_SOURCES = flexofflineoffline_test.cpp +flexofflineoffline_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o ../../mutex.o + +flexofflineoffline_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/flexofflineoffline/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/flexofflineoffline/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +flexofflineoffline_test$(EXEEXT): $(flexofflineoffline_test_OBJECTS) $(flexofflineoffline_test_DEPENDENCIES) $(EXTRA_flexofflineoffline_test_DEPENDENCIES) + @rm -f flexofflineoffline_test$(EXEEXT) + $(CXXLINK) $(flexofflineoffline_test_OBJECTS) $(flexofflineoffline_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/flexofflineoffline_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/flexofflineoffline_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/flexofflineoffline_test.cpp new file mode 100644 index 00000000..463a525b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/flexofflineoffline/flexofflineoffline_test.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../base64.h" +#include "../../stanzaextensionfactory.h" +#include "../../disco.h" +#include "../../flexoffhandler.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() : m_disco( new Disco( this ) ) {} + virtual ~ClientBase() { delete m_disco; } + Disco* disco(); + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + private: + Disco* m_disco; + JID m_jid; + }; + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define FLEXOFF_TEST +#include "../../disco.cpp" +#include "../../flexoff.h" +#include "../../flexoff.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + // ------- + { + name = "empty tag() test"; + FlexibleOffline::Offline foo; + if( false ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + + StanzaExtensionFactory sef; + sef.registerExtension( new FlexibleOffline::Offline() ); + // ------- + { + name = "FlexibleOffline::Offline/SEFactory test"; + Tag* f = new Tag( "iq" ); + new Tag( f, "offline", "xmlns", XMLNS_OFFLINE ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const FlexibleOffline::Offline* se = iq.findExtension( ExtFlexOffline ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + printf( "FlexibleOffline::Offline: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.am new file mode 100644 index 00000000..1f01dcbf --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.am @@ -0,0 +1,30 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = forward_test + +forward_test_SOURCES = forward_test.cpp +forward_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../message.o \ + ../../forward.o ../../delayeddelivery.o \ + ../../clientbase.o ../../client.o \ + ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../messagesession.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../rostermanager.o ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../rosteritem.o ../../privatexml.o ../../tlsgnutlsbase.o \ + ../../tlsdefault.o ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../presence.o ../../subscription.o \ + ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o ../../attention.o +forward_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.in new file mode 100644 index 00000000..58517e79 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/forward/Makefile.in @@ -0,0 +1,555 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = forward_test$(EXEEXT) +subdir = src/tests/forward +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_forward_test_OBJECTS = forward_test.$(OBJEXT) +forward_test_OBJECTS = $(am_forward_test_OBJECTS) +forward_test_DEPENDENCIES = ../../jid.o ../../tag.o ../../logsink.o \ + ../../prep.o ../../util.o ../../gloox.o ../../iq.o \ + ../../stanza.o ../../error.o ../../message.o ../../forward.o \ + ../../delayeddelivery.o ../../clientbase.o ../../client.o \ + ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../messagesession.o \ + ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../rostermanager.o \ + ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../rosteritem.o \ + ../../privatexml.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../presence.o ../../subscription.o \ + ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o ../../atomicrefcount.o \ + ../../attention.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(forward_test_SOURCES) +DIST_SOURCES = $(forward_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +forward_test_SOURCES = forward_test.cpp +forward_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../message.o \ + ../../forward.o ../../delayeddelivery.o \ + ../../clientbase.o ../../client.o \ + ../../connectiontcpbase.o ../../connectiontcpclient.o \ + ../../disco.o ../../parser.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../messagesession.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../rostermanager.o ../../nonsaslauth.o ../../sha.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o \ + ../../rosteritem.o ../../privatexml.o ../../tlsgnutlsbase.o \ + ../../tlsdefault.o ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../presence.o ../../subscription.o \ + ../../capabilities.o ../../eventdispatcher.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o ../../attention.o + +forward_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/forward/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/forward/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +forward_test$(EXEEXT): $(forward_test_OBJECTS) $(forward_test_DEPENDENCIES) $(EXTRA_forward_test_DEPENDENCIES) + @rm -f forward_test$(EXEEXT) + $(CXXLINK) $(forward_test_OBJECTS) $(forward_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/forward_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/forward/forward_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/forward/forward_test.cpp new file mode 100644 index 00000000..edf4aa04 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/forward/forward_test.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../jid.h" +#include "../../delayeddelivery.h" +#include "../../forward.h" +#include "../../message.h" +#include "../../messagehandler.h" +#include "../../client.h" +#include "../../attention.h" + +#include +#include +#include // [s]print[f] + +using namespace gloox; + + + class ForwardTest : public MessageHandler + { + public: + ForwardTest() : cb( "foo" ) + { + cb.registerMessageHandler( this ); + cb.registerStanzaExtension( new Forward() ); + cb.registerStanzaExtension( new Attention() ); + } + ~ForwardTest() {} + void testTag( Tag* tag ) { cb.handleTag( tag ); } + virtual void handleMessage( const Message& msg, MessageSession* ) + { + Tag* m = msg.tag(); + m_xml = m->xml(); +// printf( "msg: %s\n", m->xml().c_str() ); + delete m; + } + const std::string& getXml() { return m_xml; } + private: + Client cb; + std::string m_xml; + }; + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + Message m( Message::Chat, JID( "a@b/c" ), "body test", "subject" ); + Message* fm = new Message( Message::Headline, JID( "d@e/f" ), "headline test", "headline subject" ); + fm->addExtension( new Attention() ); + DelayedDelivery* d = new DelayedDelivery( JID( "from@me/res" ), "thestamp" ); + Forward* f = new Forward( fm, d ); + m.addExtension( f ); + + Tag* tag = m.tag(); + ForwardTest t; + t.testTag( tag ); + + + + + // ------- + name = "create Forward 1"; + if( tag->xml() != t.getXml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed:\n%s\n---\n%s\n", name.c_str(), tag->xml().c_str(), t.getXml().c_str() ); + } + + + + + + + + + + printf( "Forward: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.am new file mode 100644 index 00000000..de27b8c7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = gpgencrypted_test + +gpgencrypted_test_SOURCES = gpgencrypted_test.cpp +gpgencrypted_test_LDADD = ../../gpgencrypted.o ../../tag.o ../../gloox.o ../../util.o +gpgencrypted_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.in new file mode 100644 index 00000000..c41b5b6a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = gpgencrypted_test$(EXEEXT) +subdir = src/tests/gpgencrypted +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_gpgencrypted_test_OBJECTS = gpgencrypted_test.$(OBJEXT) +gpgencrypted_test_OBJECTS = $(am_gpgencrypted_test_OBJECTS) +gpgencrypted_test_DEPENDENCIES = ../../gpgencrypted.o ../../tag.o \ + ../../gloox.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(gpgencrypted_test_SOURCES) +DIST_SOURCES = $(gpgencrypted_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +gpgencrypted_test_SOURCES = gpgencrypted_test.cpp +gpgencrypted_test_LDADD = ../../gpgencrypted.o ../../tag.o ../../gloox.o ../../util.o +gpgencrypted_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/gpgencrypted/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/gpgencrypted/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +gpgencrypted_test$(EXEEXT): $(gpgencrypted_test_OBJECTS) $(gpgencrypted_test_DEPENDENCIES) $(EXTRA_gpgencrypted_test_DEPENDENCIES) + @rm -f gpgencrypted_test$(EXEEXT) + $(CXXLINK) $(gpgencrypted_test_OBJECTS) $(gpgencrypted_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgencrypted_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/gpgencrypted_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/gpgencrypted_test.cpp new file mode 100644 index 00000000..c4774367 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/gpgencrypted/gpgencrypted_test.cpp @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../gpgencrypted.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + GPGEncrypted *d; + Tag *x = new Tag( "x", "invalidencrypted" ); + x->addAttribute( "xmlns", XMLNS_X_GPGENCRYPTED ); + + // ------- + name = "parsing 0 tag"; + d = new GPGEncrypted( 0 ); + if( d->tag() != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/getters"; + d = new GPGEncrypted( "invalidencrypted" ); + if( d->encrypted() != "invalidencrypted" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/tag()"; + d = new GPGEncrypted( "invalidencrypted" ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_GPGENCRYPTED ) + || t->cdata() != "invalidencrypted" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + // ------- + name = "from Tag/getters"; + d = new GPGEncrypted( x ); + if( d->encrypted() != "invalidencrypted" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + t = 0; + + // ------- + name = "from Tag/tag()"; + d = new GPGEncrypted( x ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_GPGENCRYPTED ) + || t->cdata() != "invalidencrypted" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + + + + delete x; + x = 0; + + + if( fail == 0 ) + { + printf( "GPGEncrypted: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "GPGEncrypted: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.am new file mode 100644 index 00000000..c16b312c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = gpgsigned_test + +gpgsigned_test_SOURCES = gpgsigned_test.cpp +gpgsigned_test_LDADD = ../../gpgsigned.o ../../tag.o ../../gloox.o ../../util.o +gpgsigned_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.in new file mode 100644 index 00000000..313a04a5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = gpgsigned_test$(EXEEXT) +subdir = src/tests/gpgsigned +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_gpgsigned_test_OBJECTS = gpgsigned_test.$(OBJEXT) +gpgsigned_test_OBJECTS = $(am_gpgsigned_test_OBJECTS) +gpgsigned_test_DEPENDENCIES = ../../gpgsigned.o ../../tag.o \ + ../../gloox.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(gpgsigned_test_SOURCES) +DIST_SOURCES = $(gpgsigned_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +gpgsigned_test_SOURCES = gpgsigned_test.cpp +gpgsigned_test_LDADD = ../../gpgsigned.o ../../tag.o ../../gloox.o ../../util.o +gpgsigned_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/gpgsigned/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/gpgsigned/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +gpgsigned_test$(EXEEXT): $(gpgsigned_test_OBJECTS) $(gpgsigned_test_DEPENDENCIES) $(EXTRA_gpgsigned_test_DEPENDENCIES) + @rm -f gpgsigned_test$(EXEEXT) + $(CXXLINK) $(gpgsigned_test_OBJECTS) $(gpgsigned_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpgsigned_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/gpgsigned_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/gpgsigned_test.cpp new file mode 100644 index 00000000..f5f94c27 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/gpgsigned/gpgsigned_test.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../gpgsigned.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + GPGSigned *d; + Tag *x = new Tag( "x", "invalidsignature" ); + x->addAttribute( "xmlns", XMLNS_X_GPGSIGNED ); + + // ------- + name = "parsing 0 tag"; + d = new GPGSigned( 0 ); + if( d->tag() != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/getters"; + d = new GPGSigned( "invalidsignature" ); + if( d->signature() != "invalidsignature" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + t = 0; + + // ------- + name = "filled object/tag()"; + d = new GPGSigned( "invalidsignature" ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_GPGSIGNED ) + || t->cdata() != "invalidsignature" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + // ------- + name = "from Tag/getters"; + d = new GPGSigned( x ); + if( d->signature() != "invalidsignature" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + t = 0; + + // ------- + name = "from Tag/tag()"; + d = new GPGSigned( x ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_GPGSIGNED ) + || t->cdata() != "invalidsignature" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + + + + delete x; + x = 0; + + + if( fail == 0 ) + { + printf( "GPGSigned: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "GPGSigned: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.am new file mode 100644 index 00000000..0aaa1d5c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = inbandbytestream_test + +inbandbytestream_test_SOURCES = inbandbytestream_test.cpp +inbandbytestream_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../logsink.o ../../mutex.o +inbandbytestream_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.in new file mode 100644 index 00000000..f564692c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = inbandbytestream_test$(EXEEXT) +subdir = src/tests/inbandbytestream +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_inbandbytestream_test_OBJECTS = inbandbytestream_test.$(OBJEXT) +inbandbytestream_test_OBJECTS = $(am_inbandbytestream_test_OBJECTS) +inbandbytestream_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../logsink.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(inbandbytestream_test_SOURCES) +DIST_SOURCES = $(inbandbytestream_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +inbandbytestream_test_SOURCES = inbandbytestream_test.cpp +inbandbytestream_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../logsink.o ../../mutex.o + +inbandbytestream_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/inbandbytestream/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/inbandbytestream/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +inbandbytestream_test$(EXEEXT): $(inbandbytestream_test_OBJECTS) $(inbandbytestream_test_DEPENDENCIES) $(EXTRA_inbandbytestream_test_DEPENDENCIES) + @rm -f inbandbytestream_test$(EXEEXT) + $(CXXLINK) $(inbandbytestream_test_OBJECTS) $(inbandbytestream_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inbandbytestream_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/inbandbytestream_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/inbandbytestream_test.cpp new file mode 100644 index 00000000..3cb6a3e0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestream/inbandbytestream_test.cpp @@ -0,0 +1,228 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../messagehandler.h" +#include "../../bytestreamdatahandler.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerMessageHandler( MessageHandler* ) {} + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + void removeMessageHandler( MessageHandler* ) {} + private: + JID m_jid; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define INBANDBYTESTREAM_TEST +#include "../../inbandbytestream.h" +#include "../../inbandbytestream.cpp" + +class IBBTest : public ClientBase, public BytestreamDataHandler +{ + public: + IBBTest() : m_result( 0 ) {} + virtual ~IBBTest() {} + void setTest( int test ) { m_test = test; } + virtual void send( IQ& ); + virtual void send( const IQ&, IqHandler*, int ); + virtual void trackID( IqHandler*, const std::string&, int ) {} + virtual void handleBytestreamData( Bytestream* /*bs*/, const std::string& data ) + { + if( m_test == 5 && data == "data" ) + m_result++; + } + virtual void handleBytestreamError( Bytestream* /*bs*/, const IQ& /*iq*/ ) {} + virtual void handleBytestreamOpen( Bytestream* /*bs*/ ) + { + if( m_test == 1 || m_test == 4 ) + m_result++; + } + virtual void handleBytestreamClose( Bytestream* /*bs*/ ) + { + if( m_test == 3 || m_test == 6 ) + m_result++; + else + m_result--; + } + int checkResult() { int t = m_result; m_result = 0; return t; } + private: + int m_test; + int m_result; +}; +void IBBTest::send( IQ& ) +{ + if( m_test == 4 || m_test == 5 ) + m_result++; +} +void IBBTest::send( const IQ& iq, IqHandler* ih, int ctx ) +{ + if( m_test == 1 ) + { + const InBandBytestream::IBB* i = iq.findExtension( ExtIBB ); + if( i && i->type() == InBandBytestream::IBBOpen ) + m_result++; + } + else if( m_test == 2 ) + { + const InBandBytestream::IBB* i = iq.findExtension( ExtIBB ); + if( i && i->type() == InBandBytestream::IBBData ) + m_result++; + } + else if( m_test == 3 ) + { + const InBandBytestream::IBB* i = iq.findExtension( ExtIBB ); + if( i && i->type() == InBandBytestream::IBBClose ) + m_result++; + } + + IQ re( IQ::Result, iq.from(), iq.id() ); + ih->handleIqID( re, ctx ); +} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + IBBTest* it = new IBBTest(); + LogSink li; + InBandBytestream ibb( it, li, JID( "foof" ), JID( "toof" ), "sid" ); + ibb.registerBytestreamDataHandler( it ); + + // ------- + { + name = "open ibb"; + it->setTest( 1 ); + ibb.connect(); + if( it->checkResult() != 2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "send data"; + it->setTest( 2 ); + ibb.send( "data" ); + if( !it->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "close ibb"; + it->setTest( 3 ); + ibb.close(); + if( !it->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "open ibb by tag"; + it->setTest( 4 ); + IQ iq( IQ::Set, JID(), it->getID() ); + iq.addExtension( new InBandBytestream::IBB( "sid", 4096 ) ); + ibb.handleIq( iq ); + if( it->checkResult() != 2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "receive data "; + it->setTest( 5 ); + IQ iq( IQ::Set, JID(), it->getID() ); + iq.addExtension( new InBandBytestream::IBB( "sid", 0, "data" ) ); + ibb.handleIq( iq ); + if( it->checkResult() != 2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "close ibb by tag"; + it->setTest( 6 ); + IQ iq( IQ::Set, JID(), it->getID() ); + iq.addExtension( new InBandBytestream::IBB( "sid" ) ); + ibb.handleIq( iq ); + if( !it->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + delete it; + + + if( fail == 0 ) + { + printf( "InBandBytestream: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "InBandBytestream: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.am new file mode 100644 index 00000000..6995e222 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = inbandbytestreamibb_test + +inbandbytestreamibb_test_SOURCES = inbandbytestreamibb_test.cpp +inbandbytestreamibb_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../mutex.o +inbandbytestreamibb_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.in new file mode 100644 index 00000000..0675d7e4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/Makefile.in @@ -0,0 +1,524 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = inbandbytestreamibb_test$(EXEEXT) +subdir = src/tests/inbandbytestreamibb +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_inbandbytestreamibb_test_OBJECTS = \ + inbandbytestreamibb_test.$(OBJEXT) +inbandbytestreamibb_test_OBJECTS = \ + $(am_inbandbytestreamibb_test_OBJECTS) +inbandbytestreamibb_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(inbandbytestreamibb_test_SOURCES) +DIST_SOURCES = $(inbandbytestreamibb_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +inbandbytestreamibb_test_SOURCES = inbandbytestreamibb_test.cpp +inbandbytestreamibb_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../mutex.o + +inbandbytestreamibb_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/inbandbytestreamibb/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/inbandbytestreamibb/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +inbandbytestreamibb_test$(EXEEXT): $(inbandbytestreamibb_test_OBJECTS) $(inbandbytestreamibb_test_DEPENDENCIES) $(EXTRA_inbandbytestreamibb_test_DEPENDENCIES) + @rm -f inbandbytestreamibb_test$(EXEEXT) + $(CXXLINK) $(inbandbytestreamibb_test_OBJECTS) $(inbandbytestreamibb_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/inbandbytestreamibb_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/inbandbytestreamibb_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/inbandbytestreamibb_test.cpp new file mode 100644 index 00000000..e015a5c6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/inbandbytestreamibb/inbandbytestreamibb_test.cpp @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../messagehandler.h" +#include "../../base64.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerMessageHandler( MessageHandler* ) {} + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeMessageHandler( MessageHandler* ) {} + void removeIDHandler( IqHandler* ) {} + private: + JID m_jid; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define INBANDBYTESTREAM_TEST +#include "../../inbandbytestream.h" +#include "../../inbandbytestream.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty tag() test"; + InBandBytestream::IBB ibb; + t = ibb.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "open ibb"; + InBandBytestream::IBB ibb( "sid", 4096 ); + t = ibb.tag(); + if( !t || t->xml() != "" + || ibb.sid() != "sid" || ibb.blocksize() != 4096 || ibb.seq() != 0 || !ibb.data().empty() + || ibb.type() != InBandBytestream::IBBOpen) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "data ibb"; + InBandBytestream::IBB ibb( "sid", 4, "data" ); + t = ibb.tag(); + if( !t || t->xml() != "" + + Base64::encode64( "data" ) + + "" + || ibb.sid() != "sid" || ibb.seq() != 4 || ibb.data() != "data" || ibb.blocksize() != 0 + || ibb.type() != InBandBytestream::IBBData ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "close ibb"; + InBandBytestream::IBB ibb( "sid" ); + t = ibb.tag(); + if( !t || t->xml() != "" + || ibb.sid() != "sid" || ibb.seq() != 0 || !ibb.data().empty() || ibb.blocksize() != 0 + || ibb.type() != InBandBytestream::IBBClose ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "open ibb from tag"; + Tag* d = new Tag( "open" ); + d->setXmlns( XMLNS_IBB ); + d->addAttribute( "sid", "sid" ); + d->addAttribute( "block-size", 4096 ); + InBandBytestream::IBB ibb( d ); + t = ibb.tag(); + if( !t || *t != *d || ibb.sid() != "sid" || ibb.blocksize() != 4096 || ibb.seq() != 0 + || !ibb.data().empty() || ibb.type() != InBandBytestream::IBBOpen ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete d; + } + + // ------- + { + name = "data ibb from tag"; + Tag* d = new Tag( "data" ); + d->setXmlns( XMLNS_IBB ); + d->addAttribute( "sid", "sid" ); + d->addAttribute( "seq", 4 ); + d->setCData( Base64::encode64( "data" ) ); + InBandBytestream::IBB ibb( d ); + t = ibb.tag(); + if( !t || *t != *d || ibb.sid() != "sid" || ibb.seq() != 4 || ibb.data() != "data" + || ibb.blocksize() != 0 || ibb.type() != InBandBytestream::IBBData ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete d; + } + + // ------- + { + name = "close ibb from tag"; + Tag* d = new Tag( "close" ); + d->setXmlns( XMLNS_IBB ); + d->addAttribute( "sid", "sid" ); + InBandBytestream::IBB ibb( d ); + t = ibb.tag(); + if( !t || t->xml() != "" + || ibb.sid() != "sid" || ibb.seq() != 0 || !ibb.data().empty() || ibb.blocksize() != 0 + || ibb.type() != InBandBytestream::IBBClose ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete d; + } + + StanzaExtensionFactory sef; + sef.registerExtension( new InBandBytestream::IBB() ); + // ------- + { + name = "InBandBytestream::IBB/SEFactory test (open)"; + Tag* f = new Tag( "iq" ); + new Tag( f, "open", "xmlns", XMLNS_IBB ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const InBandBytestream::IBB* se = iq.findExtension( ExtIBB ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + // ------- + { + name = "InBandBytestream::IBB/SEFactory test (data)"; + Tag* f = new Tag( "iq" ); + new Tag( f, "data", "xmlns", XMLNS_IBB ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const InBandBytestream::IBB* se = iq.findExtension( ExtIBB ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + // ------- + { + name = "InBandBytestream::IBB/SEFactory test (close)"; + Tag* f = new Tag( "iq" ); + new Tag( f, "close", "xmlns", XMLNS_IBB ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const InBandBytestream::IBB* se = iq.findExtension( ExtIBB ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + if( fail == 0 ) + { + printf( "InBandBytestream::IBB: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "InBandBytestream::IBB: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.am new file mode 100644 index 00000000..7adb7f4d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = iodata_test + +iodata_test_SOURCES = iodata_test.cpp +iodata_test_LDADD = ../../iodata.o ../../tag.o ../../gloox.o \ + ../../util.o +iodata_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.in new file mode 100644 index 00000000..00c6d375 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/iodata/Makefile.in @@ -0,0 +1,519 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = iodata_test$(EXEEXT) +subdir = src/tests/iodata +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_iodata_test_OBJECTS = iodata_test.$(OBJEXT) +iodata_test_OBJECTS = $(am_iodata_test_OBJECTS) +iodata_test_DEPENDENCIES = ../../iodata.o ../../tag.o ../../gloox.o \ + ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(iodata_test_SOURCES) +DIST_SOURCES = $(iodata_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +iodata_test_SOURCES = iodata_test.cpp +iodata_test_LDADD = ../../iodata.o ../../tag.o ../../gloox.o \ + ../../util.o + +iodata_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/iodata/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/iodata/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +iodata_test$(EXEEXT): $(iodata_test_OBJECTS) $(iodata_test_DEPENDENCIES) $(EXTRA_iodata_test_DEPENDENCIES) + @rm -f iodata_test$(EXEEXT) + $(CXXLINK) $(iodata_test_OBJECTS) $(iodata_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iodata_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/iodata/iodata_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/iodata/iodata_test.cpp new file mode 100644 index 00000000..f27bc61d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/iodata/iodata_test.cpp @@ -0,0 +1,350 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iodata.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + IOData *i = 0; + Tag* t = 0; + Tag* f = 0; + Tag* s = new Tag( "iodata" ); + s->setXmlns( XMLNS_IODATA ); + + + // ------- + name = "parsing 0 tag"; + i = new IOData( 0 ); + if( i->tag() != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parsing 'io-schemata-get' type"; + s->addAttribute( "type", "io-schemata-get" ); + i = new IOData( s ); + if( i->tag()->xml() != s->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parsing 'input' type"; + t = s->clone(); + t->addAttribute( "type", "input" ); + f = new Tag( t, "in" ); + new Tag( f, "foo" ); + i = new IOData( t ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "parsing 'getStatus' type"; + s->addAttribute( "type", "getStatus" ); + i = new IOData( s ); + if( i->tag()->xml() != s->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parsing 'getOutput' type"; + s->addAttribute( "type", "getOutput" ); + i = new IOData( s ); + if( i->tag()->xml() != s->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parsing 'io-schemata-result' type"; + t = s->clone(); + t->addAttribute( "type", "io-schemata-result" ); + f = new Tag( t, "in" ); + new Tag( f, "foo" ); + f = new Tag( t, "out" ); + new Tag( f, "foobar" ); + f = new Tag( t, "desc", "some description" ); + i = new IOData( t ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "parsing 'output' type"; + t = s->clone(); + t->addAttribute( "type", "output" ); + f = new Tag( t, "out" ); + new Tag( f, "foo" ); + i = new IOData( t ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "parsing 'error' type"; + t = s->clone(); + t->addAttribute( "type", "error" ); + f = new Tag( t, "error", "some error description" ); + i = new IOData( t ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "parsing 'status' type"; + t = s->clone(); + t->addAttribute( "type", "status" ); + f = new Tag( t, "status" ); + new Tag( f, "elapsed", "12" ); + new Tag( f, "remaining", "34" ); + new Tag( f, "percentage", "56" ); + new Tag( f, "information", "some information" ); + i = new IOData( t ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'io-schemata-get' type"; + t = s->clone(); + t->addAttribute( "type", "io-schemata-get" ); + i = new IOData( IOData::TypeIoSchemataGet ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'input' type"; + t = s->clone(); + t->addAttribute( "type", "input" ); + f = new Tag( t, "in" ); + f = new Tag( f, "foo" ); + i = new IOData( IOData::TypeInput ); + i->setIn( f->clone() ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'getStatus' type"; + t = s->clone(); + t->addAttribute( "type", "getStatus" ); + i = new IOData( IOData::TypeGetStatus ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'getOutput' type"; + t = s->clone(); + t->addAttribute( "type", "getOutput" ); + i = new IOData( IOData::TypeGetOutput ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'io-schemata-result' type"; + t = s->clone(); + t->addAttribute( "type", "io-schemata-result" ); + i = new IOData( IOData::TypeIoSchemataResult ); + f = new Tag( t, "in" ); + f = new Tag( f, "foo" ); + i->setIn( f->clone() ); + f = new Tag( t, "out" ); + f = new Tag( f, "foobar" ); + i->setOut( f->clone() ); + f = new Tag( t, "desc", "some description" ); + i->setDesc( "some description" ); + if( i->tag()->xml() != t->xml() || i->desc() != "some description" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'output' type"; + t = s->clone(); + t->addAttribute( "type", "output" ); + i = new IOData( IOData::TypeOutput ); + f = new Tag( t, "out" ); + f = new Tag( f, "foobar" ); + i->setOut( f->clone() ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'error' type"; + t = s->clone(); + t->addAttribute( "type", "error" ); + i = new IOData( IOData::TypeError ); + f = new Tag( t, "error" ); + f = new Tag( f, "foo" ); + i->setError( f->clone() ); + if( i->tag()->xml() != t->xml() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + // ------- + name = "creating 'status' type"; + t = s->clone(); + t->addAttribute( "type", "status" ); + i = new IOData( IOData::TypeStatus ); + f = new Tag( t, "status" ); + new Tag( f, "elapsed", "12" ); + new Tag( f, "remaining", "34" ); + new Tag( f, "percentage", "56" ); + new Tag( f, "information", "some info" ); + IOData::Status st = { 12, 34, 56, "some info" }; + i->setStatus( st ); + if( i->tag()->xml() != t->xml() || i->status().elapsed != st.elapsed + || i->status().remaining != st.remaining || i->status().percentage != st.percentage + || i->status().info != st.info ) + { + ++fail; + fprintf( stderr, "test '%s' failed\ni: %s\ns: %s\n", name.c_str(), i->tag()->xml().c_str(), t->xml().c_str() ); + } + delete i; + i = 0; + delete t; + t = 0; + + + // ------- + name = "cloning"; + i = new IOData( IOData::TypeStatus ); + i->setStatus( st ); + i->setOut( new Tag( "foo" ) ); + IOData* j = i->clone(); + if( !j || !j->out() || i->out()->name() != "out" || !j->out()->hasChild( "foo" ) || j->status().elapsed != st.elapsed ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + delete j; + j = 0; + + + + + + + + if( fail == 0 ) + { + printf( "IOData: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "IOData: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.am new file mode 100644 index 00000000..dcad5f59 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = iq_test + +iq_test_SOURCES = iq_test.cpp +iq_test_LDADD = ../../tag.o ../../iq.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o ../../util.o \ + ../../sha.o ../../base64.o +iq_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.in new file mode 100644 index 00000000..666b89c0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/iq/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = iq_test$(EXEEXT) +subdir = src/tests/iq +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_iq_test_OBJECTS = iq_test.$(OBJEXT) +iq_test_OBJECTS = $(am_iq_test_OBJECTS) +iq_test_DEPENDENCIES = ../../tag.o ../../iq.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../gloox.o ../../util.o \ + ../../sha.o ../../base64.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(iq_test_SOURCES) +DIST_SOURCES = $(iq_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +iq_test_SOURCES = iq_test.cpp +iq_test_LDADD = ../../tag.o ../../iq.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o ../../util.o \ + ../../sha.o ../../base64.o + +iq_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/iq/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/iq/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +iq_test$(EXEEXT): $(iq_test_OBJECTS) $(iq_test_DEPENDENCIES) $(EXTRA_iq_test_DEPENDENCIES) + @rm -f iq_test$(EXEEXT) + $(CXXLINK) $(iq_test_OBJECTS) $(iq_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iq_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/iq/iq_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/iq/iq_test.cpp new file mode 100644 index 00000000..b66e9524 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/iq/iq_test.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define IQ_TEST +#include "../../tag.h" +#include "../../iq.h" +#include "../../stanza.h" +#include "../../jid.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *iq = new Tag( "iq" ); + iq->addAttribute( "from", "me@example.net/gloox" ); + iq->addAttribute( "to", "you@example.net/gloox" ); + iq->addAttribute( "id", "id1" ); + iq->addAttribute( "type", "set" ); + IQ* i = 0; + + // ------- + name = "parse IQ set"; + i = new IQ( iq ); + if( i->subtype() != IQ::Set || i->from().full() != "me@example.net/gloox" + || i->to().full() != "you@example.net/gloox" || i->id() != "id1" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse IQ get"; + iq->addAttribute( "type", "get" ); + i = new IQ( iq ); + if( i->subtype() != IQ::Get || i->from().full() != "me@example.net/gloox" + || i->to().full() != "you@example.net/gloox" || i->id() != "id1" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse IQ error"; + iq->addAttribute( "type", "error" ); + i = new IQ( iq ); + if( i->subtype() != IQ::Error || i->from().full() != "me@example.net/gloox" + || i->to().full() != "you@example.net/gloox" || i->id() != "id1" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse IQ result"; + iq->addAttribute( "type", "result" ); + i = new IQ( iq ); + if( i->subtype() != IQ::Result || i->from().full() != "me@example.net/gloox" + || i->to().full() != "you@example.net/gloox" || i->id() != "id1" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + { + name = "new simple IQ error"; + IQ iq( IQ::Error, JID( "xyz@example.org/blah" ), "id2" ); + Tag* i = iq.tag(); + if( !i->hasAttribute( "type", "error" ) || !i->hasAttribute( "id", "id2" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple IQ result"; + IQ iq( IQ::Result, JID( "xyz@example.org/blah" ), "id2" ); + Tag* i = iq.tag(); + if( !i->hasAttribute( "type", "result" ) || !i->hasAttribute( "id", "id2" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple IQ get"; + IQ iq( IQ::Get, JID( "xyz@example.org/blah" ), "id2" ); + Tag* i = iq.tag(); + if( !i->hasAttribute( "type", "get" ) || !i->hasAttribute( "id", "id2" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple IQ set 1"; + IQ iq( IQ::Set, JID( "xyz@example.org/blah" ), "id2" ); + Tag* i = iq.tag(); + if( !i->hasAttribute( "type", "set" ) || !i->hasAttribute( "id", "id2" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + +// FIXME these need to use SEs, as IQ::query() will go away eventually +// // ------- +// { +// name = "new simple IQ set 2"; +// IQ iq( IQ::Set, JID( "xyz@example.org/blah" ), "id2", "mynamespace" ); +// Tag* i = iq.tag(); +// if( !i->hasAttribute( "type", "set" ) || !i->hasAttribute( "id", "id2" ) +// || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasChild( "query", "xmlns", "mynamespace" ) ) +// { +// ++fail; +// fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); +// } +// delete i; +// } +// +// // ------- +// { +// name = "new simple IQ set 3"; +// IQ iq( IQ::Set, JID( "xyz@example.org/blah" ), "id2", "mynamespace", "testtag" ); +// Tag* i = iq.tag(); +// if( !i->hasAttribute( "type", "set" ) || !i->hasAttribute( "id", "id2" ) +// || !i->hasAttribute( "to", "xyz@example.org/blah" ) +// || !i->hasChild( "testtag", "xmlns", "mynamespace" ) ) +// { +// ++fail; +// fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); +// } +// delete i; +// } +// +// // ------- +// { +// name = "new simple IQ set 4"; +// IQ iq( IQ::Set, JID( "xyz@example.org/blah" ), "id2", "mynamespace", "testtag", +// JID( "blah@example.net/foo" ) ); +// Tag* i = iq.tag(); +// if( !i->hasAttribute( "type", "set" ) || !i->hasAttribute( "id", "id2" ) +// || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasChild( "testtag", "xmlns", "mynamespace" ) +// || !i->hasAttribute( "from", "blah@example.net/foo" ) ) +// { +// ++fail; +// fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); +// } +// delete i; +// } + +// FIXME fix the following test. how to test private functions, ctors, etc? +// // ------- +// name = "rip off"; +// i = new IQ( iq ); +// if( !i->hasAttribute( "type", "result" ) || !i->hasAttribute( "id", "id1" ) +// || !i->hasAttribute( "to", "you@example.net/gloox" ) || !i->hasChild( "query", "xmlns", "mynamespace" ) +// || !i->hasAttribute( "from", "me@example.net/gloox" ) +// || iq->children().size() != 0 ) +// { +// ++fail; +// fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); +// } +// delete i; +// i = 0; + + + + + + + + delete iq; + iq = 0; + + if( fail == 0 ) + { + printf( "IQ: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "IQ: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.am new file mode 100644 index 00000000..c91dc3b9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = jid_test jid_perf + +jid_test_SOURCES = jid_test.cpp +jid_test_LDADD = ../../jid.o ../../prep.o ../../gloox.o ../../util.o +jid_test_CFLAGS = $(CPPFLAGS) + +jid_perf_SOURCES = jid_perf.cpp +jid_perf_LDADD = ../../jid.o ../../prep.o ../../gloox.o ../../util.o +jid_perf_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.in new file mode 100644 index 00000000..2405fae5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jid/Makefile.in @@ -0,0 +1,528 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = jid_test$(EXEEXT) jid_perf$(EXEEXT) +subdir = src/tests/jid +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_jid_perf_OBJECTS = jid_perf.$(OBJEXT) +jid_perf_OBJECTS = $(am_jid_perf_OBJECTS) +jid_perf_DEPENDENCIES = ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o +am_jid_test_OBJECTS = jid_test.$(OBJEXT) +jid_test_OBJECTS = $(am_jid_test_OBJECTS) +jid_test_DEPENDENCIES = ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(jid_perf_SOURCES) $(jid_test_SOURCES) +DIST_SOURCES = $(jid_perf_SOURCES) $(jid_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +jid_test_SOURCES = jid_test.cpp +jid_test_LDADD = ../../jid.o ../../prep.o ../../gloox.o ../../util.o +jid_test_CFLAGS = $(CPPFLAGS) +jid_perf_SOURCES = jid_perf.cpp +jid_perf_LDADD = ../../jid.o ../../prep.o ../../gloox.o ../../util.o +jid_perf_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/jid/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/jid/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +jid_perf$(EXEEXT): $(jid_perf_OBJECTS) $(jid_perf_DEPENDENCIES) $(EXTRA_jid_perf_DEPENDENCIES) + @rm -f jid_perf$(EXEEXT) + $(CXXLINK) $(jid_perf_OBJECTS) $(jid_perf_LDADD) $(LIBS) +jid_test$(EXEEXT): $(jid_test_OBJECTS) $(jid_test_DEPENDENCIES) $(EXTRA_jid_test_DEPENDENCIES) + @rm -f jid_test$(EXEEXT) + $(CXXLINK) $(jid_test_OBJECTS) $(jid_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jid_perf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jid_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jid/jid_perf.cpp b/smack/smack/src/main/cpp/gloox/src/tests/jid/jid_perf.cpp new file mode 100644 index 00000000..85ea20e9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jid/jid_perf.cpp @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#ifndef _WIN32 + +#include "../../jid.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +#include + +static double divider = 1000000; +static int num = 10000; +static double t; + +static void printTime ( const char * testName, struct timeval tv1, struct timeval tv2 ) +{ + t = tv2.tv_sec - tv1.tv_sec; + t += ( tv2.tv_usec - tv1.tv_usec ) / divider; + printf( "%s: %.03f seconds (%.00f/s)\n", testName, t, num / t ); +} + +static const std::string addr = "username@server.org/resource"; + +static const int sz_s = 100; +static const int sz_b = 1000; + + +int main( int /*argc*/, char** /*argv*/ ) +{ + struct timeval tv1; + struct timeval tv2; + + printf( "Testing %d...\n", num ); + + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + delete new JID( addr ); + } + gettimeofday( &tv2, 0 ); + printTime ("create/delete", tv1, tv2); + + + // --------------------------------------------------------------------- + + JID * jid; + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + jid = new JID(addr); + jid->bare(); + delete jid; + } + gettimeofday( &tv2, 0 ); + printTime ("create/delete bare", tv1, tv2); + + + // --------------------------------------------------------------------- + + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + jid = new JID(addr); + jid->full(); + delete jid; + } + gettimeofday( &tv2, 0 ); + printTime ("create/delete full", tv1, tv2); + + + // --------------------------------------------------------------------- + + gettimeofday( &tv1, 0 ); + for( int i = 0; i < num; ++i ) + { + jid = new JID(addr); + jid->bare(); + jid->full(); + delete jid; + } + gettimeofday( &tv2, 0 ); + printTime ("create/delete bare/full", tv1, tv2); + + + // ----------------------------------------------------------------------- + + jid = new JID(addr); + gettimeofday( &tv1, 0 ); + for (int i = 0; i < num; ++i) + { + jid->bare(); + } + gettimeofday( &tv2, 0 ); + delete jid; + printTime ("bare", tv1, tv2); + + // ----------------------------------------------------------------------- + + jid = new JID(addr); + gettimeofday( &tv1, 0 ); + for (int i = 0; i < num; ++i) + { + jid->full(); + } + gettimeofday( &tv2, 0 ); + delete jid; + printTime ("full", tv1, tv2); + + + + return 0; +} +#else +int main( int, char** ) { return 0; } +#endif diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jid/jid_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/jid/jid_test.cpp new file mode 100644 index 00000000..e8b7be25 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jid/jid_test.cpp @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../jid.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + JID j; + + // ------- + name = "bare JID ctor"; + j = JID( "abc@server.dom" ); + if( j.bare() != "abc@server.dom" || j.username() != "abc" || j.server() != "server.dom" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "full JID ctor"; + j = JID( "abc@server.dom/res" ); + if( j.full() != "abc@server.dom/res" || j.username() != "abc" || j.server() != "server.dom" + || j.resource() != "res" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "server + resource ctor"; + j = JID( "server.dom/res" ); + if( j.full() != "server.dom/res" || j.server() != "server.dom" || j.resource() != "res" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "server ctor"; + j = JID( "server.dom" ); + if( j.full() != "server.dom" || j.server() != "server.dom" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "prepped node"; + j = JID( "ABC@server.dom" ); + if( j.bare() != "abc@server.dom" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "prepped dom"; + j = JID( "abc@SeRvEr.dom" ); + if( j.bare() != "abc@server.dom" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "resource getter"; + j = JID( "abc@server.dom/rEsOurCe" ); + if( j.resource() != "rEsOurCe" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "node getter"; + j = JID( "aBc@server.dom/rEsOurCe" ); + if( j.username() != "abc" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "server getter"; + j = JID( "abc@serVer.dom/rEsOurCe" ); + if( j.server() != "server.dom" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "bare JID getter"; + j = JID( "abc@serVer.dom/rEsOurCe" ); + JID t1( "abc@serVer.dom/rEsOurCe"); + if( j.bareJID() != t1.bareJID() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "clear jid"; + j = JID( "abc@serVer.dom/rEsOurCe" ); + j.setJID( "" ); + if( j || !j.username().empty() + || !j.server().empty() + || !j.serverRaw().empty() + || !j.resource().empty() + || !j.bare().empty() + || !j.full().empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "operator bool() 1"; + JID jid1( "abc@serVer.dom/rEsOurCe" ); + if( !jid1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "operator bool() 2"; + JID jid2( "" ); + if( jid2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "JID\20Escaping"; + const std::string e = JID::escapeNode( "1 2\"3&4'5/6:7<8>9@10\\" ); + if( e != "1\\202\\223\\264\\275\\2f6\\3a7\\3c8\\3e9\\4010\\5c" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "JID\20Unescaping"; + const std::string f = JID::unescapeNode( "1\\202\\223\\264\\275\\2f6\\3a7\\3c8\\3e9\\4010\\5c" ); + if( f != "1 2\"3&4'5/6:7<8>9@10\\" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + + + + + + if( fail == 0 ) + { + printf( "JID: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "JID: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.am new file mode 100644 index 00000000..118ecd28 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.am @@ -0,0 +1,15 @@ + +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = jingleiceudp_test + +jingleiceudp_test_SOURCES = jingleiceudp_test.cpp +jingleiceudp_test_LDADD = ../../stanza.o ../../jid.o ../../tag.o ../../prep.o \ + ../../gloox.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../jingleiceudp.o ../../error.o ../../mutex.o +jingleiceudp_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.in new file mode 100644 index 00000000..84206e96 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/Makefile.in @@ -0,0 +1,523 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = jingleiceudp_test$(EXEEXT) +subdir = src/tests/jingleiceudp +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_jingleiceudp_test_OBJECTS = jingleiceudp_test.$(OBJEXT) +jingleiceudp_test_OBJECTS = $(am_jingleiceudp_test_OBJECTS) +jingleiceudp_test_DEPENDENCIES = ../../stanza.o ../../jid.o \ + ../../tag.o ../../prep.o ../../gloox.o ../../iq.o ../../util.o \ + ../../sha.o ../../base64.o ../../jingleiceudp.o ../../error.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(jingleiceudp_test_SOURCES) +DIST_SOURCES = $(jingleiceudp_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +jingleiceudp_test_SOURCES = jingleiceudp_test.cpp +jingleiceudp_test_LDADD = ../../stanza.o ../../jid.o ../../tag.o ../../prep.o \ + ../../gloox.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../jingleiceudp.o ../../error.o ../../mutex.o + +jingleiceudp_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/jingleiceudp/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/jingleiceudp/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +jingleiceudp_test$(EXEEXT): $(jingleiceudp_test_OBJECTS) $(jingleiceudp_test_DEPENDENCIES) $(EXTRA_jingleiceudp_test_DEPENDENCIES) + @rm -f jingleiceudp_test$(EXEEXT) + $(CXXLINK) $(jingleiceudp_test_OBJECTS) $(jingleiceudp_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jingleiceudp_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/jingleiceudp_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/jingleiceudp_test.cpp new file mode 100644 index 00000000..54b24995 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jingleiceudp/jingleiceudp_test.cpp @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define JINGLEICEUDP_TEST +#include "../../gloox.h" +#include "../../jid.h" +#include "../../tag.h" +#include "../../jingleiceudp.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + JID jid( "foo@bar/barfoo" ); + + // ------- + { + name = "invalid Jingle 1"; + Jingle::ICEUDP jc; + Tag* t = jc.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + + + + + // ------- +// name = "Jingle::Session::Jingle/SEFactory test"; +// StanzaExtensionFactory sef; +// sef.registerExtension( new Jingle::Session::Jingle() ); +// Tag* f = new Tag( "iq" ); +// new Tag( f, "jingle", "xmlns", XMLNS_JINGLE ); +// IQ iq( IQ::Get, JID() ); +// sef.addExtensions( iq, f ); +// const Jingle::Session::Jingle* se = iq.findExtension( ExtJingle ); +// if( se == 0 ) +// { +// ++fail; +// fprintf( stderr, "test '%s' failed\n", name.c_str() ); +// } +// delete f; + + + + if( fail == 0 ) + { + printf( "Jingle::ICEUDP: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Jingle::ICEUDP: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.am new file mode 100644 index 00000000..3dc084d7 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = jinglesession_test + +jinglesession_test_SOURCES = jinglesession_test.cpp +jinglesession_test_LDADD = ../../tag.o ../../stanza.o ../../base64.o \ + ../../prep.o ../../gloox.o \ + ../../iq.o ../../util.o \ + ../../sha.o ../../error.o ../../jid.o \ + ../../jinglecontent.o ../../jinglepluginfactory.o +jinglesession_test_CFLAGS = $(CPPFLAGS) -g3 diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.in new file mode 100644 index 00000000..b5253442 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/Makefile.in @@ -0,0 +1,524 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = jinglesession_test$(EXEEXT) +subdir = src/tests/jinglesession +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_jinglesession_test_OBJECTS = jinglesession_test.$(OBJEXT) +jinglesession_test_OBJECTS = $(am_jinglesession_test_OBJECTS) +jinglesession_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../base64.o ../../prep.o ../../gloox.o ../../iq.o \ + ../../util.o ../../sha.o ../../error.o ../../jid.o \ + ../../jinglecontent.o ../../jinglepluginfactory.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(jinglesession_test_SOURCES) +DIST_SOURCES = $(jinglesession_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +jinglesession_test_SOURCES = jinglesession_test.cpp +jinglesession_test_LDADD = ../../tag.o ../../stanza.o ../../base64.o \ + ../../prep.o ../../gloox.o \ + ../../iq.o ../../util.o \ + ../../sha.o ../../error.o ../../jid.o \ + ../../jinglecontent.o ../../jinglepluginfactory.o + +jinglesession_test_CFLAGS = $(CPPFLAGS) -g3 +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/jinglesession/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/jinglesession/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +jinglesession_test$(EXEEXT): $(jinglesession_test_OBJECTS) $(jinglesession_test_DEPENDENCIES) $(EXTRA_jinglesession_test_DEPENDENCIES) + @rm -f jinglesession_test$(EXEEXT) + $(CXXLINK) $(jinglesession_test_OBJECTS) $(jinglesession_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglesession_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/jinglesession_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/jinglesession_test.cpp new file mode 100644 index 00000000..2dedebb0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesession/jinglesession_test.cpp @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define CLIENTBASE_H__ +#define DISCO_H__ +#define GLOOX_TESTS +#define JINGLE_TEST +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../jid.h" +#include "../../stanzaextension.h" + +#include +#include +#include +#include // [s]print[f] + +gloox::JID remote_jid( "foo@bar" ); + +namespace gloox +{ + class Disco + { + public: + Disco() {} + void addFeature( const std::string& ) {} + }; + + class ClientBase + { + public: + ClientBase() : m_jid( "self" ) {} + virtual ~ClientBase() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( const IQ& ) = 0; + virtual void send( IQ&, IqHandler*, int ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ih ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + Disco* disco() { return &m_disco; } + private: + JID m_jid; + Disco m_disco; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::removeIDHandler( IqHandler* ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define JINGLESESSION_TEST +#include "../../jinglesession.h" +#include "../../jinglesession.cpp" +#include "../../jinglesessionhandler.h" +#include "../../jinglesessionmanager.h" +#include "../../jinglesessionmanager.cpp" +#include "../../jinglecontent.h" +class TestInitiator : public ClientBase, public Jingle::SessionHandler +{ + public: + TestInitiator() : m_js( new Jingle::Session( this, remote_jid, this ) ), m_result( false ), m_result2( false ) + { m_js->setInitiator( JID( "notself" ) ); } + virtual ~TestInitiator() { delete m_js; } + void setTest( int test ) { m_test = test; } + virtual void send( const IQ& iq ); + virtual void send( IQ& iq, IqHandler*, int ); + virtual void trackID( IqHandler *ih, const std::string& id, int context ); + bool checkResult() { bool t = m_result; m_result = false; return t; } + bool checkResult2() { bool t = m_result2; m_result2 = false; return t; } + Jingle::Session* js() { return m_js; } + virtual void handleSessionAction( Jingle::Action action, Jingle::Session* session, const Jingle::Session::Jingle* jingle ); + virtual void handleSessionActionError( Jingle::Action action, Jingle::Session* /*session*/, const Error* /*e*/ ) {} + virtual void handleIncomingSession( Jingle::Session* session ) {} +private: + Jingle::Session* m_js; + int m_test; + bool m_result; + bool m_result2; +}; + +class TestResponder : public ClientBase, public Jingle::SessionHandler +{ +public: + TestResponder() : m_js( 0 ), m_result( false ), m_result2( false ), + m_manager( 0 ) + {} + virtual ~TestResponder() { delete m_manager; } + void setTest( int test ) { if( !m_manager ) m_manager = new Jingle::SessionManager( this, this ); m_test = test; } + virtual void send( const IQ& iq ); + virtual void send( IQ& iq, IqHandler*, int ); + virtual void trackID( IqHandler *ih, const std::string& id, int context ); + bool checkResult() { bool t = m_result; m_result = false; return t; } + bool checkResult2() { bool t = m_result2; m_result2 = false; return t; } + Jingle::Session* js() { return m_js; } + Jingle::SessionManager* sm() { return m_manager; } + virtual void handleSessionAction( Jingle::Action action, Jingle::Session* session, const Jingle::Session::Jingle* jingle ); + virtual void handleSessionActionError( Jingle::Action action, Jingle::Session* /*session*/, const Error* /*e*/ ) {} + + virtual void handleIncomingSession( Jingle::Session* session ) { m_js = session; } +private: + Jingle::Session* m_js; + int m_test; + bool m_result; + bool m_result2; + Jingle::SessionManager* m_manager; +}; + +TestInitiator* ini; +TestResponder* res; + + +void TestInitiator::handleSessionAction( Jingle::Action action, Jingle::Session* session, const Jingle::Session::Jingle* jingle ) +{ +// m_result2 = false; + +// if( m_test == 1 && session->state() == Jingle::Session::Pending ) +// m_result2 = true; +} + +void TestInitiator::send( const IQ& iq ) +{ +// printf( "TestInitiator::senD(IQ): %s\n", iq.tag()->xml().c_str() ); + m_result2 = false; + + switch( m_test ) + { + case 2: + case 3: + if( iq.subtype() == IQ::Result && iq.to().full() == "foo@bar" ) + m_result2 = true; + break; + } +} + +void TestInitiator::send( IQ& iq, IqHandler*, int ctx ) +{ + m_result = false; + iq.setFrom( JID( "self" ) ); + Tag* t = iq.tag(); + std::string expected; + +// printf( "TestInitiator: test %d: %s\n", m_test, t->xml().c_str() ); + + switch( m_test ) + { + case 1: + { + expected = ""; + if( t->xml() == expected ) + m_result = true; + else + fprintf( stderr, "Jingle::Session test %d\nHave: %s\nExpected: %s\n", m_test, t->xml().c_str(), expected.c_str() ); + res->sm()->handleIq( iq ); + break; + } + } + + delete t; +} + +void TestInitiator::trackID( IqHandler*, const std::string&, int ) {} + +// ------------------------------------------------------------------------------------------------------------ + +void TestResponder::handleSessionAction( Jingle::Action action, Jingle::Session* session, const Jingle::Session::Jingle* jingle ) +{ + m_result2 = false; + + if( m_test == 1 && session->state() == Jingle::Session::Pending ) + m_result2 = true; +} + +void TestResponder::send( const IQ& iq ) +{ + m_result2 = false; +// printf( "TestResponder::senD(IQ): %s\n", iq.tag()->xml().c_str() ); + + switch( m_test ) + { + case 1: + if( iq.subtype() == IQ::Result && iq.to().full() == "self" ) + { +// printf( "m_result2 = true;\n" ); + m_result2 = true; + } + break; + } +} + +void TestResponder::send( IQ& iq, IqHandler*, int ctx ) +{ + m_result = false; + iq.setFrom( remote_jid ); + Tag* t = iq.tag(); + std::string expected; + +// printf( "TestResponder: test %d: %s\n", m_test, t->xml().c_str() ); + switch( m_test ) + { + case 1: + break; + case 2: + expected = ""; + if( t->xml() == expected ) + m_result = true; + else + fprintf( stderr, "Jingle::Session test %d\nHave: %s\nExpected: %s\n", m_test, t->xml().c_str(), expected.c_str() ); + ini->js()->handleIq( iq ); + break; + case 3: + expected = ""; + if( t->xml() == expected ) + m_result = true; + else + fprintf( stderr, "Jingle::Session test %d\nHave: %s\nExpected: %s\n", m_test, t->xml().c_str(), expected.c_str() ); + ini->js()->handleIq( iq ); + break; + case 4: + case 5: + { + break; + } + } + + delete t; +} + +void TestResponder::trackID( IqHandler*, const std::string&, int ) {} + +// ------------------------------------------------------------------------------------------------------------ + +// ------------------------------------------------------------------------------------------------------------ + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + ini = new TestInitiator(); + ini->js()->setSID( "somesid" ); + + res = new TestResponder(); + + // ------- + name = "Initiator: ended (initial) state"; + if( ini->js()->state() != Jingle::Session::Ended ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Initiator: session initiate"; + ini->setTest( 1 ); + res->setTest( 1 ); + Jingle::PluginList pl; + pl.push_back( new Jingle::Content() ); + if( !ini->js()->sessionInitiate( pl ) || !ini->checkResult() || !res->checkResult2() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Initiator: pending state"; + if( ini->js()->state() != Jingle::Session::Pending ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Responder: pending state"; + if( res->js()->state() != Jingle::Session::Pending ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Responder: session accept"; + ini->setTest( 2 ); + res->setTest( 2 ); + if( !res->js()->sessionAccept( new Jingle::Content() ) || !res->checkResult() || !ini->checkResult2() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Initiator: active state"; + if( ini->js()->state() != Jingle::Session::Active ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Responder: active state"; + if( res->js()->state() != Jingle::Session::Active ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Responder: session terminate"; + ini->setTest( 3 ); + res->setTest( 3 ); + if( !res->js()->sessionTerminate( new Jingle::Session::Reason( Jingle::Session::Reason::Success ) ) || !res->checkResult() || !ini->checkResult2() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Initiator: ended state"; + if( ini->js()->state() != Jingle::Session::Ended ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "Responder: ended state"; + if( res->js()->state() != Jingle::Session::Ended ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + delete ini; + delete res; + + if( fail == 0 ) + { + printf( "Jingle::Session: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Jingle::Session: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.am new file mode 100644 index 00000000..97b76d8f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.am @@ -0,0 +1,16 @@ + +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = jinglesessionjingle_test + +jinglesessionjingle_test_SOURCES = jinglesessionjingle_test.cpp +jinglesessionjingle_test_LDADD = ../../stanza.o ../../jid.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../jinglecontent.o ../../error.o ../../mutex.o \ + ../../jinglepluginfactory.o +jinglesessionjingle_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.in new file mode 100644 index 00000000..d16f600a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/Makefile.in @@ -0,0 +1,527 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = jinglesessionjingle_test$(EXEEXT) +subdir = src/tests/jinglesessionjingle +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_jinglesessionjingle_test_OBJECTS = \ + jinglesessionjingle_test.$(OBJEXT) +jinglesessionjingle_test_OBJECTS = \ + $(am_jinglesessionjingle_test_OBJECTS) +jinglesessionjingle_test_DEPENDENCIES = ../../stanza.o ../../jid.o \ + ../../tag.o ../../prep.o ../../gloox.o \ + ../../stanzaextensionfactory.o ../../iq.o ../../util.o \ + ../../sha.o ../../base64.o ../../jinglecontent.o ../../error.o \ + ../../mutex.o ../../jinglepluginfactory.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(jinglesessionjingle_test_SOURCES) +DIST_SOURCES = $(jinglesessionjingle_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +jinglesessionjingle_test_SOURCES = jinglesessionjingle_test.cpp +jinglesessionjingle_test_LDADD = ../../stanza.o ../../jid.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../jinglecontent.o ../../error.o ../../mutex.o \ + ../../jinglepluginfactory.o + +jinglesessionjingle_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/jinglesessionjingle/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/jinglesessionjingle/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +jinglesessionjingle_test$(EXEEXT): $(jinglesessionjingle_test_OBJECTS) $(jinglesessionjingle_test_DEPENDENCIES) $(EXTRA_jinglesessionjingle_test_DEPENDENCIES) + @rm -f jinglesessionjingle_test$(EXEEXT) + $(CXXLINK) $(jinglesessionjingle_test_OBJECTS) $(jinglesessionjingle_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglesessionjingle_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/jinglesessionjingle_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/jinglesessionjingle_test.cpp new file mode 100644 index 00000000..c0030236 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionjingle/jinglesessionjingle_test.cpp @@ -0,0 +1,326 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define JINGLE_TEST +#include "../../gloox.h" +#include "../../jid.h" +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../stanzaextension.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +namespace gloox +{ + + class Disco; + class Capabilities : public StanzaExtension + { + public: + Capabilities() : StanzaExtension( ExtUser + 1 ) {} + const std::string& ver() const { return EmptyString; } + const std::string& node() const { return EmptyString; } + }; + + class ClientBase + { + public: + ClientBase() : m_jid( "fooqbar/foobar" ) {} + virtual ~ClientBase() {} + const std::string getID() { return "id"; } + virtual void send( IQ& iq, IqHandler*, int ) = 0; + virtual void send( IQ& iq ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIDHandler( IqHandler* ) {} + void registerIqHandler( IqHandler*, int ) {} + void removeIqHandler( IqHandler*, int ) {} + void registerStanzaExtension( StanzaExtension* ext ) { delete ext; } + void removeStanzaExtension( int ) {} + ConnectionState state() const { return StateConnected; } + bool authed() { return false; } + const JID& jid() const { return m_jid; } + private: + JID m_jid; + }; +} + +#define CLIENTBASE_H__ +#include "../../jinglesession.h" +#include "../../jinglesession.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + JID jid( "foo@bar/barfoo" ); + + // ------- + { + name = "invalid Jingle 1"; + Jingle::Session::Jingle js; + Tag* t = js.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "invalid Jingle 2"; + Jingle::Session::Jingle js( Jingle::SessionAccept, JID(), JID(), 0, "" ); + Tag* t = js.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, content-accept"; + Jingle::Session::Jingle js( Jingle::ContentAccept, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, content-add"; + Jingle::Session::Jingle js( Jingle::ContentAdd, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, content-modify"; + Jingle::Session::Jingle js( Jingle::ContentModify, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, content-reject"; + Jingle::Session::Jingle js( Jingle::ContentReject, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, content-remove"; + Jingle::Session::Jingle js( Jingle::ContentRemove, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, description-info"; + Jingle::Session::Jingle js( Jingle::DescriptionInfo, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, session-accept"; + Jingle::Session::Jingle js( Jingle::SessionAccept, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, session-info"; + Jingle::Session::Jingle js( Jingle::SessionInfo, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, session-initiate"; + Jingle::Session::Jingle js( Jingle::SessionInitiate, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, session-terminate"; + Jingle::Session::Jingle js( Jingle::SessionTerminate, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, transport-accept"; + Jingle::Session::Jingle js( Jingle::TransportAccept, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, transport-info"; + Jingle::Session::Jingle js( Jingle::TransportInfo, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, transport-reject"; + Jingle::Session::Jingle js( Jingle::TransportReject, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "empty Jingle, transport-replace"; + Jingle::Session::Jingle js( Jingle::TransportReplace, jid, jid, 0, "somesid" ); + Tag* t = js.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + + + + // ------- + name = "Jingle::Session::Jingle/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new Jingle::Session::Jingle() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "jingle", "xmlns", XMLNS_JINGLE ); + IQ iq( IQ::Get, JID() ); + sef.addExtensions( iq, f ); + const Jingle::Session::Jingle* se = iq.findExtension( ExtJingle ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + + if( fail == 0 ) + { + printf( "Jingle::Session::Jingle: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Jingle::Session::Jingle: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.am new file mode 100644 index 00000000..2ed61b4b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.am @@ -0,0 +1,16 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = jinglesessionmanager_test + +jinglesessionmanager_test_SOURCES = jinglesessionmanager_test.cpp +jinglesessionmanager_test_LDADD = ../../tag.o ../../stanza.o ../../base64.o \ + ../../prep.o ../../gloox.o \ + ../../iq.o ../../util.o ../../mutex.o \ + ../../sha.o ../../error.o ../../jid.o \ + ../../jinglecontent.o ../../jinglepluginfactory.o \ + ../../stanzaextensionfactory.o ../../jingleiceudp.o ../../jinglefiletransfer.o +jinglesessionmanager_test_CFLAGS = $(CPPFLAGS) -g3 diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.in new file mode 100644 index 00000000..f9b62846 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/Makefile.in @@ -0,0 +1,529 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = jinglesessionmanager_test$(EXEEXT) +subdir = src/tests/jinglesessionmanager +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_jinglesessionmanager_test_OBJECTS = \ + jinglesessionmanager_test.$(OBJEXT) +jinglesessionmanager_test_OBJECTS = \ + $(am_jinglesessionmanager_test_OBJECTS) +jinglesessionmanager_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../base64.o ../../prep.o ../../gloox.o ../../iq.o \ + ../../util.o ../../mutex.o ../../sha.o ../../error.o \ + ../../jid.o ../../jinglecontent.o ../../jinglepluginfactory.o \ + ../../stanzaextensionfactory.o ../../jingleiceudp.o \ + ../../jinglefiletransfer.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(jinglesessionmanager_test_SOURCES) +DIST_SOURCES = $(jinglesessionmanager_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +jinglesessionmanager_test_SOURCES = jinglesessionmanager_test.cpp +jinglesessionmanager_test_LDADD = ../../tag.o ../../stanza.o ../../base64.o \ + ../../prep.o ../../gloox.o \ + ../../iq.o ../../util.o ../../mutex.o \ + ../../sha.o ../../error.o ../../jid.o \ + ../../jinglecontent.o ../../jinglepluginfactory.o \ + ../../stanzaextensionfactory.o ../../jingleiceudp.o ../../jinglefiletransfer.o + +jinglesessionmanager_test_CFLAGS = $(CPPFLAGS) -g3 +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/jinglesessionmanager/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/jinglesessionmanager/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +jinglesessionmanager_test$(EXEEXT): $(jinglesessionmanager_test_OBJECTS) $(jinglesessionmanager_test_DEPENDENCIES) $(EXTRA_jinglesessionmanager_test_DEPENDENCIES) + @rm -f jinglesessionmanager_test$(EXEEXT) + $(CXXLINK) $(jinglesessionmanager_test_OBJECTS) $(jinglesessionmanager_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jinglesessionmanager_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/jinglesessionmanager_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/jinglesessionmanager_test.cpp new file mode 100644 index 00000000..7a2df948 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/jinglesessionmanager/jinglesessionmanager_test.cpp @@ -0,0 +1,239 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define CLIENTBASE_H__ +#define DISCO_H__ +#define GLOOX_TESTS +#define JINGLE_TEST +#define IQ_TEST +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../jid.h" +#include "../../stanzaextension.h" +#include "../../stanzaextensionfactory.h" + +#include +#include +#include +#include // [s]print[f] + +namespace gloox +{ + class Disco + { + public: + Disco() {} + void addFeature( const std::string& ) {} + }; + + class ClientBase + { + public: + ClientBase() : m_jid( "self" ) {} + virtual ~ClientBase() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( const IQ& ) = 0; + virtual void send( IQ&, IqHandler*, int ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ih ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + Disco* disco() { return &m_disco; } + protected: + JID m_jid; + Disco m_disco; + StanzaExtensionFactory m_sef; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::removeIDHandler( IqHandler* ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define JINGLESESSION_TEST +#include "../../jinglesession.h" +#include "../../jinglesession.cpp" +#include "../../jinglesessionhandler.h" +#include "../../jinglesessionmanager.h" +#include "../../jinglesessionmanager.cpp" +#include "../../jinglecontent.h" +#include "../../jingleiceudp.h" +#include "../../jinglefiletransfer.h" +class TestInitiator : public ClientBase, public Jingle::SessionHandler +{ + public: + TestInitiator() : m_sm( this, this ), m_result( false ), m_result2( false ) + { + m_sef.registerExtension( new Jingle::Session::Jingle() ); + m_sm.registerPlugin( new Jingle::Content() ); + m_sm.registerPlugin( new Jingle::ICEUDP() ); + m_sm.registerPlugin( new Jingle::FileTransfer() ); + } + virtual ~TestInitiator() {} + void setTest( int test ) { m_test = test; } + virtual void send( const IQ& ) {} + virtual void send( IQ& , IqHandler*, int ) {} + virtual void send( Tag* tag ); + virtual void trackID( IqHandler *ih, const std::string& id, int context ) {} + bool checkResult() { bool t = m_result; m_result = false; return t; } + bool checkResult2() { bool t = m_result2; m_result2 = false; return t; } + virtual void handleSessionAction( Jingle::Action action, Jingle::Session* session, const Jingle::Session::Jingle* jingle ); + virtual void handleSessionActionError( Jingle::Action action, Jingle::Session* /*session*/, const Error* /*e*/ ) {} + virtual void handleIncomingSession( Jingle::Session* session ) {} +private: + Jingle::SessionManager m_sm; + int m_test; + bool m_result; + bool m_result2; +}; + + + + +void TestInitiator::handleSessionAction( Jingle::Action action, Jingle::Session* session, const Jingle::Session::Jingle* jingle ) +{ + m_result = false; + switch( m_test ) + { + case 1: + if( action != Jingle::InvalidAction || jingle->plugins().size() != 0 ) + { + printf( "action: %d, plugins: %d\n", action, jingle->plugins().size() ); + } + else + m_result = true; + break; + case 2: + if( action != Jingle::SessionInitiate || jingle->plugins().size() != 1 || static_cast( jingle->plugins().front() )->name() != "stub" ) + { + printf( "action: %d, plugins: %d\n", action, jingle->plugins().size() ); + } + else + m_result = true; + break; + case 3: + if( action != Jingle::SessionInitiate || jingle->plugins().size() != 1 || static_cast( jingle->plugins().front() )->name() != "iceudp" + || static_cast( jingle->plugins().front() )->plugins().size() != 1 + || static_cast( static_cast( jingle->plugins().front() )->plugins().front() )->pwd() != "pwd" ) + { + printf( "action: %d, plugins: %d\n", action, jingle->plugins().size() ); + } + else + m_result = true; + break; + case 4: + if( action != Jingle::SessionInitiate || jingle->plugins().size() != 1 || static_cast( jingle->plugins().front() )->name() != "ft" + || static_cast( jingle->plugins().front() )->plugins().size() != 2 + || static_cast( static_cast( jingle->plugins().front() )->plugins().front() )->pwd() != "pwd" + || static_cast( static_cast( jingle->plugins().front() )->plugins().back() )->type() != Jingle::FileTransfer::Offer ) + { + printf( "action: %d, plugins: %d\n", action, jingle->plugins().size() ); + } + else + m_result = true; + break; + } + +} + +void TestInitiator::send( Tag* tag ) +{ + IQ iq( tag ); + m_sef.addExtensions( iq, tag ); + m_sm.handleIq( iq ); +} + + +// ------------------------------------------------------------------------------------------------------------ + + + +// ------------------------------------------------------------------------------------------------------------ + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + TestInitiator ini; + Tag* i = new Tag( "iq" ); i->addAttribute( "from", "me@there" ); i->addAttribute( "to", "you@here" ); i->addAttribute( "type", "set" ); i->addAttribute( "id", "someid" ); + Tag* j = new Tag( i, "jingle", XMLNS, XMLNS_JINGLE ); + Tag* c = 0; + + // ------- + name = "invalid jingle"; + ini.setTest( 1 ); + ini.send( i ); + if( !ini.checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "jingle with empty content"; + ini.setTest( 2 ); + j->addAttribute( "action", "session-initiate" ); + c = new Tag( j, "content" ); c->addAttribute( "creator", "initor" ); c->addAttribute( "name", "stub" ); + ini.send( i ); + if( !ini.checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "jingle with content and transport"; + ini.setTest( 3 ); + c->addAttribute( "name", "iceudp" ); + Tag* t = new Tag( c, "transport", XMLNS, XMLNS_JINGLE_ICE_UDP ); t->addAttribute( "pwd", "pwd" ); t->addAttribute( "ufrag", "ufrag" ); + ini.send( i ); + if( !ini.checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "jingle with content and transport + description"; + ini.setTest( 4 ); + c->addAttribute( "name", "ft" ); + Tag* d = new Tag( c, "description", XMLNS, XMLNS_JINGLE_FILE_TRANSFER ); new Tag( new Tag( d, "offer" ), "file" ); + ini.send( i ); + if( !ini.checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + delete i; + + + if( fail == 0 ) + { + printf( "Jingle::SessionManager: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Jingle::SessionManager: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.am new file mode 100644 index 00000000..76139d71 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.am @@ -0,0 +1,17 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = lastactivity_test + +lastactivity_test_SOURCES = lastactivity_test.cpp +lastactivity_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o +lastactivity_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.in new file mode 100644 index 00000000..aa6a88da --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/Makefile.in @@ -0,0 +1,528 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = lastactivity_test$(EXEEXT) +subdir = src/tests/lastactivity +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_lastactivity_test_OBJECTS = lastactivity_test.$(OBJEXT) +lastactivity_test_OBJECTS = $(am_lastactivity_test_OBJECTS) +lastactivity_test_DEPENDENCIES = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o ../../gloox.o \ + ../../iq.o ../../stanza.o ../../error.o \ + ../../dataformfieldcontainer.o ../../dataform.o \ + ../../dataformfield.o ../../dataformitem.o \ + ../../softwareversion.o ../../dataformreported.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(lastactivity_test_SOURCES) +DIST_SOURCES = $(lastactivity_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +lastactivity_test_SOURCES = lastactivity_test.cpp +lastactivity_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o + +lastactivity_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/lastactivity/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/lastactivity/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +lastactivity_test$(EXEEXT): $(lastactivity_test_OBJECTS) $(lastactivity_test_DEPENDENCIES) $(EXTRA_lastactivity_test_DEPENDENCIES) + @rm -f lastactivity_test$(EXEEXT) + $(CXXLINK) $(lastactivity_test_OBJECTS) $(lastactivity_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lastactivity_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/lastactivity_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/lastactivity_test.cpp new file mode 100644 index 00000000..2768dd5b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/lastactivity/lastactivity_test.cpp @@ -0,0 +1,143 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../jid.h" +#include "../../tag.h" +#include "../../iqhandler.h" +#include "../../lastactivityhandler.h" +#include "../../disco.h" + +#include +#include +#include +#include // [s]print[f] + +const std::string& g_dir = "test.dir"; +const std::string& g_inst = "the instructions"; +const std::string& g_profile = "test-prof"; + +gloox::Tag* t1 = 0; +gloox::Tag* t2 = 0; +const gloox::JID to( "abc@def.gh/ijk" ); + +namespace gloox +{ + +// class Disco +// { +// public: +// Disco(); +// ~Disco(); +// void addFeature( const std::string& feature ); +// void removeFeature( const std::string& feature ); +// }; +// Disco::Disco() {} +// Disco::~Disco() {} +// void Disco::addFeature( const std::string& /*feature*/ ) {} +// void Disco::removeFeature( const std::string& /*feature*/ ) {} + + class ClientBase : public LastActivityHandler + { + public: + ClientBase(); + ~ClientBase(); + const std::string getID(); + Disco* disco(); + void send( IQ& iq, IqHandler* = 0 , int = 0 ); + void trackID( IqHandler *ih, const std::string& id, int context ); + void registerIqHandler( IqHandler *ih, int ext ); + void removeIqHandler( IqHandler* ih, int ext ); + void removeIDHandler( IqHandler* ) {} + void registerStanzaExtension( StanzaExtension* ) {} + void removeStanzaExtension( int ) {} + virtual void handleLastActivityResult( const JID&, long int, const std::string& ) {} + virtual void handleLastActivityError( const JID&, StanzaError ) {} + void setTest( int test ); + bool ok(); + private: + Disco* m_disco; + int m_test; + bool m_ok; + }; + ClientBase::ClientBase() : m_disco( new Disco( this ) ), m_test( 0 ), m_ok( false ) {} + ClientBase::~ClientBase() { delete m_disco; } + const std::string ClientBase::getID() { return "id"; } + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::send( IQ& iq, IqHandler*, int ) + { + Tag* tag = iq.tag(); + switch( m_test ) + { + case 1: + { + break; + } + } + delete tag; + } + void ClientBase::trackID( IqHandler* /*ih*/, const std::string& /*id*/, int /*context*/ ) {} + void ClientBase::registerIqHandler( IqHandler* /*ih*/, int /*ext*/ ) {} + void ClientBase::removeIqHandler( IqHandler* /*ih*/, int /*ext*/ ) {} + void ClientBase::setTest( int test ) { m_test = test; } + bool ClientBase::ok() { bool t = m_ok; m_ok = false; return t; } +} + +#define CLIENTBASE_H__ +#define DISCO_H__ +#include "../../disco.cpp" +#include "../../lastactivity.h" +#include "../../lastactivity.cpp" +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + gloox::LastActivity* la = 0; + + gloox::ClientBase* cb = new gloox::ClientBase(); + la = new gloox::LastActivity( cb ); + + + // ------- + name = "request si"; + cb->setTest( 1 ); + if( false ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + + + + + delete la; + delete cb; + + printf( "LastActivity: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.am new file mode 100644 index 00000000..778a58db --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.am @@ -0,0 +1,16 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = lastactivityquery_test + +lastactivityquery_test_SOURCES = lastactivityquery_test.cpp +lastactivityquery_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o ../../mutex.o +lastactivityquery_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.in new file mode 100644 index 00000000..3b6ad50d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/Makefile.in @@ -0,0 +1,527 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = lastactivityquery_test$(EXEEXT) +subdir = src/tests/lastactivityquery +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_lastactivityquery_test_OBJECTS = lastactivityquery_test.$(OBJEXT) +lastactivityquery_test_OBJECTS = $(am_lastactivityquery_test_OBJECTS) +lastactivityquery_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o ../../dataformitem.o \ + ../../softwareversion.o ../../dataformreported.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(lastactivityquery_test_SOURCES) +DIST_SOURCES = $(lastactivityquery_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +lastactivityquery_test_SOURCES = lastactivityquery_test.cpp +lastactivityquery_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../dataformfieldcontainer.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformitem.o ../../softwareversion.o \ + ../../dataformreported.o ../../mutex.o + +lastactivityquery_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/lastactivityquery/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/lastactivityquery/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +lastactivityquery_test$(EXEEXT): $(lastactivityquery_test_OBJECTS) $(lastactivityquery_test_DEPENDENCIES) $(EXTRA_lastactivityquery_test_DEPENDENCIES) + @rm -f lastactivityquery_test$(EXEEXT) + $(CXXLINK) $(lastactivityquery_test_OBJECTS) $(lastactivityquery_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lastactivityquery_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/lastactivityquery_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/lastactivityquery_test.cpp new file mode 100644 index 00000000..7f84742b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/lastactivityquery/lastactivityquery_test.cpp @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../base64.h" +#include "../../stanzaextensionfactory.h" +#include "../../disco.h" +#include "../../lastactivityhandler.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() : m_disco( new Disco( this ) ) {} + virtual ~ClientBase() { delete m_disco; } + Disco* disco(); + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + private: + Disco* m_disco; + JID m_jid; + }; + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define LASTACTIVITY_TEST +#include "../../disco.cpp" +#include "../../lastactivity.h" +#include "../../lastactivity.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + // ------- + { + name = "empty tag() test"; + LastActivity::Query laq; + if( false ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "parse test"; + Tag* t = new Tag( "query" ); + t->setXmlns( XMLNS_LAST ); + t->addAttribute( "seconds", "123" ); + t->setCData( "foo" ); + LastActivity::Query laq( t ); + if( laq.seconds() != 123 || laq.status() != "foo" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "tag() test"; // uses t from previous test + Tag* s = laq.tag(); + if( *t != *s ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + delete s; + } + + + + + StanzaExtensionFactory sef; + sef.registerExtension( new LastActivity::Query() ); + // ------- + { + name = "LastActivity::Query/SEFactory test"; + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_LAST ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const LastActivity::Query* se = iq.findExtension( ExtLastActivity ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + printf( "LastActivity::Query: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.am new file mode 100644 index 00000000..5d102d2c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = md5_test + +md5_test_SOURCES = md5_test.cpp +md5_test_LDADD = ../../md5.o +md5_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.in new file mode 100644 index 00000000..6a93b1db --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/md5/Makefile.in @@ -0,0 +1,516 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = md5_test$(EXEEXT) +subdir = src/tests/md5 +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_md5_test_OBJECTS = md5_test.$(OBJEXT) +md5_test_OBJECTS = $(am_md5_test_OBJECTS) +md5_test_DEPENDENCIES = ../../md5.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(md5_test_SOURCES) +DIST_SOURCES = $(md5_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +md5_test_SOURCES = md5_test.cpp +md5_test_LDADD = ../../md5.o +md5_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/md5/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/md5/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +md5_test$(EXEEXT): $(md5_test_OBJECTS) $(md5_test_DEPENDENCIES) $(EXTRA_md5_test_DEPENDENCIES) + @rm -f md5_test$(EXEEXT) + $(CXXLINK) $(md5_test_OBJECTS) $(md5_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/md5/md5_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/md5/md5_test.cpp new file mode 100644 index 00000000..0e4a41e6 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/md5/md5_test.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../md5.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + MD5 md5; + + + + // ------- + name = "empty string"; + md5.feed( "" ); + md5.finalize(); + if( md5.hex() != "d41d8cd98f00b204e9800998ecf8427e" ) + { + printf( "expect: d41d8cd98f00b204e9800998ecf8427e\n" ); + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), md5.hex().c_str() ); + } + md5.reset(); + + // ------- + name = "The quick brown fox jumps over the lazy dog"; + md5.feed( name ); + md5.finalize(); + if( md5.hex() != "9e107d9d372bb6826bd81d3542a419d6" ) + { + printf( "expect: 9e107d9d372bb6826bd81d3542a419d6\n" ); + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), md5.hex().c_str() ); + } + md5.reset(); + + // ------- + name = "The quick brown fox jumps over the lazy cog"; + md5.feed( name ); + md5.finalize(); + if( md5.hex() != "1055d3e698d289f2af8663725127bd4b" ) + { + printf( "expect: 1055d3e698d289f2af8663725127bd4b\n" ); + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), md5.hex().c_str() ); + } + md5.reset(); + + // ------- + name = "two-step"; + md5.feed( "The quick brown fox "); + md5.feed( "jumps over the lazy dog" ); + md5.finalize(); + if( md5.hex() != "9e107d9d372bb6826bd81d3542a419d6" ) + { + printf( "expect: 9e107d9d372bb6826bd81d3542a419d6\n" ); + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), md5.hex().c_str() ); + } + md5.reset(); + + // ------- + name = "many-step"; + md5.feed( "The" ); + md5.feed( " quick bro" ); + md5.feed( "" ); + md5.feed( "wn fox " ); + md5.feed( "jumps over the lazy dog" ); + md5.finalize(); + if( md5.hex() != "9e107d9d372bb6826bd81d3542a419d6" ) + { + printf( "expect: 9e107d9d372bb6826bd81d3542a419d6\n" ); + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), md5.hex().c_str() ); + } + md5.reset(); + + + + if( fail == 0 ) + { + printf( "MD5: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "MD5: %d test(s) failed\n", fail ); + return 1; + } + + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.am new file mode 100644 index 00000000..50725d6d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = message_test + +message_test_SOURCES = message_test.cpp +message_test_LDADD = ../../tag.o ../../message.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o ../../delayeddelivery.o +message_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.in new file mode 100644 index 00000000..42ddbbf8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/message/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = message_test$(EXEEXT) +subdir = src/tests/message +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_message_test_OBJECTS = message_test.$(OBJEXT) +message_test_OBJECTS = $(am_message_test_OBJECTS) +message_test_DEPENDENCIES = ../../tag.o ../../message.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../gloox.o ../../util.o \ + ../../sha.o ../../base64.o ../../delayeddelivery.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(message_test_SOURCES) +DIST_SOURCES = $(message_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +message_test_SOURCES = message_test.cpp +message_test_LDADD = ../../tag.o ../../message.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o ../../delayeddelivery.o + +message_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/message/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/message/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +message_test$(EXEEXT): $(message_test_OBJECTS) $(message_test_DEPENDENCIES) $(EXTRA_message_test_DEPENDENCIES) + @rm -f message_test$(EXEEXT) + $(CXXLINK) $(message_test_OBJECTS) $(message_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/message_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/message/message_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/message/message_test.cpp new file mode 100644 index 00000000..2b904eed --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/message/message_test.cpp @@ -0,0 +1,251 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define GLOOX_TESTS +#define MESSAGE_TEST +#include "../../tag.h" +#include "../../message.h" +#include "../../stanza.h" +#include "../../jid.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *msg = new Tag( "message" ); + msg->addAttribute( "from", "me@example.net/gloox" ); + msg->addAttribute( "to", "you@example.net/gloox" ); + msg->addAttribute( "id", "id1" ); + new Tag( msg, "body", "the body" ); + Message* i = 0; + + // ------- + name = "parse Message normal 1"; + i = new Message( msg ); + if( i->subtype() != Message::Normal + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->id() != "id1" || i->body() != "the body" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Message normal 2"; + msg->addAttribute( "type", "normal" ); + i = new Message( msg ); + if( i->subtype() != Message::Normal + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->id() != "id1" || i->body() != "the body" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Message chat"; + msg->addAttribute( "type", "chat" ); + i = new Message( msg ); + if( i->subtype() != Message::Chat + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->id() != "id1" || i->body() != "the body" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Message groupchat"; + msg->addAttribute( "type", "groupchat" ); + i = new Message( msg ); + if( i->subtype() != Message::Groupchat + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->id() != "id1" || i->body() != "the body" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Message error"; + msg->addAttribute( "type", "error" ); + i = new Message( msg ); + if( i->subtype() != Message::Error + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->id() != "id1" || i->body() != "the body" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + { + name = "new simple Message error"; + Message m( Message::Error, JID( "xyz@example.org/blah" ), "the body", "the subject", + "the thread", "the xmllang" ); + m.setFrom( JID( "foo@bar.com" ) ); + Tag* i = m.tag(); + if( !i->hasAttribute( "type", "error" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "body", "the body" ) || !i->hasChildWithCData( "thread", "the thread" ) + || !i->hasChildWithCData( "subject", "the subject" ) || !i->hasChild( "body", "xml:lang", "the xmllang" ) + || !i->hasChild( "subject", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Message chat"; + Message m( Message::Chat, JID( "xyz@example.org/blah" ), "the body", "the subject", + "the thread", "the xmllang" ); + m.setFrom( JID( "foo@bar.com" ) ); + Tag* i = m.tag(); + if( !i->hasAttribute( "type", "chat" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "body", "the body" ) || !i->hasChildWithCData( "thread", "the thread" ) + || !i->hasChildWithCData( "subject", "the subject" ) || !i->hasChild( "body", "xml:lang", "the xmllang" ) + || !i->hasChild( "subject", "xml:lang", "the xmllang" ) || m.body( "the xmllang" ) != "the body" + || m.subject( "the xmllang" ) != "the subject" || m.thread() != "the thread" + || m.from() != "foo@bar.com" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Message normal"; + Message m( Message::Normal, JID( "xyz@example.org/blah" ), "the body", "the subject", + "the thread", "the xmllang" ); + m.setFrom( JID( "foo@bar.com" ) ); + Tag* i = m.tag(); + if( !i->hasAttribute( "type", "normal" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "body", "the body" ) || !i->hasChildWithCData( "thread", "the thread" ) + || !i->hasChildWithCData( "subject", "the subject" ) || !i->hasChild( "body", "xml:lang", "the xmllang" ) + || !i->hasChild( "subject", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Message groupchat"; + Message m( Message::Groupchat, JID( "xyz@example.org/blah" ), "the body", "the subject", + "the thread", "the xmllang" ); + m.setFrom( JID( "foo@bar.com" ) ); + Tag* i = m.tag(); + if( !i->hasAttribute( "type", "groupchat" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "body", "the body" ) || !i->hasChildWithCData( "thread", "the thread" ) + || !i->hasChildWithCData( "subject", "the subject" ) + || !i->hasChild( "body", "xml:lang", "the xmllang" ) + || !i->hasChild( "subject", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + i = 0; + } + + // ------- + name = "lang test"; + Tag* tag = new Tag( "message", "to", "you@there.org" ); + + Tag* body = new Tag( tag, "body", "xml:lang", "fr" ); + body->setCData( "anglais" ); + body = new Tag( tag, "body" ); + body->setCData( "english" ); + + Tag* subject = new Tag( tag, "subject", "xml:lang", "fr" ); + subject->setCData( "sujet" ); + subject = new Tag( tag, "subject" ); + subject->setCData( "subject" ); + + i = new Message( tag ); + + if( i->body() != "english" + || i->body( "default" ) != "english" + || i->body( "xyz" ) != "english" + || i->body( "fr" ) != "anglais" + || i->subject() != "subject" + || i->subject( "default" ) != "subject" + || i->subject( "xyz" ) != "subject" + || i->subject( "fr" ) != "sujet" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s, %s, %s, %s, %s, %s, %s, %s\n", name.c_str(), + i->body().c_str(), i->body( "default" ).c_str(), + i->body( "xyz" ).c_str(), i->body( "fr" ).c_str(), + i->subject().c_str(), i->subject( "default" ).c_str(), + i->subject( "xyz" ).c_str(), i->subject( "fr" ).c_str() ); + } + delete i; + i = 0; + delete tag; + tag = 0; + + + + + + + + + + + + + + + + delete msg; + msg = 0; + + if( fail == 0 ) + { + printf( "Message: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Message: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.am new file mode 100644 index 00000000..85e3697b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.am @@ -0,0 +1,14 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = messageeventfilter_test + +messageeventfilter_test_SOURCES = messageeventfilter_test.cpp +messageeventfilter_test_LDADD = ../../tag.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../gloox.o \ + ../../message.o ../../util.o \ + ../../sha.o ../../base64.o ../../messageevent.o +messageeventfilter_test_CPPFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.in new file mode 100644 index 00000000..5674dc32 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/Makefile.in @@ -0,0 +1,538 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = messageeventfilter_test$(EXEEXT) +subdir = src/tests/messageeventfilter +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_messageeventfilter_test_OBJECTS = \ + messageeventfilter_test-messageeventfilter_test.$(OBJEXT) +messageeventfilter_test_OBJECTS = \ + $(am_messageeventfilter_test_OBJECTS) +messageeventfilter_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../gloox.o ../../message.o \ + ../../util.o ../../sha.o ../../base64.o ../../messageevent.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(messageeventfilter_test_SOURCES) +DIST_SOURCES = $(messageeventfilter_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +messageeventfilter_test_SOURCES = messageeventfilter_test.cpp +messageeventfilter_test_LDADD = ../../tag.o ../../stanza.o \ + ../../jid.o ../../prep.o ../../gloox.o \ + ../../message.o ../../util.o \ + ../../sha.o ../../base64.o ../../messageevent.o + +messageeventfilter_test_CPPFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/messageeventfilter/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/messageeventfilter/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +messageeventfilter_test$(EXEEXT): $(messageeventfilter_test_OBJECTS) $(messageeventfilter_test_DEPENDENCIES) $(EXTRA_messageeventfilter_test_DEPENDENCIES) + @rm -f messageeventfilter_test$(EXEEXT) + $(CXXLINK) $(messageeventfilter_test_OBJECTS) $(messageeventfilter_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/messageeventfilter_test-messageeventfilter_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +messageeventfilter_test-messageeventfilter_test.o: messageeventfilter_test.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(messageeventfilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT messageeventfilter_test-messageeventfilter_test.o -MD -MP -MF $(DEPDIR)/messageeventfilter_test-messageeventfilter_test.Tpo -c -o messageeventfilter_test-messageeventfilter_test.o `test -f 'messageeventfilter_test.cpp' || echo '$(srcdir)/'`messageeventfilter_test.cpp +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/messageeventfilter_test-messageeventfilter_test.Tpo $(DEPDIR)/messageeventfilter_test-messageeventfilter_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='messageeventfilter_test.cpp' object='messageeventfilter_test-messageeventfilter_test.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(messageeventfilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o messageeventfilter_test-messageeventfilter_test.o `test -f 'messageeventfilter_test.cpp' || echo '$(srcdir)/'`messageeventfilter_test.cpp + +messageeventfilter_test-messageeventfilter_test.obj: messageeventfilter_test.cpp +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(messageeventfilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT messageeventfilter_test-messageeventfilter_test.obj -MD -MP -MF $(DEPDIR)/messageeventfilter_test-messageeventfilter_test.Tpo -c -o messageeventfilter_test-messageeventfilter_test.obj `if test -f 'messageeventfilter_test.cpp'; then $(CYGPATH_W) 'messageeventfilter_test.cpp'; else $(CYGPATH_W) '$(srcdir)/messageeventfilter_test.cpp'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/messageeventfilter_test-messageeventfilter_test.Tpo $(DEPDIR)/messageeventfilter_test-messageeventfilter_test.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='messageeventfilter_test.cpp' object='messageeventfilter_test-messageeventfilter_test.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(messageeventfilter_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o messageeventfilter_test-messageeventfilter_test.obj `if test -f 'messageeventfilter_test.cpp'; then $(CYGPATH_W) 'messageeventfilter_test.cpp'; else $(CYGPATH_W) '$(srcdir)/messageeventfilter_test.cpp'; fi` + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/messageeventfilter_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/messageeventfilter_test.cpp new file mode 100644 index 00000000..1f85faa9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/messageeventfilter/messageeventfilter_test.cpp @@ -0,0 +1,252 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../stanza.h" +#include "../../tag.h" +#include "../../prep.h" +#include "../../gloox.h" +#include "../../jid.h" +#include "../../messageeventhandler.h" +#include "../../message.h" +#include "../../messageevent.h" + +#include +#include +#include // [s]print[f] + +namespace gloox +{ + class MessageSession : public MessageEventHandler + { + public: + MessageSession() : m_jid( "abc@example.net/foo" ), m_test( 0 ), m_result( false ) {} + virtual ~MessageSession() {} + const JID& target() const { return m_jid; } + void send( Message& msg ) + { + const MessageEvent* me = msg.findExtension( ExtMessageEvent ); + if( !me ) + return; + + switch( m_test ) + { + case 0: + if( me->event() == MessageEventOffline ) + m_result = true; + break; + case 1: + if( me->event() == MessageEventDelivered ) + m_result = true; + break; + case 2: + if( me->event() == MessageEventDisplayed ) + m_result = true; + break; + case 3: + if( me->event() == MessageEventComposing ) + m_result = true; + break; + case 4: + if( me->event() == MessageEventCancel ) + m_result = true; + break; + default: + break; + } + } + void setTest( int test ) { m_test = test; } + bool ok() { bool ok = m_result; m_result = false; return ok; } + virtual void handleMessageEvent( const JID& from, MessageEventType event ) + { + printf( "recved event %d\n", event ); + } + private: + JID m_jid; + int m_test; + bool m_result; + }; + + class MessageFilter + { + public: + MessageFilter( MessageSession *parent ); + virtual ~MessageFilter(); + void attachTo( MessageSession *session ); + virtual void decorate( Message& msg ); + void send( Message& msg ); + protected: + MessageSession *m_parent; + }; + + MessageFilter::MessageFilter( MessageSession *parent ) : m_parent( parent ) {} + MessageFilter::~MessageFilter() { delete m_parent; } + void MessageFilter::attachTo( MessageSession *session ) {} + void MessageFilter::decorate( Message& msg ) {} + void MessageFilter::send( Message& msg ) { m_parent->send( msg ); } +} + +#define MESSAGEFILTER_H__ +#define MESSAGESESSION_H__ +#include "../../messageeventfilter.h" +#include "../../messageeventfilter.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + gloox::MessageEventFilter *f; + gloox::MessageSession *ms; + gloox::Tag *x = 0; + + // ------- + { + name = "simple decorate"; + f = new gloox::MessageEventFilter( new gloox::MessageSession() ); + gloox::Message m( gloox::Message::Chat, gloox::JID() ); + f->decorate( m ); + const gloox::MessageEvent* me = m.findExtension( gloox::ExtMessageEvent ); + if( me && me->event() != ( gloox::MessageEventOffline | gloox::MessageEventDelivered + | gloox::MessageEventDisplayed | gloox::MessageEventComposing ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + f = 0; + } + + // ------- + ms = new gloox::MessageSession(); + f = new gloox::MessageEventFilter( ms ); + f->registerMessageEventHandler( ms ); + + gloox::Message m( gloox::Message::Chat, gloox::JID(), "my message" ); + m.addExtension( new gloox::MessageEvent( gloox::MessageEventOffline | gloox::MessageEventDelivered + | gloox::MessageEventDisplayed | gloox::MessageEventComposing + | gloox::MessageEventCancel) ); + f->filter( m ); + + name = "raise offline event 1"; + ms->setTest( 0 ); + f->raiseMessageEvent( gloox::MessageEventOffline ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise offline event 2"; + ms->setTest( 0 ); + f->raiseMessageEvent( gloox::MessageEventOffline ); + if( ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise delivered event 1"; + ms->setTest( 1 ); + f->raiseMessageEvent( gloox::MessageEventDelivered ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise delivered event 2"; + ms->setTest( 1 ); + f->raiseMessageEvent( gloox::MessageEventDelivered ); + if( ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise displayed event 1"; + ms->setTest( 2 ); + f->raiseMessageEvent( gloox::MessageEventDisplayed ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise displayed event 2"; + ms->setTest( 2 ); + f->raiseMessageEvent( gloox::MessageEventDisplayed ); + if( ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise composing event 1"; + ms->setTest( 3 ); + f->raiseMessageEvent( gloox::MessageEventComposing ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise composing event 2"; + ms->setTest( 3 ); + f->raiseMessageEvent( gloox::MessageEventComposing ); + if( ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise cancel event 1"; + ms->setTest( 4 ); + f->raiseMessageEvent( gloox::MessageEventCancel ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + name = "raise cancel event 2"; + ms->setTest( 4 ); + f->raiseMessageEvent( gloox::MessageEventCancel ); + if( !ms->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + delete f; + f = 0; + + + + + + + + + + + + if( fail == 0 ) + { + printf( "MessageEventFilter: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "MessageEventFilter: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.am new file mode 100644 index 00000000..6b2b9b8f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.am @@ -0,0 +1,23 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = mucroommuc_test + +mucroommuc_test_SOURCES = mucroommuc_test.cpp +mucroommuc_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o +mucroommuc_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.in new file mode 100644 index 00000000..3feb1cd3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/Makefile.in @@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = mucroommuc_test$(EXEEXT) +subdir = src/tests/mucroommuc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_mucroommuc_test_OBJECTS = mucroommuc_test.$(OBJEXT) +mucroommuc_test_OBJECTS = $(am_mucroommuc_test_OBJECTS) +mucroommuc_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../mucroom.o \ + ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(mucroommuc_test_SOURCES) +DIST_SOURCES = $(mucroommuc_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +mucroommuc_test_SOURCES = mucroommuc_test.cpp +mucroommuc_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +mucroommuc_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/mucroommuc/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/mucroommuc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +mucroommuc_test$(EXEEXT): $(mucroommuc_test_OBJECTS) $(mucroommuc_test_DEPENDENCIES) $(EXTRA_mucroommuc_test_DEPENDENCIES) + @rm -f mucroommuc_test$(EXEEXT) + $(CXXLINK) $(mucroommuc_test_OBJECTS) $(mucroommuc_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mucroommuc_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/mucroommuc_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/mucroommuc_test.cpp new file mode 100644 index 00000000..bf72fbd1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommuc/mucroommuc_test.cpp @@ -0,0 +1,149 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define MUCROOM_TEST +#include "../../mucroom.h" +#include "../../dataform.h" +#include "../../iq.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag* t = 0; + + + // ------- + { + name = "joining a room"; + MUCRoom::MUC mu; + t = mu.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "joining a password-protected room"; + MUCRoom::MUC mu( "foopwd" ); + t = mu.tag(); + if( !t || t->xml() != "" + "foopwd" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "joining room, requesting room history 1"; + MUCRoom::MUC mu( EmptyString, MUCRoom::HistorySince, "foodate" ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "joining room, requesting room history 2"; + MUCRoom::MUC mu( EmptyString, MUCRoom::HistoryMaxChars, EmptyString, 100 ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "joining room, requesting room history 3"; + MUCRoom::MUC mu( EmptyString, MUCRoom::HistoryMaxStanzas, EmptyString, 100 ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "joining room, requesting room history 4 + password"; + MUCRoom::MUC mu( "foopwd", MUCRoom::HistorySeconds, EmptyString, 100 ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "foopwd" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "MUCRoom::MUC/SEFactory test (presence)"; + StanzaExtensionFactory sef; + sef.registerExtension( new MUCRoom::MUC() ); + Tag* f = new Tag( "presence" ); + new Tag( f, "x", "xmlns", XMLNS_MUC ); + Presence pres( Presence::Available, JID(), "" ); + sef.addExtensions( pres, f ); + const MUCRoom::MUC* se = pres.findExtension( ExtMUC ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + printf( "MUCRoom::MUC: " ); + if( !fail ) + printf( "OK\n" ); + else + fprintf( stderr, "%d test(s) failed\n", fail ); + + return fail; +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.am new file mode 100644 index 00000000..5f35fd38 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.am @@ -0,0 +1,23 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = mucroommucadmin_test + +mucroommucadmin_test_SOURCES = mucroommucadmin_test.cpp +mucroommucadmin_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o +mucroommucadmin_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.in new file mode 100644 index 00000000..896425c8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/Makefile.in @@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = mucroommucadmin_test$(EXEEXT) +subdir = src/tests/mucroommucadmin +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_mucroommucadmin_test_OBJECTS = mucroommucadmin_test.$(OBJEXT) +mucroommucadmin_test_OBJECTS = $(am_mucroommucadmin_test_OBJECTS) +mucroommucadmin_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../mucroom.o \ + ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(mucroommucadmin_test_SOURCES) +DIST_SOURCES = $(mucroommucadmin_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +mucroommucadmin_test_SOURCES = mucroommucadmin_test.cpp +mucroommucadmin_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +mucroommucadmin_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/mucroommucadmin/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/mucroommucadmin/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +mucroommucadmin_test$(EXEEXT): $(mucroommucadmin_test_OBJECTS) $(mucroommucadmin_test_DEPENDENCIES) $(EXTRA_mucroommucadmin_test_DEPENDENCIES) + @rm -f mucroommucadmin_test$(EXEEXT) + $(CXXLINK) $(mucroommucadmin_test_OBJECTS) $(mucroommucadmin_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mucroommucadmin_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/mucroommucadmin_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/mucroommucadmin_test.cpp new file mode 100644 index 00000000..e4ddb636 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucadmin/mucroommucadmin_test.cpp @@ -0,0 +1,318 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define MUCROOM_TEST +#include "../../mucroom.h" +#include "../../dataform.h" +#include "../../iq.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "set role 'none'"; + MUCRoom::MUCAdmin ma( RoleNone, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set role 'visitor'"; + MUCRoom::MUCAdmin ma( RoleVisitor, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set role 'participant'"; + MUCRoom::MUCAdmin ma( RoleParticipant, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set role 'moderator'"; + MUCRoom::MUCAdmin ma( RoleModerator, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set affiliation 'none'"; + MUCRoom::MUCAdmin ma( AffiliationNone, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set affiliation 'outcast'"; + MUCRoom::MUCAdmin ma( AffiliationOutcast, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set affiliation 'member'"; + MUCRoom::MUCAdmin ma( AffiliationMember, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set affiliation 'owner'"; + MUCRoom::MUCAdmin ma( AffiliationOwner, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "set affiliation 'admin'"; + MUCRoom::MUCAdmin ma( AffiliationAdmin, "foo", "fooish" ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "fooish" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "request role list: 'participant'"; + MUCRoom::MUCAdmin ma( RequestVoiceList ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "request role list: 'moderator'"; + MUCRoom::MUCAdmin ma( RequestModeratorList ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "request affiliation list: 'outcast'"; + MUCRoom::MUCAdmin ma( RequestBanList ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "request affiliation list: 'member'"; + MUCRoom::MUCAdmin ma( RequestMemberList ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "store affiliation list: 'member'"; + MUCListItemList list; + list.push_back( MUCListItem( JID( "foo@bar" ) ) ); + list.push_back( MUCListItem( JID( "bar@foo" ) ) ); + MUCRoom::MUCAdmin ma( StoreMemberList, list ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "store role list: 'participant'"; + MUCListItemList list; + list.push_back( MUCListItem( JID( "foo@bar" ) ) ); + list.push_back( MUCListItem( JID( "bar@foo" ) ) ); + MUCRoom::MUCAdmin ma( StoreVoiceList, list ); + t = ma.tag(); + if( !t || t->xml() != "" + "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "parse member list from Tag"; + Tag q( "query" ); + q.setXmlns( XMLNS_MUC_ADMIN ); + Tag* i = new Tag( &q, "item", "jid", "foo@bar" ); + i->addAttribute( "affiliation", "member" ); + i = new Tag( &q, "item", "jid", "bar@foo" ); + i->addAttribute( "affiliation", "member" ); + MUCRoom::MUCAdmin ma( &q ); + Tag* t = ma.tag(); + if( !t || q != *t ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + name = "MUCRoom::MUCAdmin/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new MUCRoom::MUCAdmin() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_MUC_ADMIN ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const MUCRoom::MUCAdmin* se = iq.findExtension( ExtMUCAdmin ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + printf( "MUCRoom::MUCAdmin: " ); + if( !fail ) + printf( "OK\n" ); + else + fprintf( stderr, "%d test(s) failed\n", fail ); + + return fail; +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.am new file mode 100644 index 00000000..8124748e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.am @@ -0,0 +1,23 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = mucroommucowner_test + +mucroommucowner_test_SOURCES = mucroommucowner_test.cpp +mucroommucowner_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o +mucroommucowner_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.in new file mode 100644 index 00000000..d7ffe45d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/Makefile.in @@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = mucroommucowner_test$(EXEEXT) +subdir = src/tests/mucroommucowner +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_mucroommucowner_test_OBJECTS = mucroommucowner_test.$(OBJEXT) +mucroommucowner_test_OBJECTS = $(am_mucroommucowner_test_OBJECTS) +mucroommucowner_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../mucroom.o \ + ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(mucroommucowner_test_SOURCES) +DIST_SOURCES = $(mucroommucowner_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +mucroommucowner_test_SOURCES = mucroommucowner_test.cpp +mucroommucowner_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +mucroommucowner_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/mucroommucowner/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/mucroommucowner/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +mucroommucowner_test$(EXEEXT): $(mucroommucowner_test_OBJECTS) $(mucroommucowner_test_DEPENDENCIES) $(EXTRA_mucroommucowner_test_DEPENDENCIES) + @rm -f mucroommucowner_test$(EXEEXT) + $(CXXLINK) $(mucroommucowner_test_OBJECTS) $(mucroommucowner_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mucroommucowner_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/mucroommucowner_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/mucroommucowner_test.cpp new file mode 100644 index 00000000..740dce8d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucowner/mucroommucowner_test.cpp @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define MUCROOM_TEST +#include "../../mucroom.h" +#include "../../dataform.h" +#include "../../iq.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "request config form"; + MUCRoom::MUCOwner mo( MUCRoom::MUCOwner::TypeRequestConfig ); + t = mo.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "submit config form"; + MUCRoom::MUCOwner mo( MUCRoom::MUCOwner::TypeSendConfig, new DataForm( /*DataForm::*/TypeForm ) ); + t = mo.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "cancel initial room config"; + MUCRoom::MUCOwner mo( MUCRoom::MUCOwner::TypeCancelConfig ); + t = mo.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------ + { + name = "request instant room"; + MUCRoom::MUCOwner mo( MUCRoom::MUCOwner::TypeInstantRoom ); + t = mo.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------ + { + name = "destroy room"; + MUCRoom::MUCOwner mo( JID( "foo" ), "foobar", "foopwd" ); + t = mo.tag(); + if( !t || t->xml() != "" + "" + "foobar" + "foopwd" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------ + { + name = "destroy room w/o alternate venue"; + MUCRoom::MUCOwner mo; + t = mo.tag(); + if( !t || t->xml() != "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------ + { + name = "from Tag: request room config"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_MUC_OWNER ); + MUCRoom::MUCOwner mo( d ); + t = mo.tag(); + if( !t || *t != *d ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + delete d; + } + + // ------ + { + name = "from Tag: destroy room"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_MUC_OWNER ); + Tag* destroy = new Tag( d, "destroy" ); + destroy->addAttribute( "jid", "alternate" ); + new Tag( destroy, "reason", "reason" ); + new Tag( destroy, "password", "pwd" ); + MUCRoom::MUCOwner mo( d ); + t = mo.tag(); + if( !t || *t != *d ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + delete d; + } + + // ------- + name = "MUCRoom::MUCOwner/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new MUCRoom::MUCOwner() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_MUC_OWNER ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const MUCRoom::MUCOwner* se = iq.findExtension( ExtMUCOwner ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + printf( "MUCRoom::MUCOwner: " ); + if( !fail ) + printf( "OK\n" ); + else + fprintf( stderr, "%d test(s) failed\n", fail ); + + return fail; +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.am new file mode 100644 index 00000000..c9c5321e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.am @@ -0,0 +1,23 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = mucroommucuser_test + +mucroommucuser_test_SOURCES = mucroommucuser_test.cpp +mucroommucuser_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o +mucroommucuser_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.in new file mode 100644 index 00000000..668cb971 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/Makefile.in @@ -0,0 +1,545 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = mucroommucuser_test$(EXEEXT) +subdir = src/tests/mucroommucuser +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_mucroommucuser_test_OBJECTS = mucroommucuser_test.$(OBJEXT) +mucroommucuser_test_OBJECTS = $(am_mucroommucuser_test_OBJECTS) +mucroommucuser_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../mucroom.o \ + ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(mucroommucuser_test_SOURCES) +DIST_SOURCES = $(mucroommucuser_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +mucroommucuser_test_SOURCES = mucroommucuser_test.cpp +mucroommucuser_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../mucroom.o ../../delayeddelivery.o ../../mucmessagesession.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +mucroommucuser_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/mucroommucuser/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/mucroommucuser/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +mucroommucuser_test$(EXEEXT): $(mucroommucuser_test_OBJECTS) $(mucroommucuser_test_DEPENDENCIES) $(EXTRA_mucroommucuser_test_DEPENDENCIES) + @rm -f mucroommucuser_test$(EXEEXT) + $(CXXLINK) $(mucroommucuser_test_OBJECTS) $(mucroommucuser_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mucroommucuser_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/mucroommucuser_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/mucroommucuser_test.cpp new file mode 100644 index 00000000..10268def --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/mucroommucuser/mucroommucuser_test.cpp @@ -0,0 +1,278 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define MUCROOM_TEST +#include "../../mucroom.h" +#include "../../dataform.h" +#include "../../iq.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag* t = 0; + + // ------- + { + name = "presence broadcast"; + Tag* x = new Tag( "x" ); + x->setXmlns( XMLNS_MUC_USER ); + Tag* i = new Tag( x, "item" ); + i->addAttribute( "jid", "foo@bar" ); + i->addAttribute( "role", "participant" ); + i->addAttribute( "affiliation", "member" ); + MUCRoom::MUCUser mu( x ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + delete x; + } + + + // ------- + { + name = "presence broadcast incl status codes"; + Tag* x = new Tag( "x" ); + x->setXmlns( XMLNS_MUC_USER ); + Tag* i = new Tag( x, "item" ); + i->addAttribute( "jid", "foo@bar" ); + i->addAttribute( "role", "participant" ); + i->addAttribute( "affiliation", "member" ); + new Tag( i, "actor", "jid", "foojid" ); + new Tag( x, "status", "code", "100" ); + new Tag( x, "status", "code", "101" ); + new Tag( x, "status", "code", "110" ); + new Tag( x, "status", "code", "170" ); + new Tag( x, "status", "code", "201" ); + new Tag( x, "status", "code", "210" ); + new Tag( x, "status", "code", "301" ); + new Tag( x, "status", "code", "303" ); + new Tag( x, "status", "code", "307" ); + new Tag( x, "status", "code", "321" ); + new Tag( x, "status", "code", "322" ); + new Tag( x, "status", "code", "332" ); + MUCRoom::MUCUser mu( x ); + t = mu.tag(); + if( !t || *t != *x ) + { + ++fail; + fprintf( stderr, "test '%s' failed:\n%s\n%s\n", name.c_str(), x->xml().c_str(), t->xml().c_str() ); + } + delete t; + delete x; + } + + // ------- + { + name = "inviting someone"; + MUCRoom::MUCUser mu( MUCRoom::OpInviteTo, "foo@bar", "why not?", "somethread" ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "why not?" + "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "being invited"; + MUCRoom::MUCUser mu( MUCRoom::OpInviteFrom, "foo@bar", "why not?", "somethread" ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "why not?" + "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "parse invitation"; + Tag* x = new Tag( "x" ); + x->setXmlns( XMLNS_MUC_USER ); + Tag* i = new Tag( x, "invite" ); + i->addAttribute( "to", "foo@bar" ); + new Tag( i, "reason", "why not?" ); + new Tag( i, "continue", "thread", "somethread" ); + new Tag( x, "password", "foopwd" ); + MUCRoom::MUCUser mu( x ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "why not?" + "" + "" + "foopwd" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + delete x; + } + + // ------- + { + name = "decline invitation"; + MUCRoom::MUCUser mu( MUCRoom::OpDeclineTo, "bar@foo", "because." ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "because." + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "decline invitation"; + MUCRoom::MUCUser mu( MUCRoom::OpDeclineFrom, "bar@foo", "because." ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "because." + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + } + + // ------- + { + name = "parse decline"; + Tag* x = new Tag( "x" ); + x->setXmlns( XMLNS_MUC_USER ); + Tag* i = new Tag( x, "decline" ); + i->addAttribute( "from", "foo@bar" ); + new Tag( i, "reason", "because." ); + MUCRoom::MUCUser mu( x ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "because." + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + delete x; + } + + // ------- + { + // this is for parsing incoming stanzas only. + // for actively destroying a room (as the owner), see MUCOwner + name = "destroying a room"; + Tag* x = new Tag( "x" ); + x->setXmlns( XMLNS_MUC_USER ); + Tag* d = new Tag( x, "destroy" ); + d->addAttribute( "jid", "foo@bar" ); + new Tag( d, "reason", "fooreason" ); + MUCRoom::MUCUser mu( x ); + t = mu.tag(); + if( !t || t->xml() != "" + "" + "fooreason" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed:%s \n", name.c_str(), t->xml().c_str() ); + } + delete t; + delete x; + } + + // ------- + { + name = "MUCRoom::MUCUser/SEFactory test (message)"; + StanzaExtensionFactory sef; + sef.registerExtension( new MUCRoom::MUCUser() ); + Tag* f = new Tag( "message" ); + new Tag( f, "x", "xmlns", XMLNS_MUC_USER ); + Message msg( Message::Groupchat, JID(), "" ); + sef.addExtensions( msg, f ); + const MUCRoom::MUCUser* se = msg.findExtension( ExtMUCUser ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + // ------- + { + name = "MUCRoom::MUCUser/SEFactory test (presence)"; + StanzaExtensionFactory sef; + sef.registerExtension( new MUCRoom::MUCUser() ); + Tag* f = new Tag( "presence" ); + new Tag( f, "x", "xmlns", XMLNS_MUC_USER ); + Presence pres( Presence::Available, JID(), "" ); + sef.addExtensions( pres, f ); + const MUCRoom::MUCUser* se = pres.findExtension( ExtMUCUser ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + printf( "MUCRoom::MUCUser: " ); + if( !fail ) + printf( "OK\n" ); + else + fprintf( stderr, "%d test(s) failed\n", fail ); + + return fail; +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.am new file mode 100644 index 00000000..2f0f51c4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = nickname_test + +nickname_test_SOURCES = nickname_test.cpp +nickname_test_LDADD = ../../nickname.o ../../gloox.o ../../tag.o ../../util.o +nickname_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.in new file mode 100644 index 00000000..88b35a40 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nickname/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = nickname_test$(EXEEXT) +subdir = src/tests/nickname +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_nickname_test_OBJECTS = nickname_test.$(OBJEXT) +nickname_test_OBJECTS = $(am_nickname_test_OBJECTS) +nickname_test_DEPENDENCIES = ../../nickname.o ../../gloox.o \ + ../../tag.o ../../util.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(nickname_test_SOURCES) +DIST_SOURCES = $(nickname_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +nickname_test_SOURCES = nickname_test.cpp +nickname_test_LDADD = ../../nickname.o ../../gloox.o ../../tag.o ../../util.o +nickname_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/nickname/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/nickname/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +nickname_test$(EXEEXT): $(nickname_test_OBJECTS) $(nickname_test_DEPENDENCIES) $(EXTRA_nickname_test_DEPENDENCIES) + @rm -f nickname_test$(EXEEXT) + $(CXXLINK) $(nickname_test_OBJECTS) $(nickname_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nickname_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nickname/nickname_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/nickname/nickname_test.cpp new file mode 100644 index 00000000..982f5427 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nickname/nickname_test.cpp @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../nickname.h" +#include "../../tag.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + + // ------- + { + name = "empty nick"; + Nickname n( "" ); + if( !n.nick().empty() || n.tag() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "nick check"; + Nickname n( "foo" ); + Tag* t = n.tag(); + if( n.nick() != "foo" || !t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "tag check"; + Nickname n( "foo" ); + Tag* t = n.tag(); + if( t->xml() != "foo" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + + + if( fail == 0 ) + { + printf( "Nickname: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Nickname: %d test(s) failed\n", fail ); + return 1; + } + + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.am new file mode 100644 index 00000000..d4b5de66 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.am @@ -0,0 +1,14 @@ + +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = nonsaslauth_test + +nonsaslauth_test_SOURCES = nonsaslauth_test.cpp +nonsaslauth_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../sha.o +nonsaslauth_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.in new file mode 100644 index 00000000..7e2d1dd3 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = nonsaslauth_test$(EXEEXT) +subdir = src/tests/nonsaslauth +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_nonsaslauth_test_OBJECTS = nonsaslauth_test.$(OBJEXT) +nonsaslauth_test_OBJECTS = $(am_nonsaslauth_test_OBJECTS) +nonsaslauth_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../gloox.o ../../message.o ../../util.o \ + ../../error.o ../../jid.o ../../iq.o ../../base64.o \ + ../../sha.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(nonsaslauth_test_SOURCES) +DIST_SOURCES = $(nonsaslauth_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +nonsaslauth_test_SOURCES = nonsaslauth_test.cpp +nonsaslauth_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../sha.o + +nonsaslauth_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/nonsaslauth/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/nonsaslauth/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +nonsaslauth_test$(EXEEXT): $(nonsaslauth_test_OBJECTS) $(nonsaslauth_test_DEPENDENCIES) $(EXTRA_nonsaslauth_test_DEPENDENCIES) + @rm -f nonsaslauth_test$(EXEEXT) + $(CXXLINK) $(nonsaslauth_test_OBJECTS) $(nonsaslauth_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsaslauth_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/nonsaslauth_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/nonsaslauth_test.cpp new file mode 100644 index 00000000..91703599 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauth/nonsaslauth_test.cpp @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class Client + { + public: + Client() : m_jid( "foo/resource" ) {} + virtual ~Client() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + void setAuthFailure( AuthenticationError ) {} + virtual void setAuthed( bool a ) = 0; + virtual void connected() = 0; + void disconnect( ConnectionError ) {} + const std::string password() const { return "pwd"; } + const std::string username() const { return "user"; } + private: + JID m_jid; + }; + void Client::removeIqHandler( IqHandler*, int ) {} + void Client::registerIqHandler( IqHandler*, int ) {} + void Client::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void Client::removeStanzaExtension( int ) {} + const std::string Client::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENT_H__ +#define NONSASLAUTH_TEST +#include "../../nonsaslauth.h" +#include "../../nonsaslauth.cpp" + +class NonSaslAuthTest : public Client +{ + public: + NonSaslAuthTest() : m_result( 0 ) {} + virtual ~NonSaslAuthTest() {} + void setTest( int test ) { m_test = test; } + virtual void send( IQ& ); + virtual void send( const IQ&, IqHandler*, int ); + virtual void trackID( IqHandler*, const std::string&, int ) {} + int checkResult() { int t = m_result; m_result = 0; return t; } + void setAuthed( bool a ); + void connected(); + private: + int m_test; + int m_result; +}; +void NonSaslAuthTest::send( IQ& ) +{ +} +void NonSaslAuthTest::send( const IQ& iq, IqHandler* ih, int ctx ) +{ + if( m_test == 1 ) + { + const NonSaslAuth::Query* q = iq.findExtension( ExtNonSaslAuth ); + if( q ) + { + m_result++; + m_test = 2; + IQ re( IQ::Result, iq.from(), iq.id() ); + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_AUTH ); + new Tag( d, "username" ); + new Tag( d, "password" ); + new Tag( d, "resource" ); + re.addExtension( new NonSaslAuth::Query( d ) ); + ih->handleIqID( re, ctx ); + delete d; + } + } + else if( m_test == 2 ) + { + const NonSaslAuth::Query* q = iq.findExtension( ExtNonSaslAuth ); + if( q ) + { + Tag* d = q->tag(); + if( d->xml() == "" + "user" + "pwd" + "resource" + "" ) + { + m_result++; + IQ re( IQ::Result, iq.from(), iq.id() ); + ih->handleIqID( re, ctx ); + } + delete d; + } + } + else if( m_test == 3 ) + { + const NonSaslAuth::Query* q = iq.findExtension( ExtNonSaslAuth ); + if( q ) + { + m_result++; + m_test = 4; + IQ re( IQ::Result, iq.from(), iq.id() ); + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_AUTH ); + new Tag( d, "username" ); + new Tag( d, "digest" ); + new Tag( d, "password" ); + new Tag( d, "resource" ); + re.addExtension( new NonSaslAuth::Query( d ) ); + ih->handleIqID( re, ctx ); + delete d; + } + } + else if( m_test == 4 ) + { + const NonSaslAuth::Query* q = iq.findExtension( ExtNonSaslAuth ); + if( q ) + { + Tag* d = q->tag(); + SHA sha; + sha.feed( "sid2" ); + sha.feed( "pwd" ); + if( d->xml() == "" + "user" + "" + sha.hex() + "" + "resource" + "" ) + { + m_result += 2; + IQ re( IQ::Result, iq.from(), iq.id() ); + ih->handleIqID( re, ctx ); + } + delete d; + } + } +} +void NonSaslAuthTest::setAuthed( bool a ) +{ + if( a ) + m_result++; +} +void NonSaslAuthTest::connected() +{ + m_result++; +} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + NonSaslAuthTest* nsat = new NonSaslAuthTest(); + NonSaslAuth n( nsat ); + + // ------- + { + name = "do auth w/ pwd"; + nsat->setTest( 1 ); + n.doAuth( "sid" ); + if( nsat->checkResult() != 4 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "do auth w/ digest"; + nsat->setTest( 3 ); + n.doAuth( "sid2" ); + if( nsat->checkResult() != 5 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + + + delete nsat; + + + if( fail == 0 ) + { + printf( "NonSaslAuth: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "NonSaslAuth: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.am new file mode 100644 index 00000000..a6ca9773 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.am @@ -0,0 +1,14 @@ + +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = nonsaslauthquery_test + +nonsaslauthquery_test_SOURCES = nonsaslauthquery_test.cpp +nonsaslauthquery_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../sha.o ../../stanzaextensionfactory.o ../../mutex.o +nonsaslauthquery_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.in new file mode 100644 index 00000000..86421d87 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = nonsaslauthquery_test$(EXEEXT) +subdir = src/tests/nonsaslauthquery +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_nonsaslauthquery_test_OBJECTS = nonsaslauthquery_test.$(OBJEXT) +nonsaslauthquery_test_OBJECTS = $(am_nonsaslauthquery_test_OBJECTS) +nonsaslauthquery_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../gloox.o ../../message.o ../../util.o \ + ../../error.o ../../jid.o ../../iq.o ../../base64.o \ + ../../sha.o ../../stanzaextensionfactory.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(nonsaslauthquery_test_SOURCES) +DIST_SOURCES = $(nonsaslauthquery_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +nonsaslauthquery_test_SOURCES = nonsaslauthquery_test.cpp +nonsaslauthquery_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../sha.o ../../stanzaextensionfactory.o ../../mutex.o + +nonsaslauthquery_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/nonsaslauthquery/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/nonsaslauthquery/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +nonsaslauthquery_test$(EXEEXT): $(nonsaslauthquery_test_OBJECTS) $(nonsaslauthquery_test_DEPENDENCIES) $(EXTRA_nonsaslauthquery_test_DEPENDENCIES) + @rm -f nonsaslauthquery_test$(EXEEXT) + $(CXXLINK) $(nonsaslauthquery_test_OBJECTS) $(nonsaslauthquery_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nonsaslauthquery_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/nonsaslauthquery_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/nonsaslauthquery_test.cpp new file mode 100644 index 00000000..ad693aba --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/nonsaslauthquery/nonsaslauthquery_test.cpp @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class Client + { + public: + Client() {} + virtual ~Client() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + void setAuthFailure( AuthenticationError ) {} + void setAuthed( bool ) {} + void connected() {} + void disconnect( ConnectionError ) {} + const std::string password() const { return EmptyString; } + const std::string username() const { return EmptyString; } + private: + JID m_jid; + }; + void Client::removeIqHandler( IqHandler*, int ) {} + void Client::registerIqHandler( IqHandler*, int ) {} + void Client::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void Client::removeStanzaExtension( int ) {} + const std::string Client::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENT_H__ +#define NONSASLAUTH_TEST +#include "../../nonsaslauth.h" +#include "../../nonsaslauth.cpp" + + class NonSaslAuthTest : public Client +{ + public: + NonSaslAuthTest() : m_result( 0 ) {} + virtual ~NonSaslAuthTest() {} + void setTest( int test ) { m_test = test; } + virtual void send( IQ& ); + virtual void send( const IQ&, IqHandler*, int ); + virtual void trackID( IqHandler*, const std::string&, int ) {} + int checkResult() { int t = m_result; m_result = 0; return t; } + private: + int m_test; + int m_result; +}; +void NonSaslAuthTest::send( IQ& ) +{ +} +void NonSaslAuthTest::send( const IQ&, IqHandler*, int ) +{ +} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag* t = 0; + + + // ------- + { + name = "field request"; + NonSaslAuth::Query q( "user" ); + t = q.tag(); + if( !t || t->xml() != "" + "user" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "reply w/ pwd"; + Tag* q = new Tag( "query" ); + q->setXmlns( XMLNS_AUTH ); + new Tag( q, "username" ); + new Tag( q, "password" ); + new Tag( q, "resource" ); + NonSaslAuth::Query n( q ); + NonSaslAuth::Query* nq = n.newInstance( "user", "sid", "pwd", "resource" ); + t = nq->tag(); + if( !t || t->xml() != "" + "user" + "pwd" + "resource" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete nq; + delete q; + delete t; + t = 0; + } + + // ------- + { + name = "reply w/ digest"; + Tag* q = new Tag( "query" ); + q->setXmlns( XMLNS_AUTH ); + new Tag( q, "username" ); + new Tag( q, "password" ); + new Tag( q, "digest" ); + new Tag( q, "resource" ); + NonSaslAuth::Query n( q ); + NonSaslAuth::Query* nq = n.newInstance( "user", "sid", "pwd", "resource" ); + SHA sha; + sha.feed( "sid" ); + sha.feed( "pwd" ); + t = nq->tag(); + if( !t || t->xml() != "" + "user" + "" + sha.hex() + "" + "resource" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete nq; + delete q; + delete t; + t = 0; + } + + // ------- + { + StanzaExtensionFactory sef; + sef.registerExtension( new NonSaslAuth::Query() ); + name = "NonSaslAuth::Query/SEFactory test"; + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_AUTH ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const NonSaslAuth::Query* se = iq.findExtension( ExtNonSaslAuth ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + if( fail == 0 ) + { + printf( "NonSaslAuth::Query: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "NonSaslAuth::Query: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.am new file mode 100644 index 00000000..00e49385 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = oob_test + +oob_test_SOURCES = oob_test.cpp +oob_test_LDADD = ../../oob.o ../../tag.o ../../gloox.o ../../iq.o ../../stanzaextensionfactory.o \ + ../../stanza.o ../../util.o ../../jid.o ../../prep.o ../../mutex.o +oob_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.in new file mode 100644 index 00000000..bc7d570d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/oob/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = oob_test$(EXEEXT) +subdir = src/tests/oob +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_oob_test_OBJECTS = oob_test.$(OBJEXT) +oob_test_OBJECTS = $(am_oob_test_OBJECTS) +oob_test_DEPENDENCIES = ../../oob.o ../../tag.o ../../gloox.o \ + ../../iq.o ../../stanzaextensionfactory.o ../../stanza.o \ + ../../util.o ../../jid.o ../../prep.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(oob_test_SOURCES) +DIST_SOURCES = $(oob_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +oob_test_SOURCES = oob_test.cpp +oob_test_LDADD = ../../oob.o ../../tag.o ../../gloox.o ../../iq.o ../../stanzaextensionfactory.o \ + ../../stanza.o ../../util.o ../../jid.o ../../prep.o ../../mutex.o + +oob_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/oob/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/oob/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +oob_test$(EXEEXT): $(oob_test_OBJECTS) $(oob_test_DEPENDENCIES) $(EXTRA_oob_test_DEPENDENCIES) + @rm -f oob_test$(EXEEXT) + $(CXXLINK) $(oob_test_OBJECTS) $(oob_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oob_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/oob/oob_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/oob/oob_test.cpp new file mode 100644 index 00000000..b339cf52 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/oob/oob_test.cpp @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../oob.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + OOB *d; + + // ------- + name = "parsing 0 tag"; + d = new OOB( 0 ); + if( d->tag() != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------------------- + // jabber:x:oob tests + // ------------------- + Tag *x = new Tag( "x" ); + x->addAttribute( "xmlns", XMLNS_X_OOB ); + new Tag( x, "url", "invalidurl" ); + new Tag( x, "desc", "description" ); + + + // ------- + name = "filled object/getters"; + d = new OOB( "invalidurl", "description", false ); + if( d->url() != "invalidurl" || d->desc() != "description" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/tag()"; + d = new OOB( "invalidurl", "description", false ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_OOB ) + || !t->hasChild( "url" ) || t->findChild( "url" )->cdata() != "invalidurl" + || !t->hasChild( "desc" ) || t->findChild( "desc" )->cdata() != "description") + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + // ------- + name = "from Tag/getters"; + d = new OOB( x ); + if( d->url() != "invalidurl" || d->desc() != "description" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "from Tag/tag()"; + d = new OOB( x ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_X_OOB ) + || !t->hasChild( "url" ) || t->findChild( "url" )->cdata() != "invalidurl" + || !t->hasChild( "desc" ) || t->findChild( "desc" )->cdata() != "description") + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + + // ------------------- + // jabber:iq:oob tests + // ------------------- + + delete x; + x = 0; + x = new Tag( "query" ); + x->addAttribute( "xmlns", XMLNS_IQ_OOB ); + new Tag( x, "url", "invalidurl" ); + new Tag( x, "desc", "description" ); + + + // ------- + name = "filled object/getters"; + d = new OOB( "invalidurl", "description", true ); + if( d->url() != "invalidurl" || d->desc() != "description" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "filled object/tag()"; + d = new OOB( "invalidurl", "description", true ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_IQ_OOB ) + || !t->hasChild( "url" ) || t->findChild( "url" )->cdata() != "invalidurl" + || !t->hasChild( "desc" ) || t->findChild( "desc" )->cdata() != "description") + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + // ------- + name = "from Tag/getters"; + d = new OOB( x ); + if( d->url() != "invalidurl" || d->desc() != "description" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + d = 0; + + // ------- + name = "from Tag/tag()"; + d = new OOB( x ); + t = d->tag(); + if( !t || !t->hasAttribute( "xmlns", XMLNS_IQ_OOB ) + || !t->hasChild( "url" ) || t->findChild( "url" )->cdata() != "invalidurl" + || !t->hasChild( "desc" ) || t->findChild( "desc" )->cdata() != "description") + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete d; + delete t; + d = 0; + t = 0; + + + delete x; + x = 0; + + + StanzaExtensionFactory sef; + + // ------- + name = "OOB/SEFactory test"; + OOB* oob = new OOB( 0 ); // deleted by StanzaExtensionFactory sef; + sef.registerExtension( oob ); + Tag* f = new Tag( "iq" ); + Tag* b = new Tag( f, "query", "xmlns", XMLNS_IQ_OOB ); + new Tag( b, "url", "url" ); + new Tag( b, "desc", "desc" ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const OOB* se = iq.findExtension( ExtOOB ); + if( se == 0 || se->url() != "url" || se->desc() != "desc" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + if( fail == 0 ) + { + printf( "OOB: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "OOB: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.am new file mode 100644 index 00000000..69b149e8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -g3 -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = parser_test + +parser_test_SOURCES = parser_test.cpp +parser_test_LDADD = ../../parser.o ../../tag.o ../../util.o ../../gloox.o +parser_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.in new file mode 100644 index 00000000..85c06f34 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/parser/Makefile.in @@ -0,0 +1,517 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = parser_test$(EXEEXT) +subdir = src/tests/parser +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_parser_test_OBJECTS = parser_test.$(OBJEXT) +parser_test_OBJECTS = $(am_parser_test_OBJECTS) +parser_test_DEPENDENCIES = ../../parser.o ../../tag.o ../../util.o \ + ../../gloox.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(parser_test_SOURCES) +DIST_SOURCES = $(parser_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -g3 -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +parser_test_SOURCES = parser_test.cpp +parser_test_LDADD = ../../parser.o ../../tag.o ../../util.o ../../gloox.o +parser_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/parser/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/parser/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +parser_test$(EXEEXT): $(parser_test_OBJECTS) $(parser_test_DEPENDENCIES) $(EXTRA_parser_test_DEPENDENCIES) + @rm -f parser_test$(EXEEXT) + $(CXXLINK) $(parser_test_OBJECTS) $(parser_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parser_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/parser/parser_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/parser/parser_test.cpp new file mode 100644 index 00000000..28236554 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/parser/parser_test.cpp @@ -0,0 +1,1335 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../parser.h" +#include "../../taghandler.h" +#include "../../util.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +class ParserTest : private TagHandler +{ + public: + ParserTest() : m_tag( 0 ), m_multiple( false ) {} + virtual ~ParserTest() {} + + virtual void handleTag( Tag *tag ) + { + if( m_multiple ) + { + m_tags.push_back( tag->clone() ); + } + else + { + delete m_tag; + m_tag = tag->clone(); + } + } + + int run() + { + int fail = 0; + std::string name; + std::string data; + bool tfail = false; + Parser *p = new Parser( this ); + + + // ------- + name = "simple"; + data = ""; + p->feed( data ); + if( m_tag == 0 || m_tag->name() != "tag" ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "simple child"; + data = ""; + p->feed( data ); + if( m_tag == 0 || m_tag->name() != "tag1" || !m_tag->hasChild( "child" ) ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "attribute"; + data = ""; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag2" || + !m_tag->hasAttribute( "attr", "val" ) || + !m_tag->hasChild( "child" ) ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "attribute in child"; + data = ""; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag3" || + !m_tag->hasChild( "child" ) ) + { + tfail = true; + } + else + { + Tag *c = m_tag->findChild( "child" ); + if( !c->hasAttribute( "attr", "val" ) ) + { + tfail = true; + } + } + if( tfail ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + tfail = false; + } + delete m_tag; + m_tag = 0; + + // ------- + name = "cdata"; + data = "cdata"; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag4" || + m_tag->cdata() != "cdata" ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "tag w/ whitespace 1"; + data = "< tag4 />"; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag4" ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "tag w/ whitespace 2"; + data = "< tag4/ >"; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag4" ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "tag w/ whitespace 3"; + data = "< tag4 / >"; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag4" ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "simple child + white\tspace"; + data = "< / \ttag1>"; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag1" || + !m_tag->hasChild( "child" ) ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "stream start"; + data = ""; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "stream" || +// m_tag->prefix() != "stream" || // don't rely on prefix names + m_tag->xmlns() != XMLNS_STREAM || + !m_tag->hasAttribute( "version", "1.0" ) || + !m_tag->hasAttribute( "id", "abcdef" ) || + !m_tag->hasAttribute( "to", "example.org" ) || + !m_tag->hasAttribute( "xmlns", "jabber:client" ) ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + // printf( "stanza: %s\n", m_tag->xml().c_str() ); + delete m_tag; + m_tag = 0; + + + // ------- + name = "prolog"; + data = ""; + p->feed( data ); + if( ( m_tag != 0 )/* || + m_tag->name() != "xml" || + !m_tag->hasAttribute( "version", "1.0" )*/ ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + // printf( "stanza: %s\n", m_tag->xml().c_str() ); + delete m_tag; + m_tag = 0; + + // ------- + name = "deferred prolog"; + data = " "; + p->feed( data ); + if( ( m_tag != 0 )/* || + m_tag->name() != "xml" || + !m_tag->hasAttribute( "version", "1.0" )*/ ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + // printf( "stanza: %s\n", m_tag->xml().c_str() ); + delete m_tag; + m_tag = 0; + + // ------- + name = "invalid prolog"; + data = "foobar"; + if( p->feed( data ) != 0 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + // printf( "stanza: %s\n", m_tag->xml().c_str() ); + delete m_tag; + m_tag = 0; + + // ------- + name = "deeply nested"; + data = "cdata1cdata2"; + p->feed( data ); + if( m_tag == 0 || + m_tag->name() != "tag1" || + !m_tag->hasAttribute( "attr11", "val11" ) || + !m_tag->hasAttribute( "attr12", "val12" ) || + !m_tag->hasChild( "tag2" ) || + !m_tag->hasChild( "tag3" ) ) + { + printf( "fail1\n" ); + tfail = true; + } + else + { + Tag *c = m_tag->findChild( "tag2" ); + if( !c->hasAttribute( "attr21", "val21" ) || + !c->hasAttribute( "attr22", "val22" ) ) + { + printf( "fail2\n" ); + tfail = true; + } + c = m_tag->findChild( "tag3" ); + if( !c->hasAttribute( "attr31", "val31" ) || + !c->hasChild( "tag4" ) || + !c->hasChild( "tag4" ) ) + { + printf( "fail3\n" ); + tfail = true; + } + } + if( tfail ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + printf( "got: %s\n", m_tag->xml().c_str() ); + tfail = false; + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 1"; + data = "cdata1cdata2cdata3"; + p->feed( data ); + if( m_tag == 0 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 2"; + data = "cdata1cdata2cdata3"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 3"; + data = "cdata1cdata2cdata3"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 4"; + data = "foo'bar"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 5"; + data = "foo bar"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 6"; + data = "foosomethingbar"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 7"; + data = "foosomethingbarsomethingelsebar"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 8"; + data = "foosome'thingbarsomething&elsebar"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "mixed content 9"; + data = "foo'thingbarsomething&elsebar"bar"; + p->feed( data ); + if( m_tag == 0 || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "apos inside quotes in attrib value"; + data = "cdata3"; + p->feed( data ); + if( m_tag == 0 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "apos inside apos in attrib value"; + data = "cdata3"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + + // ------- + name = "quote inside apos in attrib value"; + data = "cdata3"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + + // ------- + name = "quote inside quotes in attrib value"; + data = "cdata3"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + + // ------- + name = "lt inside attrib value"; + data = "cdata3"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + + // ------- + name = "gt inside attrib value"; + data = "cdata3"; + p->feed( data ); + if( !m_tag ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "> inside cdata"; + data = "cda>ta3"; + p->feed( data ); + if( !m_tag ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "< inside cdata"; + data = "cda"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + + // ------- + name = "quote inside cdata"; + data = "cda\"ta3"; + p->feed( data ); + if( !m_tag ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + // ------- + name = "apos inside cdata"; + data = "cda'ta3"; + p->feed( data ); + if( !m_tag ) + { + ++fail; + fprintf( stderr, "test '%s: %s' failed\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "more than one tag at a time"; + m_multiple = true; + data = ""; + int i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tags.size() != 3 ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + m_multiple = false; +// util::clearList( m_tags ); + // FIXME + { + TagList::iterator it = m_tags.begin(); + TagList::iterator it2; + while( it != m_tags.end() ) + { + it2 = it++; + delete (*it2); + m_tags.erase( it2 ); + } + } + // ~ + + //------- + name = ""; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "abcdefg" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + + //------- + name = "123456"; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "123abcdefg456" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = ""; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "abc&&<]]defg" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "split feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "TA[abc&&<]]defg]]>"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "abc&&<]]defg" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "split feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "DA"; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "TA[abc&&<]]defg]]>"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "abc&&<]]defg" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "split feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "TA[abc&&<]]defg]"; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "]>"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "abc&&<]]defg" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "split escaping 1"; + data = "&am"; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "p;"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "&" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "split escaping 2"; + data = "&a"; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "m"; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "p;"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "&" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "split escaping 3"; + data = ""; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = "5"; + i = -1; + if( ( i = p->feed( data ) ) >= 0 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + data = ";"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "A" ) + { + ++fail; + fprintf( stderr, "test '%s' failed at pos %d: %s\n", name.c_str(), i, data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid name 1"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid name 2"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), data.c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid name 3"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid name 4"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid name 5"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid tag 6"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid tag 7"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid tag 8"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid tag 9"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid tag 10"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid tag 11"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid tag 12"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 1"; + data = "&ggggggt;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 2"; + data = "&t;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 3"; + data = "&tt;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 4"; + data = "&lf;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 5"; + data = "&gf;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 6"; + data = "&add;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 7"; + data = "&qitt;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 8"; + data = "&apit;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 9"; + data = "&#ABCD;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 10"; + data = "&#xX123;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 11"; + data = "ģX;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 12"; + data = "ABCD;"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 13"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 14"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 15"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 16"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 17"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 18"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 19"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 20"; + data = "￿"; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 21"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "invalid escaping 22"; + data = ""; + if( p->feed( data ) == -1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 1"; + data = "<"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "<" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 2"; + data = ">"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != ">" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 3"; + data = "'"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "'" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 4"; + data = "&"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "&" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 5"; + data = """; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "\"" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 6"; + data = "ሴ><'&""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "ሴ><'&\"" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 7"; + data = "ሴC"+"; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "ሴC\"+" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s -- %s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "escaping 8"; + data = "&<>'" <>'" <><>'" " + " <><>'""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->cdata() != "&<>'\" <>'\" <><>'\" <><>'\"" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: \n%s\n%s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "simple attribute prefix"; + data = ""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->attributes().size() != 2 + || m_tag->attributes().front()->xmlns() != "foobar" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: \n%s\n%s\n%s\n", name.c_str(), data.c_str(), m_tag->xml().c_str(), + m_tag->attributes().front()->xmlns().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "broken attribute prefix"; + data = ""; + if( ( i = p->feed( data ) ) == -1 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed: \n%s\n%s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "simple element prefix"; + data = ""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->attributes().size() != 2 + || m_tag->xmlns() != "foobar" ) + { + ++fail; + fprintf( stderr, "test '%s' failed (%d): \n%s\n", name.c_str(), i, data.c_str()/*, m_tag->xml().c_str()*/ ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "broken element prefix"; + data = ""; + if( ( i = p->feed( data ) ) == -1 || m_tag ) + { + ++fail; + fprintf( stderr, "test '%s' failed: \n%s\n%s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "default namespace"; + data = ""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->xmlns() != "foobar" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: \n%s\n%s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "one additional namespace"; + data = ""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->xmlns( "foo" ) != "bar" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: \n%s\n%s\n", name.c_str(), data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + //------- + name = "many additional namespaces"; + data = "" + "" + ""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->xmlns() != "def" + || m_tag->xmlns( "xx" ) != "xyz" || m_tag->xmlns( "foo" ) != "ggg" + || m_tag->attributes().size() != 4 + || m_tag->attributes().front()->xmlns() != "def" + || m_tag->xml() != data ) + { + ++fail; + fprintf( stderr, "test '%s' failed (%d): \n%s\n%s\n", name.c_str(), i, data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + + //------- + name = "nested namespaces"; + data = "" + "" + ""; + if( ( i = p->feed( data ) ) >= 0 || !m_tag || m_tag->xmlns() != "ggg" + || m_tag->xmlns( "xx" ) != "xyz" || m_tag->xmlns( "foo" ) != "ggg" + || m_tag->attributes().size() != 4 + || m_tag->attributes().front()->xmlns() != "def" + || m_tag->xml() != data + || m_tag->children().front()->xmlns() != "xyz" + || m_tag->children().front()->children().front()->xmlns() != "ggg" ) + { + ++fail; + fprintf( stderr, "test '%s' failed (%d): \n%s\n%s\n", name.c_str(), i, data.c_str(), m_tag->xml().c_str() ); + } + delete m_tag; + m_tag = 0; + + +// + + + + //------- + name = "invalid toplevel elements"; + data = ""; + if( ( i = p->feed( data ) ) < 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed (%d)", name.c_str(), i ); + } + delete m_tag; + m_tag = 0; + + + + + + + + + + + + + + + + + + + + + + + + delete p; + p = 0; + + if( fail == 0 ) + { + printf( "Parser: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Parser: %d test(s) failed\n", fail ); + return 1; + } + + } + + private: + Tag *m_tag; + TagList m_tags; + bool m_multiple; + +}; + +int main( int /*argc*/, char** /*argv*/ ) +{ + ParserTest p; + return p.run(); +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.am new file mode 100644 index 00000000..fd83e41f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = prep_test + +prep_test_SOURCES = prep_test.cpp +prep_test_LDADD = ../../prep.o +prep_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.in new file mode 100644 index 00000000..0243f04b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/prep/Makefile.in @@ -0,0 +1,516 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = prep_test$(EXEEXT) +subdir = src/tests/prep +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_prep_test_OBJECTS = prep_test.$(OBJEXT) +prep_test_OBJECTS = $(am_prep_test_OBJECTS) +prep_test_DEPENDENCIES = ../../prep.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(prep_test_SOURCES) +DIST_SOURCES = $(prep_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +prep_test_SOURCES = prep_test.cpp +prep_test_LDADD = ../../prep.o +prep_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/prep/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/prep/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +prep_test$(EXEEXT): $(prep_test_OBJECTS) $(prep_test_DEPENDENCIES) $(EXTRA_prep_test_DEPENDENCIES) + @rm -f prep_test$(EXEEXT) + $(CXXLINK) $(prep_test_OBJECTS) $(prep_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prep_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/prep/prep_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/prep/prep_test.cpp new file mode 100644 index 00000000..990dfe4f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/prep/prep_test.cpp @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../prep.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + std::string result; + + // ------- + name = "nodeprep oversized"; + const std::string t( 1200, 'x' ); + if( prep::nodeprep( t, result ) || !result.empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "resourceprep oversized"; + if( prep::resourceprep( t, result ) || !result.empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "nameprep oversized"; + if( prep::nameprep( t, result ) || !result.empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "idna oversized"; + if( prep::idna( t, result ) || !result.empty() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "nodeprep unchanged"; + const std::string t1( 10, 'x' ); + if( !( prep::nodeprep( t1, result ) && result == t1 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "resourceprep unchanged"; + if( !( prep::resourceprep( t1, result ) && result == t1 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "nameprep unchanged"; + if( !( prep::nameprep( t1, result ) && result == t1 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "idna unchanged"; + if( !( prep::idna( t1, result ) && result == t1 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "nodeprep simple casefolding"; + const std::string t2( "aBcDeFgH" ); + const std::string t3( "abcdefgh" ); + if( !( prep::nodeprep( t2, result ) && result == t3 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "resourceprep simple casefolding (none)"; + if( !( prep::resourceprep( t2, result ) && result == t2 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "nameprep simple casefolding"; + if( !( prep::nameprep( t2, result ) && result == t3 ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + // ------- + name = "idna example"; + if( !( prep::idna( "www.dömäin.de", result ) && result == "www.xn--dmin-moa0i.de" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + result = ""; + + + + + + + + + + + + + if( fail == 0 ) + { + printf( "Prep: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Prep: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.am new file mode 100644 index 00000000..e966ce8b --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.am @@ -0,0 +1,12 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = presence_test + +presence_test_SOURCES = presence_test.cpp +presence_test_LDADD = ../../tag.o ../../presence.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o +presence_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.in new file mode 100644 index 00000000..70ed9c15 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/presence/Makefile.in @@ -0,0 +1,520 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = presence_test$(EXEEXT) +subdir = src/tests/presence +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_presence_test_OBJECTS = presence_test.$(OBJEXT) +presence_test_OBJECTS = $(am_presence_test_OBJECTS) +presence_test_DEPENDENCIES = ../../tag.o ../../presence.o \ + ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(presence_test_SOURCES) +DIST_SOURCES = $(presence_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +presence_test_SOURCES = presence_test.cpp +presence_test_LDADD = ../../tag.o ../../presence.o ../../stanza.o ../../jid.o ../../prep.o ../../gloox.o \ + ../../util.o ../../sha.o ../../base64.o + +presence_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/presence/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/presence/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +presence_test$(EXEEXT): $(presence_test_OBJECTS) $(presence_test_DEPENDENCIES) $(EXTRA_presence_test_DEPENDENCIES) + @rm -f presence_test$(EXEEXT) + $(CXXLINK) $(presence_test_OBJECTS) $(presence_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/presence_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/presence/presence_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/presence/presence_test.cpp new file mode 100644 index 00000000..7442c150 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/presence/presence_test.cpp @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define GLOOX_TESTS +#define PRESENCE_TEST +#include "../../tag.h" +#include "../../presence.h" +#include "../../stanza.h" +#include "../../jid.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *pres = new Tag( "presence" ); + pres->addAttribute( "from", "me@example.net/gloox" ); + pres->addAttribute( "to", "you@example.net/gloox" ); + new Tag( pres, "status", "the status" ); + new Tag( pres, "priority", "10" ); + Tag* s = new Tag( "show" ); + Presence* i = 0; + + // ------- + name = "parse Presence implicit available"; + i = new Presence( pres ); + if( i->subtype() != Presence::Available + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence available"; + pres->addAttribute( "type", "available" ); + i = new Presence( pres ); + if( i->subtype() != Presence::Available + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence unavailable"; + pres->addAttribute( "type", "unavailable" ); + i = new Presence( pres ); + if( i->subtype() != Presence::Unavailable + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence error"; + pres->addAttribute( "type", "error" ); + i = new Presence( pres ); + if( i->subtype() != Presence::Error + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence probe"; + pres->addAttribute( "type", "probe" ); + i = new Presence( pres ); + if( i->subtype() != Presence::Probe + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence available"; + pres->addAttribute( "type", "available" ); + pres->addChild( s ); + s->setCData( "chat" ); + i = new Presence( pres ); + if( i->subtype() != Presence::Chat + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence away"; + pres->addAttribute( "type", "available" ); + s->setCData( "away" ); + i = new Presence( pres ); + if( i->subtype() != Presence::Away + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence dnd"; + pres->addAttribute( "type", "available" ); + s->setCData( "dnd" ); + i = new Presence( pres ); + if( i->subtype() != Presence::DND + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + name = "parse Presence xa"; + pres->addAttribute( "type", "available" ); + s->setCData( "xa" ); + i = new Presence( pres ); + if( i->subtype() != Presence::XA + || i->from().full() != "me@example.net/gloox" || i->to().full() != "you@example.net/gloox" + || i->status() != "the status" || i->priority() != 10 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete i; + i = 0; + + // ------- + { + name = "new simple Presence available"; + Presence p( Presence::Available, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) + || !i->hasChildWithCData( "priority", "10" ) + || i->hasAttribute( "type" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Presence unavailable"; + Presence p( Presence::Unavailable, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "type", "unavailable" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Presence chat"; + Presence p( Presence::Chat, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) + || !i->hasChildWithCData( "priority", "10" ) + || !i->hasChildWithCData( "show", "chat" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Presence away"; + Presence p( Presence::Away, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) + || !i->hasChildWithCData( "priority", "10" ) + || !i->hasChildWithCData( "show", "away" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Presence dnd"; + Presence p( Presence::DND, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) + || !i->hasChildWithCData( "priority", "10" ) + || !i->hasChildWithCData( "show", "dnd" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Presence xa"; + Presence p( Presence::XA, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) + || !i->hasChildWithCData( "priority", "10" ) + || !i->hasChildWithCData( "show", "xa" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Presence probe"; + Presence p( Presence::Probe, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "type", "probe" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) + || !i->hasChildWithCData( "priority", "10" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + // ------- + { + name = "new simple Presence error"; + Presence p( Presence::Error, JID( "xyz@example.org/blah" ), "the status", + 10, "the xmllang" ); + p.setFrom( JID( "foo@bar.com" ) ); + Tag* i = p.tag(); + if( !i->hasAttribute( "type", "error" ) + || !i->hasAttribute( "to", "xyz@example.org/blah" ) || !i->hasAttribute( "from", "foo@bar.com" ) + || !i->hasChildWithCData( "status", "the status" ) + || !i->hasChild( "status", "xml:lang", "the xmllang" ) + || !i->hasChildWithCData( "priority", "10" ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), i->xml().c_str() ); + } + delete i; + } + + + + delete pres; + pres = 0; + + if( fail == 0 ) + { + printf( "Presence: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Presence: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.am new file mode 100644 index 00000000..f22ea286 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.am @@ -0,0 +1,14 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = privacymanager_test + +privacymanager_test_SOURCES = privacymanager_test.cpp +privacymanager_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../privacyitem.o +privacymanager_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.in new file mode 100644 index 00000000..6955b5af --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = privacymanager_test$(EXEEXT) +subdir = src/tests/privacymanager +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_privacymanager_test_OBJECTS = privacymanager_test.$(OBJEXT) +privacymanager_test_OBJECTS = $(am_privacymanager_test_OBJECTS) +privacymanager_test_DEPENDENCIES = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o ../../gloox.o \ + ../../iq.o ../../stanza.o ../../error.o ../../privacyitem.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(privacymanager_test_SOURCES) +DIST_SOURCES = $(privacymanager_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +privacymanager_test_SOURCES = privacymanager_test.cpp +privacymanager_test_LDADD = ../../jid.o ../../tag.o \ + ../../logsink.o ../../prep.o ../../util.o \ + ../../gloox.o ../../iq.o ../../stanza.o \ + ../../error.o ../../privacyitem.o + +privacymanager_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/privacymanager/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/privacymanager/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +privacymanager_test$(EXEEXT): $(privacymanager_test_OBJECTS) $(privacymanager_test_DEPENDENCIES) $(EXTRA_privacymanager_test_DEPENDENCIES) + @rm -f privacymanager_test$(EXEEXT) + $(CXXLINK) $(privacymanager_test_OBJECTS) $(privacymanager_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privacymanager_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/privacymanager_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/privacymanager_test.cpp new file mode 100644 index 00000000..da00c9c4 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privacymanager/privacymanager_test.cpp @@ -0,0 +1,145 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../gloox.h" +#include "../../jid.h" +#include "../../tag.h" +#include "../../iqhandler.h" +#include "../../privacylisthandler.h" + +#include +#include +#include +#include // [s]print[f] + +const std::string& g_dir = "test.dir"; +const std::string& g_inst = "the instructions"; +const std::string& g_profile = "test-prof"; + +gloox::Tag* t1 = 0; +gloox::Tag* t2 = 0; +const gloox::JID to( "abc@def.gh/ijk" ); + +namespace gloox +{ + + class Disco + { + public: + Disco(); + ~Disco(); + void addFeature( const std::string& feature ); + void removeFeature( const std::string& feature ); + }; + Disco::Disco() {} + Disco::~Disco() {} + void Disco::addFeature( const std::string& /*feature*/ ) {} + void Disco::removeFeature( const std::string& /*feature*/ ) {} + + class ClientBase : public PrivacyListHandler + { + public: + ClientBase(); + ~ClientBase(); + const std::string getID(); + Disco* disco(); + void send( IQ& iq, IqHandler* = 0 , int = 0 ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void trackID( IqHandler *ih, const std::string& id, int context ); + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ) {} + void setTest( int test ); + bool ok(); + + virtual void handlePrivacyListNames( const std::string& /*active*/, const std::string& /*def*/, + const StringList& /*lists*/ ) {} + virtual void handlePrivacyList( const std::string& /*name*/, const PrivacyList& /*items*/ ) {} + virtual void handlePrivacyListChanged( const std::string& /*name*/ ) {} + virtual void handlePrivacyListResult( const std::string& /*id*/, PrivacyListResult /*plResult*/ ) {} + + private: + Disco* m_disco; + int m_test; + bool m_ok; + }; + ClientBase::ClientBase() : m_disco( new Disco() ), m_test( 0 ), m_ok( false ) {} + ClientBase::~ClientBase() { delete m_disco; } + const std::string ClientBase::getID() { return "id"; } + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::send( IQ& iq, IqHandler*, int ) + { + Tag* tag = iq.tag(); + switch( m_test ) + { + case 1: + { + Tag* si = tag->findChild( "si", "xmlns", XMLNS_SI ); + if( tag->findAttribute( "to" ) == to.full() && si && *(si->findChild( "file" )) == *t1 + && *(si->findChild( "feature" )) == *t2 && si->findAttribute( "mime-type" ) == "binary/octet-stream" + && si->findAttribute( "profile" ) == g_profile ) + m_ok = true; + break; + } + } + delete tag; + } + void ClientBase::trackID( IqHandler* /*ih*/, const std::string& /*id*/, int /*context*/ ) {} + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + void ClientBase::setTest( int test ) { m_test = test; } + bool ClientBase::ok() { bool t = m_ok; m_ok = false; return t; } +} + +#define CLIENTBASE_H__ +#define DISCO_H__ +#include "../../privacymanager.h" +#include "../../privacymanager.cpp" +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + gloox::ClientBase* cb = new gloox::ClientBase(); + + + // ------- + name = "dummy test"; + if( 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + + + + + + delete cb; + + if( fail == 0 ) + { + printf( "PrivacyManager: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "PrivacyManager: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.am new file mode 100644 index 00000000..02bc00ad --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.am @@ -0,0 +1,13 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = privacymanagerquery_test + +privacymanagerquery_test_SOURCES = privacymanagerquery_test.cpp +privacymanagerquery_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../mutex.o +privacymanagerquery_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.in new file mode 100644 index 00000000..6ba531cb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/Makefile.in @@ -0,0 +1,524 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = privacymanagerquery_test$(EXEEXT) +subdir = src/tests/privacymanagerquery +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_privacymanagerquery_test_OBJECTS = \ + privacymanagerquery_test.$(OBJEXT) +privacymanagerquery_test_OBJECTS = \ + $(am_privacymanagerquery_test_OBJECTS) +privacymanagerquery_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(privacymanagerquery_test_SOURCES) +DIST_SOURCES = $(privacymanagerquery_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +privacymanagerquery_test_SOURCES = privacymanagerquery_test.cpp +privacymanagerquery_test_LDADD = ../../tag.o ../../stanza.o ../../prep.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../message.o ../../util.o ../../error.o ../../jid.o \ + ../../iq.o ../../base64.o ../../mutex.o + +privacymanagerquery_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/privacymanagerquery/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/privacymanagerquery/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +privacymanagerquery_test$(EXEEXT): $(privacymanagerquery_test_OBJECTS) $(privacymanagerquery_test_DEPENDENCIES) $(EXTRA_privacymanagerquery_test_DEPENDENCIES) + @rm -f privacymanagerquery_test$(EXEEXT) + $(CXXLINK) $(privacymanagerquery_test_OBJECTS) $(privacymanagerquery_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privacymanagerquery_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/privacymanagerquery_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/privacymanagerquery_test.cpp new file mode 100644 index 00000000..43d8b362 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privacymanagerquery/privacymanagerquery_test.cpp @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../messagehandler.h" +#include "../../base64.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void send( const IQ&, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerMessageHandler( MessageHandler* ) {} + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void removeIDHandler( IqHandler* ) {} + void removeMessageHandler( MessageHandler* ) {} + private: + JID m_jid; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define INBANDBYTESTREAM_TEST +#include "../../inbandbytestream.h" +#include "../../inbandbytestream.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty tag() test"; + InBandBytestream::IBB ibb; + t = ibb.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "open ibb"; + InBandBytestream::IBB ibb( "sid", 4096 ); + t = ibb.tag(); + if( !t || t->xml() != "" + || ibb.sid() != "sid" || ibb.blocksize() != 4096 || ibb.seq() != 0 || !ibb.data().empty() + || ibb.type() != InBandBytestream::IBBOpen) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "data ibb"; + InBandBytestream::IBB ibb( "sid", 4, "data" ); + t = ibb.tag(); + if( !t || t->xml() != "" + + Base64::encode64( "data" ) + + "" + || ibb.sid() != "sid" || ibb.seq() != 4 || ibb.data() != "data" || ibb.blocksize() != 0 + || ibb.type() != InBandBytestream::IBBData ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "close ibb"; + InBandBytestream::IBB ibb( "sid" ); + t = ibb.tag(); + if( !t || t->xml() != "" + || ibb.sid() != "sid" || ibb.seq() != 0 || !ibb.data().empty() || ibb.blocksize() != 0 + || ibb.type() != InBandBytestream::IBBClose ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "open ibb from tag"; + Tag* d = new Tag( "open" ); + d->setXmlns( XMLNS_IBB ); + d->addAttribute( "sid", "sid" ); + d->addAttribute( "block-size", 4096 ); + InBandBytestream::IBB ibb( d ); + t = ibb.tag(); + if( !t || *t != *d || ibb.sid() != "sid" || ibb.blocksize() != 4096 || ibb.seq() != 0 + || !ibb.data().empty() || ibb.type() != InBandBytestream::IBBOpen ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete d; + } + + // ------- + { + name = "data ibb from tag"; + Tag* d = new Tag( "data" ); + d->setXmlns( XMLNS_IBB ); + d->addAttribute( "sid", "sid" ); + d->addAttribute( "seq", 4 ); + d->setCData( Base64::encode64( "data" ) ); + InBandBytestream::IBB ibb( d ); + t = ibb.tag(); + if( !t || *t != *d || ibb.sid() != "sid" || ibb.seq() != 4 || ibb.data() != "data" + || ibb.blocksize() != 0 || ibb.type() != InBandBytestream::IBBData ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete d; + } + + // ------- + { + name = "close ibb from tag"; + Tag* d = new Tag( "close" ); + d->setXmlns( XMLNS_IBB ); + d->addAttribute( "sid", "sid" ); + InBandBytestream::IBB ibb( d ); + t = ibb.tag(); + if( !t || t->xml() != "" + || ibb.sid() != "sid" || ibb.seq() != 0 || !ibb.data().empty() || ibb.blocksize() != 0 + || ibb.type() != InBandBytestream::IBBClose ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete d; + } + + StanzaExtensionFactory sef; + sef.registerExtension( new InBandBytestream::IBB() ); + // ------- + { + name = "InBandBytestream::IBB/SEFactory test (open)"; + Tag* f = new Tag( "iq" ); + new Tag( f, "open", "xmlns", XMLNS_IBB ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const InBandBytestream::IBB* se = iq.findExtension( ExtIBB ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + // ------- + { + name = "InBandBytestream::IBB/SEFactory test (data)"; + Tag* f = new Tag( "iq" ); + new Tag( f, "data", "xmlns", XMLNS_IBB ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const InBandBytestream::IBB* se = iq.findExtension( ExtIBB ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + // ------- + { + name = "InBandBytestream::IBB/SEFactory test (close)"; + Tag* f = new Tag( "iq" ); + new Tag( f, "close", "xmlns", XMLNS_IBB ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const InBandBytestream::IBB* se = iq.findExtension( ExtIBB ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + if( fail == 0 ) + { + printf( "InBandBytestream::IBB: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "InBandBytestream::IBB: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.am new file mode 100644 index 00000000..3c1cec50 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = privatexml_test + +privatexml_test_SOURCES = privatexml_test.cpp +privatexml_test_LDADD = ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o \ + ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../iq.o ../../mutex.o + +privatexml_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.in new file mode 100644 index 00000000..0b45f198 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privatexml/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = privatexml_test$(EXEEXT) +subdir = src/tests/privatexml +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_privatexml_test_OBJECTS = privatexml_test.$(OBJEXT) +privatexml_test_OBJECTS = $(am_privatexml_test_OBJECTS) +privatexml_test_DEPENDENCIES = ../../gloox.o ../../tag.o ../../util.o \ + ../../stanza.o ../../message.o ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../iq.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(privatexml_test_SOURCES) +DIST_SOURCES = $(privatexml_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +privatexml_test_SOURCES = privatexml_test.cpp +privatexml_test_LDADD = ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o \ + ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../iq.o ../../mutex.o + +privatexml_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/privatexml/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/privatexml/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +privatexml_test$(EXEEXT): $(privatexml_test_OBJECTS) $(privatexml_test_DEPENDENCIES) $(EXTRA_privatexml_test_DEPENDENCIES) + @rm -f privatexml_test$(EXEEXT) + $(CXXLINK) $(privatexml_test_OBJECTS) $(privatexml_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/privatexml_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/privatexml/privatexml_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/privatexml/privatexml_test.cpp new file mode 100644 index 00000000..e5b922cc --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/privatexml/privatexml_test.cpp @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#include "../../gloox.h" +#include "../../jid.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../privatexmlhandler.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +Tag* t1 = 0; +Tag* t2 = 0; +const JID to( "abc@def.gh/ijk" ); + +namespace gloox +{ + + class Disco + { + public: + Disco(); + ~Disco(); + void addFeature( const std::string& feature ); + void removeFeature( const std::string& feature ); + }; + Disco::Disco() {} + Disco::~Disco() {} + void Disco::addFeature( const std::string& /*feature*/ ) {} + void Disco::removeFeature( const std::string& /*feature*/ ) {} + + class ClientBase : public PrivateXMLHandler + { + public: + ClientBase(); + ~ClientBase(); + const std::string getID(); + Disco* disco(); + void send( IQ& iq, IqHandler* = 0 , int = 0 ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + void trackID( IqHandler *ih, const std::string& id, int context ); + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ) {} + void setTest( int test ); + bool ok(); + + virtual void handlePrivateXML( const Tag* xml ); + virtual void handlePrivateXMLResult( const std::string& uid, PrivateXMLResult pxResult ); + + private: + Disco* m_disco; + int m_test; + bool m_ok; + }; + +} + +#define CLIENTBASE_H__ +#define DISCO_H__ +#define PRIVATEXML_TEST +#include "../../privatexml.h" +#include "../../privatexml.cpp" + +namespace gloox +{ + ClientBase::ClientBase() : m_disco( new Disco() ), m_test( 0 ), m_ok( false ) {} + ClientBase::~ClientBase() { delete m_disco; } + const std::string ClientBase::getID() { return "id"; } + Disco* ClientBase::disco() { return m_disco; } + void ClientBase::send( IQ& iq, IqHandler* ih, int ctx ) + { + const PrivateXML::Query* q = iq.findExtension( ExtPrivateXML ); + if( !q ) + return; + + Tag* tag = q->tag(); + switch( m_test ) + { + case 1: + { + if( iq.subtype() == IQ::Set + && tag && *(tag->findChild( "foo", "xmlns", "test" )) == *t1 ) + { + IQ re( IQ::Result, iq.from(), iq.id() ); + re.addExtension( new PrivateXML::Query() ); + ih->handleIqID( re, ctx ); + } + break; + } + case 2: + { + if( iq.subtype() == IQ::Get + && tag && tag->hasChild( "foo", "xmlns", "test" ) ) + { + IQ re( IQ::Result, iq.from(), iq.id() ); + re.addExtension( new PrivateXML::Query( t1->clone() ) ); + ih->handleIqID( re, ctx ); + } + break; + } + } + delete tag; + } + void ClientBase::trackID( IqHandler* /*ih*/, const std::string& /*id*/, int /*context*/ ) {} + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + void ClientBase::setTest( int test ) { m_test = test; } + bool ClientBase::ok() { bool t = m_ok; m_ok = false; return t; } + void ClientBase::handlePrivateXML( const Tag* xml ) + { + switch( m_test ) + { + case 1: + m_ok = false; + break; + case 2: + if( *xml == *t1 ) + m_ok = true; + break; + } + } + void ClientBase::handlePrivateXMLResult( const std::string& /*uid*/, PrivateXMLResult pxResult ) + { + switch( m_test ) + { + case 1: + if( pxResult == PrivateXMLHandler::PxmlStoreOk ) + m_ok = true; + break; + case 2: + m_ok = false; + break; + } + } + +} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + t1 = new Tag( "foo" ); + t1->setXmlns( "test" ); + new Tag( t1, "foobar" ); + ClientBase* cb = new ClientBase(); + PrivateXML px( cb ); + + // ------- + { + name = "store xml"; + cb->setTest( 1 ); + px.storeXML( t1->clone(), cb ); + if( !cb->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "request xml"; + cb->setTest( 2 ); + px.requestXML( "foo", "test", cb ); + if( !cb->ok() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + StanzaExtensionFactory sef; + sef.registerExtension( new PrivateXML::Query() ); + // ------- + { + name = "Query/SEFactory test"; + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_PRIVATE_XML ); + IQ iq( IQ::Get, JID(), "" ); + sef.addExtensions( iq, f ); + const PrivateXML::Query* se = iq.findExtension( ExtPrivateXML ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + delete t1; + delete cb; + + printf( "PrivateXML: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.am new file mode 100644 index 00000000..1464dcb1 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.am @@ -0,0 +1,16 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = pubsubevent_test + +pubsubevent_test_SOURCES = pubsubevent_test.cpp +pubsubevent_test_LDADD = ../../gloox.o ../../tag.o ../../jid.o ../../prep.o \ + ../../util.o ../../error.o ../../pubsubevent.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformfieldcontainer.o ../../dataformitem.o \ + ../../dataformreported.o + +pubsubevent_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.in new file mode 100644 index 00000000..6b8d1bf5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/Makefile.in @@ -0,0 +1,525 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = pubsubevent_test$(EXEEXT) +subdir = src/tests/pubsubevent +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_pubsubevent_test_OBJECTS = pubsubevent_test.$(OBJEXT) +pubsubevent_test_OBJECTS = $(am_pubsubevent_test_OBJECTS) +pubsubevent_test_DEPENDENCIES = ../../gloox.o ../../tag.o ../../jid.o \ + ../../prep.o ../../util.o ../../error.o ../../pubsubevent.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformfieldcontainer.o ../../dataformitem.o \ + ../../dataformreported.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(pubsubevent_test_SOURCES) +DIST_SOURCES = $(pubsubevent_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +pubsubevent_test_SOURCES = pubsubevent_test.cpp +pubsubevent_test_LDADD = ../../gloox.o ../../tag.o ../../jid.o ../../prep.o \ + ../../util.o ../../error.o ../../pubsubevent.o \ + ../../dataform.o ../../dataformfield.o \ + ../../dataformfieldcontainer.o ../../dataformitem.o \ + ../../dataformreported.o + +pubsubevent_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/pubsubevent/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/pubsubevent/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +pubsubevent_test$(EXEEXT): $(pubsubevent_test_OBJECTS) $(pubsubevent_test_DEPENDENCIES) $(EXTRA_pubsubevent_test_DEPENDENCIES) + @rm -f pubsubevent_test$(EXEEXT) + $(CXXLINK) $(pubsubevent_test_OBJECTS) $(pubsubevent_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubsubevent_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/pubsubevent_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/pubsubevent_test.cpp new file mode 100644 index 00000000..505ff7d0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubevent/pubsubevent_test.cpp @@ -0,0 +1,329 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../pubsubevent.h" +#include "../../tag.h" + +#include // [s]print[f] + +static int failed = 0; + +using namespace gloox; + +int main() +{ + Tag* tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + Tag* t = new Tag( tag, "items", "node", "princely_musings" ); + new Tag( t, "item", "id", "id" ); + + PubSub::Event* pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "items test failed\n" ); + } + delete tag; + delete t; + delete pse; + pse = 0; + t = 0; + tag = 0; + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "items", "node", "princely_musings" ); + new Tag( t, "item", "id", "id" ); + t = new Tag( tag, "headers", XMLNS, "http://jabber.org/protocol/shim" ); + Tag* t3 = new Tag( t, "header", "name", "pubsub#collection" ); + t3->setCData( "collection" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + if( t ) + printf ( "%s\n", t->xml().c_str() ); + printf ( "%s\n", tag->xml().c_str() ); + fprintf( stderr, "items from collection test failed\n" ); + } + delete tag; + delete t; + delete pse; + pse = 0; + t = 0; + tag = 0; + + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "items", "node", "princely_musings" ); + t = new Tag( t, "item", "id", "id" ); + t = new Tag( t, "entry", XMLNS, "http://www.w3.org" ); + new Tag( t, "title", "Soliloquy" ); + new Tag( t, "summary", "To be or not to be " ); + t3 = new Tag( t, "link", "rel", "alternate" ); + t3->addAttribute( "type", "text/html" ); + t3->addAttribute( "href", "http://denmark.lit/2003/12/13/atom03" ); + new Tag( t, "id", "tag:denmark.lit,2003:entry-32397" ); + new Tag( t, "published", "2003-12-13T18:30:02Z" ); + new Tag( t, "updated", "2003-12-13T18:30:02Z" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "items w/ payload test failed\n" ); + } + delete tag; + delete t; + delete pse; + pse = 0; + t = 0; + tag = 0; + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "items", "node", "princely_musings" ); + new Tag( t, "item", "id", "id" ); + t = new Tag( tag, "headers", XMLNS, "http://jabber.org/protocol/shim" ); + t3 = new Tag( t, "header", "name", "pubsub#subid" ); + t3->setCData( "123-abc" ); + t3 = new Tag( t, "header", "name", "pubsub#subid" ); + t3->setCData( "004-yyy" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "items w/ subscription id test failed\n" ); + } + delete tag; + delete t; + delete pse; + pse = 0; + t = 0; + tag = 0; + + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "items", "node", "princely_musings" ); + new Tag( t, "retract", "id", "id" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag || pse->type() != PubSub::EventItemsRetract ) + { + ++failed; + fprintf( stderr, "retract test failed\n" ); + } + delete pse; + delete t; + pse = 0; + t = 0; + + t = new Tag( tag, "headers", XMLNS, "http://jabber.org/protocol/shim" ); + t3 = new Tag( t, "header", "name", "pubsub#subid" ); + t3->setCData( "123-abc" ); + t3 = new Tag( t, "header", "name", "pubsub#subid" ); + t3->setCData( "004-yyy" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "retract w/ subscription id test failed\n" ); + } + delete pse; + delete t; + delete tag; + pse = 0; + t = 0; + tag = 0; + + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "subscription", "node", "princely_musings" ); + t->addAttribute( "jid", "foo@bar.com" ); + t->addAttribute( "subscription", "subscribed" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag || pse->type() != PubSub::EventSubscription + || pse->node() != "princely_musings" || pse->jid().full() != "foo@bar.com" || !pse->subscription()) + { + ++failed; + printf("t: %s\n", t->xml().c_str() ); + printf("tag: %s\n", tag->xml().c_str() ); + fprintf( stderr, "'subscription successful' test failed\n" ); + } + delete pse; + delete t; + pse = 0; + t = 0; + + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "subscription", "node", "princely_musings" ); + t->addAttribute( "jid", "foo@bar.com" ); + t->addAttribute( "subscription", "none" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag || pse->type() != PubSub::EventSubscription + || pse->node() != "princely_musings" || pse->jid().full() != "foo@bar.com" || pse->subscription()) + { + ++failed; + fprintf( stderr, "'subscription failed' test failed\n" ); + } + delete pse; + delete t; + pse = 0; + t = 0; + + + Tag* tmp = 0; + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "configuration", "node", "princely_musings" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(tmp = pse->tag()) || *tmp != *tag ) + { + ++failed; + if( tmp ) + printf( "t1: %s\n", tmp->xml().c_str() ); + printf( "t2: %s\n", tag->xml().c_str() ); + fprintf( stderr, "configuration w/o payload failed\n" ); + } + delete tmp; + delete pse; + tmp = 0; + pse = 0; + + + + t = new Tag( t, "x", XMLNS, "jabber:x:data" ); + t->addAttribute( "type", "result" ); + t3 = new Tag( t, "field", "var", "FORM_TYPE" ); + t3->addAttribute( "type", "hidden" ); + new Tag( t3, "value", "http://jabber.org/protocol/pubsub#node_config" ); + t3 = new Tag( t, "field", "var", "pubsub#title" ); + new Tag( t3, "value", "Princely Musings (Atom)" ); + + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "configuration w/ payload failed\n" ); + } + delete t; + delete pse; + delete tag; + pse = 0; + t = 0; + tag = 0; + + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "delete", "node", "princely_musings" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "delete node test failed\n" ); + } + delete pse; + delete tag; + delete t; + pse = 0; + tag = 0; + t = 0; + + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "purge", "node", "princely_musings" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "purge node id test failed\n" ); + } + delete pse; + delete tag; + delete t; + pse = 0; + tag = 0; + t = 0; + + + tag = new Tag( "event", XMLNS, XMLNS_PUBSUB_EVENT ); + t = new Tag( tag, "collection" ); + t3 = new Tag( t, "node", "id", "princely_musings" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(tmp = pse->tag()) || *tmp != *tag ) + { + ++failed; + if( tmp ) + printf( "t1: %s\n", tmp->xml().c_str() ); + printf( "t2: %s\n", tag->xml().c_str() ); + fprintf( stderr, "collection test failed\n" ); + } + delete tmp; + delete pse; + tmp = 0; + pse = 0; + + + + t = new Tag( t3, "x", XMLNS, "jabber:x:data" ); + t->addAttribute( "type", "result" ); + t3 = new Tag( t, "field", "var", "FORM_TYPE" ); + t3->addAttribute( "type", "hidden" ); + new Tag( t3, "value", "http://jabber.org/protocol/pubsub#meta_data" ); + t3 = new Tag( t, "field", "var", "pubsub#description" ); + new Tag( t3, "value", "Atom feed for my blog" ); + + pse = new PubSub::Event( tag ); + if( !pse || !(t = pse->tag()) || *t != *tag ) + { + ++failed; + fprintf( stderr, "collection w/ payload failed\n" ); + } + delete t; + delete pse; + delete tag; + pse = 0; + t = 0; + tag = 0; + + + + + + + + + + + + + + if( failed ) + { + fprintf( stderr, "PubSub::Event: %d test(s) failed\n", failed ); + return 1; + } + else + { + printf( "PubSub::Event: OK\n" ); + return 0; + } + +} + diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.am new file mode 100644 index 00000000..f244ca09 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.am @@ -0,0 +1,22 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = pubsubmanager_test + +pubsubmanager_test_SOURCES = pubsubmanager_test.cpp +pubsubmanager_test_LDADD = ../../gloox.o ../../tag.o ../../iq.o \ + ../../jid.o ../../prep.o \ + ../../stanza.o ../../util.o \ + ../../error.o \ + ../../dataform.o \ + ../../dataformfield.o \ + ../../dataformfieldcontainer.o \ + ../../dataformitem.o \ + ../../dataformreported.o \ + ../../pubsubitem.o ../../shim.o \ + ../../mutex.o + +pubsubmanager_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.in new file mode 100644 index 00000000..62311722 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/Makefile.in @@ -0,0 +1,532 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = pubsubmanager_test$(EXEEXT) +subdir = src/tests/pubsubmanager +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_pubsubmanager_test_OBJECTS = pubsubmanager_test.$(OBJEXT) +pubsubmanager_test_OBJECTS = $(am_pubsubmanager_test_OBJECTS) +pubsubmanager_test_DEPENDENCIES = ../../gloox.o ../../tag.o ../../iq.o \ + ../../jid.o ../../prep.o ../../stanza.o ../../util.o \ + ../../error.o ../../dataform.o ../../dataformfield.o \ + ../../dataformfieldcontainer.o ../../dataformitem.o \ + ../../dataformreported.o ../../pubsubitem.o ../../shim.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(pubsubmanager_test_SOURCES) +DIST_SOURCES = $(pubsubmanager_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +pubsubmanager_test_SOURCES = pubsubmanager_test.cpp +pubsubmanager_test_LDADD = ../../gloox.o ../../tag.o ../../iq.o \ + ../../jid.o ../../prep.o \ + ../../stanza.o ../../util.o \ + ../../error.o \ + ../../dataform.o \ + ../../dataformfield.o \ + ../../dataformfieldcontainer.o \ + ../../dataformitem.o \ + ../../dataformreported.o \ + ../../pubsubitem.o ../../shim.o \ + ../../mutex.o + +pubsubmanager_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/pubsubmanager/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/pubsubmanager/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +pubsubmanager_test$(EXEEXT): $(pubsubmanager_test_OBJECTS) $(pubsubmanager_test_DEPENDENCIES) $(EXTRA_pubsubmanager_test_DEPENDENCIES) + @rm -f pubsubmanager_test$(EXEEXT) + $(CXXLINK) $(pubsubmanager_test_OBJECTS) $(pubsubmanager_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubsubmanager_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/pubsubmanager_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/pubsubmanager_test.cpp new file mode 100644 index 00000000..012cc2d9 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanager/pubsubmanager_test.cpp @@ -0,0 +1,377 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../pubsubmanager.h" +#include "../../pubsubresulthandler.h" + +#include // [s]print[f] + +using namespace gloox; + +class RH : public PubSub::ResultHandler +{ + public: + void handleItem( const JID&, const std::string&, const Tag* ) {} + void handleItems( const std::string&, + const JID&, const std::string&, const PubSub::ItemList&, const Error* ) {} + void handleItemPublication( const std::string&, + const JID&, const std::string&, + const PubSub::ItemList&, + const Error* ) {} + void handleItemDeletion( const std::string&, + const JID&, const std::string&, + const PubSub::ItemList&, + const Error* ) {} + void handleSubscriptionResult( const std::string&, + const JID&, const std::string&, + const std::string&, + const JID&, + const PubSub::SubscriptionType, + const Error* ) {} + void handleUnsubscriptionResult( const std::string&, + const JID&, + const Error* ) {} + void handleSubscriptionOptions( const std::string&, + const JID&, const JID&, + const std::string&, + const DataForm*, + const std::string&, + const Error*) {} + void handleSubscriptionOptionsResult( const std::string&, + const JID&, const JID&, + const std::string&, + const std::string&, + const Error* ) {} + void handleSubscribers( const std::string&, + const JID&, const std::string&, + const PubSub::SubscriberList*, + const Error* ) {} + void handleSubscribersResult( const std::string&, + const JID&, const std::string&, + const PubSub::SubscriberList*, + const Error* ) {} + void handleAffiliates( const std::string&, + const JID&, const std::string&, + const PubSub::AffiliateList*, + const Error* ) {} + void handleAffiliatesResult( const std::string&, + const JID&, const std::string&, + const PubSub::AffiliateList*, + const Error* ) {} + void handleNodeConfig( const std::string&, + const JID&, const std::string&, + const DataForm*, + const Error* ) {} + void handleNodeConfigResult( const std::string&, + const JID&, const std::string&, const Error* ) {} + void handleNodeCreation( const std::string&, + const JID&, const std::string&, const Error* ) {} + void handleNodeDeletion( const std::string&, + const JID&, const std::string&, const Error* ) {} + + void handleNodePurge( const std::string&, + const JID&, const std::string&, const Error* ) {} + void handleSubscriptions( const std::string&, + const JID&, const PubSub::SubscriptionMap&, const Error* ) {} + void handleAffiliations( const std::string&, + const JID&, const PubSub::AffiliationMap&, const Error* ) {} + void handleDefaultNodeConfig( const std::string&, + const JID&, const DataForm*, const Error*) {} + +}; + +enum +{ + SubscriptionDefault, + SubscriptionJID, + SubscriptionSubType, + SubscriptionDepth, + + UnsubscriptionDefault, + UnsubscriptionJID, + + GetSubscriptionOptions, + SetSubscriptionOptions, + + GetSubscriptionList, + GetSubscriberList, + SetSubscriberList, + + GetAffiliationList, + GetAffiliateList, + SetAffiliateList, + + GetNodeConfig, + SetNodeConfig, + DefaultNodeConfig, + + GetItemList, + PublishItem, + DeleteItem, + + CreateNodeLeaf, + DeleteNodeCollection, + PurgeNode, + + NodeAssociation, + NodeDisassociation + +}; + +static const JID jid( "aaa@bbb.ccc" ); +static const std::string node( "node" ); +static const std::string subid( "subid" ); + +static const Tag* tag; + +namespace gloox +{ + +class ClientBase +{ + public: + ClientBase() : failed( 0 ) {} + void setTest( int test ) { m_context = test; } + const std::string getID() + { + static const std::string id( "id" ); + return id; + } + const JID& jid() { return ::jid; } + + void send( const IQ& iq, IqHandler* = 0, int context = 0 ); + + void registerStanzaExtension( StanzaExtension* se ) + { delete se; } + + int failed; + + protected: + int m_context; +}; + +static const std::string setheader = + "" + ""; + +static const std::string getheader = + "" + ""; + +static const std::string setheaderOwner = + "" + ""; + +static const std::string getheaderOwner = + "" + ""; +static const std::string testValues [][2] = +{ + { "subscription basic", + setheader + "" }, + + { "subscription other", + setheader + "" }, + + { "subscription items", + setheader + "" + "" + "" + "" + "http://jabber.org/protocol/pubsub#subscribe_options" + "" + "items" + "" + "" }, + + { "subscription depth", + setheader + "" + "" + "" + "" + "http://jabber.org/protocol/pubsub#subscribe_options" + "" + "items" + "all" + "" + "" }, + + { "unsubscription default", + setheader + "
    " }, + + { "unsubsription other", + setheader + "
    " }, + + { "subscription options get", + getheader + "
    " }, + + { "subscription options set", + setheader + "" + "" + "" + "http://jabber.org/protocol/pubsub#subscribe_options" + "" + "" + "
    " }, + + { "subscription list get", + getheader + "
    " }, + + { "subscriber list get", + getheaderOwner + "" + "
    " }, + + { "subscriber list set", + setheaderOwner + "" + "" + "" + "
    " }, + + { "affiliation list get", + getheader + "
    " }, + + { "affiliate list get", + getheaderOwner + "" + "
    " }, + + { "affiliate list set", + setheaderOwner + "" + "" + "" + "" }, + + { "get node config", + getheaderOwner + "" + "" }, + + { "set node config", + setheaderOwner + "" + "" + "" + "http://jabber.org/protocol/pubsub#node_config" + "" + "Princely Musings (Atom)" + "" + "" + "" }, + + { "get default node config", + getheaderOwner + "" + "" } + }; + + void ClientBase::send( const IQ& iq, IqHandler*, int ) + { + tag = iq.tag(); + if( !tag || tag->xml() != testValues[m_context][1] ) + { + fprintf( stderr, "test failed: %s\n", testValues[m_context][0].c_str() ); + printf( "- %s\n", testValues[m_context][1].c_str() ); + if( tag ) + printf( "- %s\n", tag->xml().c_str() ); + ++failed; + } + delete tag; + } + + +} + +#define CLIENTBASE_H__ +#include "../../pubsubmanager.cpp" + +JID jid2( "some@jid.com" ); + +int main() +{ + ClientBase* cb = new ClientBase(); + PubSub::Manager* psm = new PubSub::Manager( cb ); + RH* rh = new RH(); + + cb->setTest( SubscriptionDefault ); + psm->subscribe( jid, node, rh ); + + cb->setTest( SubscriptionJID ); + psm->subscribe( jid, node, rh, jid2 ); + + cb->setTest( SubscriptionSubType ); + psm->subscribe( jid, node, rh, jid2, PubSub::SubscriptionItems ); + + cb->setTest( SubscriptionDepth ); + psm->subscribe( jid, node, rh, jid2, PubSub::SubscriptionItems, 0 ); + + cb->setTest( UnsubscriptionDefault ); + psm->unsubscribe( jid, node, subid, rh ); + + cb->setTest( UnsubscriptionJID ); + psm->unsubscribe( jid, node, subid, rh, jid2 ); + + cb->setTest( GetSubscriptionOptions ); + psm->getSubscriptionOptions( jid, jid2, node, rh ); + + DataForm* df = new DataForm( TypeSubmit ); + df->addField( DataFormField::TypeHidden, "FORM_TYPE", + "http://jabber.org/protocol/pubsub#subscribe_options" ); + cb->setTest( SetSubscriptionOptions ); + psm->setSubscriptionOptions( jid, jid2, node, df, rh ); + + cb->setTest( GetSubscriptionList ); + psm->getSubscriptions( jid, rh ); + + cb->setTest( GetSubscriberList ); + psm->getSubscribers( jid, node, rh ); + + PubSub::SubscriberList sl; + sl.push_back( PubSub::Subscriber( jid2, PubSub::SubscriptionNone, "abc" ) ); + cb->setTest( SetSubscriberList ); + psm->setSubscribers( jid, node, sl, rh ); + + cb->setTest( GetAffiliationList ); + psm->getAffiliations( jid, rh ); + + cb->setTest( GetAffiliateList ); + psm->getAffiliates( jid, node, rh ); + + PubSub::AffiliateList al; + al.push_back( PubSub::Affiliate( jid2, PubSub::AffiliationOwner ) ); + cb->setTest( SetAffiliateList ); + psm->setAffiliates( jid, node, al, rh ); + + cb->setTest( GetNodeConfig ); + psm->getNodeConfig( jid, node, rh ); + + df = new DataForm( TypeSubmit ); + df->addField( DataFormField::TypeHidden, "FORM_TYPE", + "http://jabber.org/protocol/pubsub#node_config" ); + df->addField( DataFormField::TypeNone, "pubsub#title", "Princely Musings (Atom)" ); + cb->setTest( SetNodeConfig ); + psm->setNodeConfig( jid, node, df, rh ); + + cb->setTest( DefaultNodeConfig ); + psm->getDefaultNodeConfig( jid, PubSub::NodeLeaf, rh ); + + + delete rh; + delete psm; + + + + + if( cb->failed ) + fprintf( stderr, "PubSub::Manager: %d test(s) failed\n", cb->failed ); + else + printf( "PubSub::Manager: OK\n" ); + + delete cb; + +} + diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.am new file mode 100644 index 00000000..af93a44a --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.am @@ -0,0 +1,24 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = pubsubmanagerpubsub_test + +pubsubmanagerpubsub_test_SOURCES = pubsubmanagerpubsub_test.cpp +pubsubmanagerpubsub_test_LDADD =../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../delayeddelivery.o ../../pubsubitem.o ../../shim.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +pubsubmanagerpubsub_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.in new file mode 100644 index 00000000..1c11d419 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/Makefile.in @@ -0,0 +1,547 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = pubsubmanagerpubsub_test$(EXEEXT) +subdir = src/tests/pubsubmanagerpubsub +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_pubsubmanagerpubsub_test_OBJECTS = \ + pubsubmanagerpubsub_test.$(OBJEXT) +pubsubmanagerpubsub_test_OBJECTS = \ + $(am_pubsubmanagerpubsub_test_OBJECTS) +pubsubmanagerpubsub_test_DEPENDENCIES = ../../connectiontcpclient.o \ + ../../connectiontcpbase.o ../../disco.o ../../parser.o \ + ../../tag.o ../../stanza.o ../../base64.o ../../md5.o \ + ../../tlsgnutlsclient.o ../../tlsopensslclient.o \ + ../../tlsopensslbase.o ../../tlsopensslserver.o \ + ../../tlsschannel.o ../../logsink.o ../../messagesession.o \ + ../../prep.o ../../compressionzlib.o ../../dns.o \ + ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../delayeddelivery.o ../../pubsubitem.o ../../shim.o \ + ../../softwareversion.o ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(pubsubmanagerpubsub_test_SOURCES) +DIST_SOURCES = $(pubsubmanagerpubsub_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +pubsubmanagerpubsub_test_SOURCES = pubsubmanagerpubsub_test.cpp +pubsubmanagerpubsub_test_LDADD = ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../eventdispatcher.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../delayeddelivery.o ../../pubsubitem.o ../../shim.o \ + ../../softwareversion.o \ + ../../atomicrefcount.o + +pubsubmanagerpubsub_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/pubsubmanagerpubsub/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/pubsubmanagerpubsub/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +pubsubmanagerpubsub_test$(EXEEXT): $(pubsubmanagerpubsub_test_OBJECTS) $(pubsubmanagerpubsub_test_DEPENDENCIES) $(EXTRA_pubsubmanagerpubsub_test_DEPENDENCIES) + @rm -f pubsubmanagerpubsub_test$(EXEEXT) + $(CXXLINK) $(pubsubmanagerpubsub_test_OBJECTS) $(pubsubmanagerpubsub_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pubsubmanagerpubsub_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/pubsubmanagerpubsub_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/pubsubmanagerpubsub_test.cpp new file mode 100644 index 00000000..b269ff79 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/pubsubmanagerpubsub/pubsubmanagerpubsub_test.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../jid.h" +#include "../../stanzaextensionfactory.h" +#include "../../iq.h" +using namespace gloox; + +#include +#include // [s]print[f] + +static const JID jid( "aaa@bbb.ccc" ); +static const std::string node( "node" ); + +#define PUBSUBMANAGER_TEST +#include "../../pubsubmanager.cpp" +#include "../../pubsubmanager.h" + +JID jid2( "some@jid.com" ); + +int main() +{ + std::string name; + int fail = 0; + // ------- + { + } + + // ------- + { + name = "PubSub::Manager::PubSub/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new PubSub::Manager::PubSub() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "pubsub", "xmlns", XMLNS_PUBSUB ); + IQ iq( IQ::Get, JID(), "" ); + sef.addExtensions( iq, f ); + const PubSub::Manager::PubSub* se = iq.findExtension( ExtPubSub ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + + + + + printf( "PubSub::Manager::PubSub: " ); + if( fail ) + fprintf( stderr, "%d test(s) failed\n", fail ); + else + printf( "OK\n" ); + +} + diff --git a/smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.am new file mode 100644 index 00000000..71348a98 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = receipt_test + +receipt_test_SOURCES = receipt_test.cpp +receipt_test_LDADD = ../../receipt.o ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o \ + ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../mutex.o + +receipt_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.in new file mode 100644 index 00000000..373c88f0 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/receipt/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = receipt_test$(EXEEXT) +subdir = src/tests/receipt +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_receipt_test_OBJECTS = receipt_test.$(OBJEXT) +receipt_test_OBJECTS = $(am_receipt_test_OBJECTS) +receipt_test_DEPENDENCIES = ../../receipt.o ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o ../../jid.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(receipt_test_SOURCES) +DIST_SOURCES = $(receipt_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +receipt_test_SOURCES = receipt_test.cpp +receipt_test_LDADD = ../../receipt.o ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o \ + ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../mutex.o + +receipt_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/receipt/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/receipt/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +receipt_test$(EXEEXT): $(receipt_test_OBJECTS) $(receipt_test_DEPENDENCIES) $(EXTRA_receipt_test_DEPENDENCIES) + @rm -f receipt_test$(EXEEXT) + $(CXXLINK) $(receipt_test_OBJECTS) $(receipt_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/receipt_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/receipt/receipt_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/receipt/receipt_test.cpp new file mode 100644 index 00000000..c62c4b65 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/receipt/receipt_test.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../receipt.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty tag() test"; + Receipt r( Receipt::Invalid ); + t = r.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "request"; + Receipt r( Receipt::Request ); + t = r.tag(); + if( t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "received"; + Receipt r( Receipt::Received ); + t = r.tag(); + if( t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + t = 0; + } + + StanzaExtensionFactory sef; + sef.registerExtension( new Receipt( Receipt::Invalid ) ); + // ------- + { + name = "Receipt::Request/SEFactory test"; + Tag* f = new Tag( "message" ); + new Tag( f, "request", "xmlns", XMLNS_RECEIPTS ); + Message msg( Message::Normal, JID(), "" ); + sef.addExtensions( msg, f ); + const Receipt* se = msg.findExtension( ExtReceipt ); + if( se == 0 || se->rcpt() != Receipt::Request ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + // ------- + { + name = "Receipt::Received/SEFactory test"; + Tag* f = new Tag( "message" ); + new Tag( f, "received", "xmlns", XMLNS_RECEIPTS ); + Message msg( Message::Normal, JID(), "" ); + sef.addExtensions( msg, f ); + const Receipt* se = msg.findExtension( ExtReceipt ); + if( se == 0 || se->rcpt() != Receipt::Received ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + } + + printf( "Receipt: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.am new file mode 100644 index 00000000..32de599d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = registration_test + +registration_test_SOURCES = registration_test.cpp +registration_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o ../../oob.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../mutex.o +registration_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.in new file mode 100644 index 00000000..f1c472eb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/registration/Makefile.in @@ -0,0 +1,527 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = registration_test$(EXEEXT) +subdir = src/tests/registration +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_registration_test_OBJECTS = registration_test.$(OBJEXT) +registration_test_OBJECTS = $(am_registration_test_OBJECTS) +registration_test_DEPENDENCIES = ../../stanza.o ../../jid.o \ + ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../tag.o ../../prep.o ../../gloox.o \ + ../../stanzaextensionfactory.o ../../oob.o ../../iq.o \ + ../../util.o ../../sha.o ../../base64.o ../../error.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(registration_test_SOURCES) +DIST_SOURCES = $(registration_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +registration_test_SOURCES = registration_test.cpp +registration_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o ../../oob.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../mutex.o + +registration_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/registration/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/registration/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +registration_test$(EXEEXT): $(registration_test_OBJECTS) $(registration_test_DEPENDENCIES) $(EXTRA_registration_test_DEPENDENCIES) + @rm -f registration_test$(EXEEXT) + $(CXXLINK) $(registration_test_OBJECTS) $(registration_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/registration_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/registration/registration_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/registration/registration_test.cpp new file mode 100644 index 00000000..7d9cc006 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/registration/registration_test.cpp @@ -0,0 +1,387 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define GLOOX_TESTS +#include "../../gloox.h" +#include "../../jid.h" +#include "../../dataform.h" +#include "../../stanza.h" +#include "../../tag.h" +#include "../../iqhandler.h" +#include "../../iq.h" +#include "../../stanzaextension.h" +#include "../../oob.h" + +#include +#include +#include +#include // [s]print[f] + +const std::string& g_server = "test.server"; +const std::string& g_inst = "the instructions"; + +namespace gloox +{ + + class Disco; + class Capabilities : public StanzaExtension + { + public: + Capabilities() : StanzaExtension( ExtUser + 1 ) {} + const std::string& ver() const { return EmptyString; } + const std::string& node() const { return EmptyString; } + }; + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + const std::string getID() { return "id"; } + virtual void send( IQ& iq, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIDHandler( IqHandler* ) {} + void registerIqHandler( IqHandler*, int ) {} + void removeIqHandler( IqHandler*, int ) {} + void registerStanzaExtension( StanzaExtension* ext ) { delete ext; } + void removeStanzaExtension( int ) {} + ConnectionState state() const { return StateConnected; } + bool authed() { return true; } + }; + +} + +#define CAPABILITIES_H__ +#define CLIENTBASE_H__ +#define REGISTRATION_TEST +#include "../../registration.h" +#include "../../registration.cpp" +#include "../../registrationhandler.h" + +class RegistrationTest : public gloox::RegistrationHandler, public gloox::ClientBase +{ + public: + RegistrationTest(); + ~RegistrationTest(); + virtual void handleRegistrationFields( const gloox::JID& /*from*/, int fields, + std::string instructions ) + { + if( m_test == 2 && fields & ( gloox::Registration::FieldUsername | gloox::Registration::FieldPassword + | gloox::Registration::FieldEmail ) && instructions == g_inst ) + { + m_result = true; + } + m_test = 0; + } + + virtual void handleAlreadyRegistered( const gloox::JID& from ) + { + if( m_test == 3 && from == g_server ) + { + m_result = true; + } + m_test = 0; + } + + virtual void handleRegistrationResult( const gloox::JID& /*from*/, gloox::RegistrationResult regResult ) + { + if( ( m_test == 4 || m_test == 6 || m_test == 7 || m_test == 8 ) + && regResult == gloox::RegistrationSuccess ) + m_result = true; + + m_test = 0; + } + + virtual void handleDataForm( const gloox::JID& /*from*/, const gloox::DataForm& form ) + { + if( m_test == 5 && form ) + m_result = true; + + m_test = 0; + } + + virtual void handleOOB( const gloox::JID& /*from*/, const gloox::OOB& /*oob*/ ) + { + } + + virtual void send( gloox::IQ& iq, gloox::IqHandler* ih, int context ) + { + m_context = context; + gloox::Tag* tag = iq.tag(); + if( !tag->hasAttribute( "id" ) ) + tag->addAttribute( "id", "id" ); + + switch( m_test ) + { + case 1: + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_server ) + && tag->hasAttribute( "type", "get" ) && tag->hasChild( "query", "xmlns", + gloox::XMLNS_REGISTER ) ) + m_result = true; + m_test = 0; + break; + case 4: + { + gloox::Tag *t = 0; + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_server ) + && tag->hasAttribute( "type", "set" ) + && ( t = tag->findChild( "query", "xmlns", gloox::XMLNS_REGISTER ) ) != 0 + && t->hasChildWithCData( "username", "foobar" ) + && t->hasChildWithCData( "password", "password" ) + && t->hasChildWithCData( "email", "email" ) ) + { + gloox::IQ re( gloox::IQ::Result, iq.from(), iq.id() ); + ih->handleIqID( re, context ); + } + break; + } + case 6: + { + gloox::Tag *t = 0; + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_server ) + && tag->hasAttribute( "type", "set" ) + && ( ( t = tag->findChild( "query", "xmlns", gloox::XMLNS_REGISTER ) ) != 0 ) + && t->hasChild( "x", "xmlns", gloox::XMLNS_X_DATA ) ) + { + gloox::IQ re( gloox::IQ::Result, iq.from(), iq.id() ); + ih->handleIqID( re, context ); + } + break; + } + case 7: + { + gloox::Tag *t = 0; + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_server ) + && tag->hasAttribute( "type", "set" ) + && ( ( t = tag->findChild( "query", "xmlns", gloox::XMLNS_REGISTER ) ) != 0 ) + && t->hasChild( "remove" ) ) + { + gloox::IQ re( gloox::IQ::Result, iq.from(), iq.id() ); + ih->handleIqID( re, context ); + } + break; + } + case 8: + { + gloox::Tag *t = 0; + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_server ) + && tag->hasAttribute( "type", "set" ) + && ( ( t = tag->findChild( "query", "xmlns", gloox::XMLNS_REGISTER ) ) != 0 ) + && t->hasChildWithCData( "username", "foobar" ) + && t->hasChildWithCData( "password", "newpwd" ) ) + { + gloox::IQ re( gloox::IQ::Result, iq.from(), iq.id() ); + ih->handleIqID( re, context ); + } + break; + } + default: + break; + } + delete tag; + } + void setTest( int test ) { m_test = test; } + void fetchRegistrationFields() { m_reg.fetchRegistrationFields(); } + void createAccount( int fields, const gloox::RegistrationFields& values ) + { m_reg.createAccount( fields, values ); } + void createAccount( gloox::DataForm* form ) + { m_reg.createAccount( form ); } + void removeAccount() { m_reg.removeAccount(); } + void changePassword( const std::string& username, const std::string& password ) + { m_reg.changePassword( username, password ); } + bool result() { bool t = m_result; m_result = false; return t; } + void feed( gloox::IQ& s ) { m_reg.handleIqID( s, m_context ); } + virtual void trackID( gloox::IqHandler* /*ih*/, const std::string& /*id*/, int /*context*/ ) {} + private: + gloox::Registration m_reg; + int m_test; + int m_context; + bool m_result; +}; + +RegistrationTest::RegistrationTest() : m_reg( this, g_server ), m_test( 0 ), + m_context( -1 ), m_result( false ) +{ + m_reg.registerRegistrationHandler( this ); +} + +RegistrationTest::~RegistrationTest() {} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + RegistrationTest t; + + // ------- + { + name = "fetch fields (old-style)"; + t.setTest( 1 ); + t.fetchRegistrationFields(); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "receive fields (old-style)"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "regtest" ), "id" ); + gloox::Tag* q = new gloox::Tag( "query" ); + q->setXmlns( gloox::XMLNS_REGISTER ); + new gloox::Tag( q, "instructions", g_inst ); + new gloox::Tag( q, "username", "foo" ); + new gloox::Tag( q, "password", "bar" ); + new gloox::Tag( q, "email", "email" ); + iq.addExtension( new gloox::Registration::Query( q ) ); + iq.setFrom( gloox::JID( g_server ) ); + t.setTest( 2 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete q; + } + + // ------- + { + name = "already registered"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "regtest" ), "id" ); + gloox::Tag* q = new gloox::Tag( "query" ); + q->setXmlns( gloox::XMLNS_REGISTER ); + new gloox::Tag( q, "registered" ); + new gloox::Tag( q, "username" ); + new gloox::Tag( q, "nick" ); + new gloox::Tag( q, "email" ); + iq.addExtension( new gloox::Registration::Query( q ) ); + iq.setFrom( gloox::JID( g_server ) ); + t.setTest( 3 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete q; + } + + // ------- + { + name = "register (old-style)"; + gloox::RegistrationFields rf; + rf.username = "foobar"; + rf.password = "password"; + rf.email = "email"; + t.setTest( 4 ); + t.createAccount( gloox::Registration::FieldUsername | gloox::Registration::FieldPassword + | gloox::Registration::FieldEmail, rf ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "fetch fields (form)"; + t.setTest( 1 ); + t.fetchRegistrationFields(); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "receive form"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "regtest" ), "id" ); + gloox::Tag* q = new gloox::Tag( "query" ); + q->setXmlns( gloox::XMLNS_REGISTER ); + gloox::Tag* x = new gloox::Tag( q, "x" ); + x->setXmlns( gloox::XMLNS_X_DATA ); + x->addAttribute( "type", "form" ); + iq.addExtension( new gloox::Registration::Query( q ) ); + iq.setFrom( gloox::JID( g_server ) ); + t.setTest( 5 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete q; + } + + // ------- + { + name = "register (form)"; + gloox::DataForm* form = new gloox::DataForm( gloox::TypeSubmit ); + t.setTest( 6 ); + t.createAccount( form ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "remove account"; + t.setTest( 7 ); + t.removeAccount(); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "change password"; + t.setTest( 8 ); + t.changePassword( "foobar", "newpwd" ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + + + + + + + + printf( "Registration: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.am new file mode 100644 index 00000000..8766b8e8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.am @@ -0,0 +1,16 @@ + +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = registrationquery_test + +registrationquery_test_SOURCES = registrationquery_test.cpp +registrationquery_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../oob.o ../../mutex.o +registrationquery_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.in new file mode 100644 index 00000000..c8e9771e --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/Makefile.in @@ -0,0 +1,527 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = registrationquery_test$(EXEEXT) +subdir = src/tests/registrationquery +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_registrationquery_test_OBJECTS = registrationquery_test.$(OBJEXT) +registrationquery_test_OBJECTS = $(am_registrationquery_test_OBJECTS) +registrationquery_test_DEPENDENCIES = ../../stanza.o ../../jid.o \ + ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../tag.o ../../prep.o ../../gloox.o \ + ../../stanzaextensionfactory.o ../../iq.o ../../util.o \ + ../../sha.o ../../base64.o ../../error.o ../../oob.o \ + ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(registrationquery_test_SOURCES) +DIST_SOURCES = $(registrationquery_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +registrationquery_test_SOURCES = registrationquery_test.cpp +registrationquery_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../oob.o ../../mutex.o + +registrationquery_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/registrationquery/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/registrationquery/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +registrationquery_test$(EXEEXT): $(registrationquery_test_OBJECTS) $(registrationquery_test_DEPENDENCIES) $(EXTRA_registrationquery_test_DEPENDENCIES) + @rm -f registrationquery_test$(EXEEXT) + $(CXXLINK) $(registrationquery_test_OBJECTS) $(registrationquery_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/registrationquery_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/registrationquery_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/registrationquery_test.cpp new file mode 100644 index 00000000..469ed070 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/registrationquery/registrationquery_test.cpp @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define REGISTRATION_TEST +#include "../../gloox.h" +#include "../../jid.h" +#include "../../dataform.h" +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../stanzaextension.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +namespace gloox +{ + + class Disco; + class Capabilities : public StanzaExtension + { + public: + Capabilities() : StanzaExtension( ExtUser + 1 ) {} + const std::string& ver() const { return EmptyString; } + const std::string& node() const { return EmptyString; } + }; + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + const std::string getID() { return "id"; } + virtual void send( IQ& iq, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIDHandler( IqHandler* ) {} + void registerIqHandler( IqHandler*, int ) {} + void removeIqHandler( IqHandler*, int ) {} + void registerStanzaExtension( StanzaExtension* ext ) { delete ext; } + void removeStanzaExtension( int ) {} + ConnectionState state() const { return StateConnected; } + bool authed() { return false; } + }; +} + +#define CLIENTBASE_H__ +#include "../../registration.h" +#include "../../registration.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + // ------- + { + name = "fetch reg fields"; + Registration::Query sq; + Tag* t = sq.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "receive reg fields"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_REGISTER ); + new Tag( d, "instructions", "foobar" ); + new Tag( d, "username" ); + new Tag( d, "password" ); + new Tag( d, "email" ); + Registration::Query sq( d ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "foobar" + "" + "" + "" + "" + || sq.instructions() != "foobar" + || sq.fields() != ( Registration::FieldUsername | Registration::FieldPassword + | Registration::FieldEmail ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + delete d; + } + + // ------- + { + name = "reg by fields"; + RegistrationFields rf; + rf.username = "foo"; + rf.password = "bar"; + rf.email = "email"; + Registration::Query sq( Registration::FieldUsername | Registration::FieldPassword + | Registration::FieldEmail, rf ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "foo" + "bar" + "email" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "receive search form"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_REGISTER ); + Tag* f = new Tag( d, "x" ); + f->setXmlns( XMLNS_X_DATA ); + f->addAttribute( "type", "form" ); + Registration::Query sq( d ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "" + "" + || !sq.form() ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + delete d; + } + + // ------- + { + name = "reg by form"; + DataForm* form = new DataForm( TypeSubmit ); + Registration::Query sq( form ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "remove account"; + Registration::Query sq( true ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "change password"; + RegistrationFields rf; + rf.username = "foobar"; + rf.password = "newpwd"; + Registration::Query sq( Registration::FieldUsername | Registration::FieldPassword, rf ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "foobar" + "newpwd" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "redirection"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_REGISTER ); + new Tag( d, "instructions", "foobar" ); + Tag* x = new Tag( d, "x" ); + x->setXmlns( XMLNS_X_OOB ); + new Tag( x, "url", "http://camaya.net/gloox" ); + Registration::Query sq( d ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "foobar" + "" + "http://camaya.net/gloox" + "" + "" + || sq.instructions() != "foobar" + || sq.oob()->url() != "http://camaya.net/gloox" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + delete d; + } + + + + + // ------- + name = "Registration::Query/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new Registration::Query() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_REGISTER ); + IQ iq( IQ::Get, JID() ); + sef.addExtensions( iq, f ); + const Registration::Query* se = iq.findExtension( ExtRegistration ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + + printf( "Registration::Query: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.am new file mode 100644 index 00000000..a8bd079f --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.am @@ -0,0 +1,17 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = rostermanager_test + +rostermanager_test_SOURCES = rostermanager_test.cpp +rostermanager_test_LDADD = ../../tag.o ../../stanza.o ../../base64.o \ + ../../prep.o \ + ../../gloox.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../jid.o ../../rosteritem.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o +rostermanager_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.in new file mode 100644 index 00000000..870febe8 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/Makefile.in @@ -0,0 +1,529 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = rostermanager_test$(EXEEXT) +subdir = src/tests/rostermanager +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_rostermanager_test_OBJECTS = rostermanager_test.$(OBJEXT) +rostermanager_test_OBJECTS = $(am_rostermanager_test_OBJECTS) +rostermanager_test_DEPENDENCIES = ../../tag.o ../../stanza.o \ + ../../base64.o ../../prep.o ../../gloox.o ../../iq.o \ + ../../presence.o ../../message.o ../../subscription.o \ + ../../util.o ../../sha.o ../../error.o ../../jid.o \ + ../../rosteritem.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(rostermanager_test_SOURCES) +DIST_SOURCES = $(rostermanager_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +rostermanager_test_SOURCES = rostermanager_test.cpp +rostermanager_test_LDADD = ../../tag.o ../../stanza.o ../../base64.o \ + ../../prep.o \ + ../../gloox.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../jid.o ../../rosteritem.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o + +rostermanager_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/rostermanager/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/rostermanager/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +rostermanager_test$(EXEEXT): $(rostermanager_test_OBJECTS) $(rostermanager_test_DEPENDENCIES) $(EXTRA_rostermanager_test_DEPENDENCIES) + @rm -f rostermanager_test$(EXEEXT) + $(CXXLINK) $(rostermanager_test_OBJECTS) $(rostermanager_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rostermanager_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/rostermanager_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/rostermanager_test.cpp new file mode 100644 index 00000000..1fe13f15 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/rostermanager/rostermanager_test.cpp @@ -0,0 +1,450 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define GLOOX_TESTS +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../presencehandler.h" +#include "../../subscriptionhandler.h" +#include "../../jid.h" +#include "../../stanzaextension.h" + +#include +#include +#include +#include // [s]print[f] + +gloox::JID g_jid( "foof" ); + +namespace gloox +{ + class Disco; + class Capabilities : public StanzaExtension + { + public: + Capabilities() : StanzaExtension( ExtUser + 1 ) {} + const std::string& ver() const { return EmptyString; } + const std::string& node() const { return EmptyString; } + }; + + class ClientBase + { + public: + ClientBase() : m_jid( "self" ) {} + virtual ~ClientBase() {} + const JID& jid() const { return m_jid; } + const std::string getID(); + virtual void send( IQ& ) = 0; + virtual void rosterFilled() = 0; + virtual void send( const Subscription& ) = 0; + virtual void send( const IQ& ) {}; + virtual void send( const IQ&, IqHandler*, int ) {}; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIqHandler( IqHandler* ih, int exttype ); + void removeIDHandler( IqHandler* ih ); + void registerIqHandler( IqHandler* ih, int exttype ); + void registerPresenceHandler( PresenceHandler* /*ph*/ ) {} + void removePresenceHandler( PresenceHandler* /*ph*/ ) {} + void registerSubscriptionHandler( SubscriptionHandler* /*ph*/ ) {} + void removeSubscriptionHandler( SubscriptionHandler* /*ph*/ ) {} + void registerStanzaExtension( StanzaExtension* ext ); + void removeStanzaExtension( int ext ); + private: + JID m_jid; + }; + void ClientBase::removeIqHandler( IqHandler*, int ) {} + void ClientBase::removeIDHandler( IqHandler* ) {} + void ClientBase::registerIqHandler( IqHandler*, int ) {} + void ClientBase::registerStanzaExtension( StanzaExtension* se ) { delete se; } + void ClientBase::removeStanzaExtension( int ) {} + const std::string ClientBase::getID() { return "id"; } +} +using namespace gloox; + +#define CLIENTBASE_H__ +#define CAPABILITIES_H__ +#define ROSTERMANAGER_TEST +#include "../../privatexml.h" +#include "../../privatexml.cpp" +#include "../../rostermanager.h" +#include "../../rostermanager.cpp" +#include "../../rosterlistener.h" +class RosterManagerTest : public ClientBase, public RosterListener +{ + public: + RosterManagerTest() : m_result( false ), m_result2( false ) {} + ~RosterManagerTest() {} + void setTest( int test ) { m_test = test; } + virtual void send( IQ& iq ); + virtual void send( const IQ& iq, IqHandler*, int ); + virtual void send( const Subscription& ); + virtual void rosterFilled() { if( m_test == 1 ) m_result = true; } + virtual void trackID( IqHandler *ih, const std::string& id, int context ); + bool checkResult() { bool t = m_result; m_result = false; return t; } + bool checkResult2() { bool t = m_result2; m_result2 = false; return t; } + void setRM( RosterManager* rm ) { m_rm = rm; } + virtual void handleItemAdded( const JID& jid ) + { + if( m_test == 2 && jid.full() == "foo" ) + m_result = true; + } + virtual void handleItemSubscribed( const JID& /*jid*/ ) + { + if( m_test == 5 ) + m_result = true; + } + virtual void handleItemRemoved( const JID& jid ) + { + if( m_test == 4 && jid.full() == "foo" ) + m_result = true; + } + virtual void handleItemUpdated( const JID& jid ) + { + if( m_test == 3 && jid.full() == "foo" ) + m_result = true; + } + virtual void handleItemUnsubscribed( const JID& /*jid*/ ) + { + if( m_test == 6 ) + m_result = true; + } + virtual void handleRoster( const Roster& roster ) + { + if( m_test == 1 && roster.size() == 3 ) + m_result2 = true; + else + printf("rostersize: %d\n", roster.size() ); + } + virtual void handleRosterPresence( const RosterItem& /*item*/, const std::string& /*resource*/, + Presence::PresenceType /*presence*/, const std::string& /*msg*/ ) {} + virtual void handleSelfPresence( const RosterItem& /*item*/, const std::string& /*resource*/, + Presence::PresenceType /*presence*/, const std::string& /*msg*/ ) {} + virtual bool handleSubscriptionRequest( const JID& /*jid*/, const std::string& /*msg*/ ) + { + if( m_test == 7 ) + { + m_result = true; + return true; + } + else if( m_test == 9 ) + { + m_result = true; + return false; + } + return false; + } + virtual bool handleUnsubscriptionRequest( const JID& /*jid*/, const std::string& /*msg*/ ) + { + if( m_test == 8 ) + { + m_result = true; + return true; + } + return false; + } + virtual void handleNonrosterPresence( const Presence& /*presence*/ ) {} + virtual void handleRosterError( const IQ& /*iq*/ ) {} + private: + RosterManager* m_rm; + int m_test; + bool m_result; + bool m_result2; +}; + +void RosterManagerTest::send( IQ& /*iq*/ ) +{ +} + +void RosterManagerTest::send( const IQ& iq, IqHandler*, int ctx ) +{ + switch( m_test ) + { + case 1: // fill() + { + IQ re( IQ::Result, JID(), iq.id() ); + Tag* r = new Tag( "iq" ); + Tag* q = new Tag( r, "query" ); + q->setXmlns( XMLNS_ROSTER ); + Tag* i = new Tag( q, "item", "jid", "foo@bar" ); i->addAttribute( "subscription", "both" ); + i = new Tag( q, "item", "jid", "bar@foo" ); i->addAttribute( "subscription", "both" ); + i = new Tag( q, "item", "jid", "foobar" ); i->addAttribute( "subscription", "both" ); + re.addExtension( new RosterManager::Query( q ) ); + delete r; + m_rm->handleIqID( re, ctx ); + m_test = 0; + break; + } + case 2: // add item + case 3: // synchronize update + case 4: // remove item + case 5: // subscribe item + { + IQ re( IQ::Result, JID(), iq.id() ); + m_rm->handleIqID( re, ctx ); + + IQ set( IQ::Set, JID(), getID() ); + const RosterManager::Query* q = iq.findExtension( ExtRoster ); + Tag* t = q->tag(); + set.addExtension( new RosterManager::Query( t ) ); + delete t; + m_rm->handleIq( set ); + break; + } + } +} + +void RosterManagerTest::send( const Subscription& s10n ) +{ + if( m_test == 5 ) + { + Subscription s( Subscription::Subscribed, s10n.from() ); + m_rm->handleSubscription( s ); + } + else if( m_test == 6 ) + { + Subscription s( Subscription::Unsubscribed, s10n.from() ); + m_rm->handleSubscription( s ); + + IQ iq( IQ::Set, JID(), getID() ); + Tag* q = new Tag( "query" ); + q->setXmlns( XMLNS_ROSTER ); + Tag* i = new Tag( q, "item", "jid", "blah" ); + i->addAttribute( "subscription", "remove" ); + iq.addExtension( new RosterManager::Query( q ) ); + delete q; + m_rm->handleIq( iq ); + } + else if( m_test == 7 ) + { + Tag* s = s10n.tag(); + if( s->xml() == "" ) + m_result2 = true; + delete s; + } + else if( m_test == 8 ) + { + Tag* s = s10n.tag(); + if( s->xml() == "" ) + m_result2 = true; + delete s; + } + else if( m_test == 9 ) + { + Tag* s = s10n.tag(); + if( s->xml() == "" ) + m_result2 = true; + delete s; + } +} + +void RosterManagerTest::trackID( IqHandler*, const std::string&, int ) {} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + RosterManagerTest* rmt = new RosterManagerTest(); + RosterManager* rm = new RosterManager( rmt ); + rm->registerRosterListener( rmt ); + rmt->setRM( rm ); + + + // ------- + name = "request roster"; + rmt->setTest( 1 ); + rm->fill(); + if( !rmt->checkResult() || !rmt->checkResult2() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "add item"; + rmt->setTest( 2 ); + StringList gl; + gl.push_back( "foogroup" ); + rm->add( JID( "foo" ), "fooname", gl ); + if( !rmt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "get item"; + RosterItem* ri = rm->getRosterItem( JID( "foo" ) ); + if( !ri || ri->name() != "fooname" || ri->groups().size() != 1 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + if( ri ) + { + name = "update item"; + ri->setName( "foof" ); + gl.clear(); + gl.push_back( "f1" ); + gl.push_back( "f2" ); + gl.push_back( "f3" ); + ri->setGroups( gl ); + } + if( !ri || ri->name() != "foof" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + + // ------- + name = "synchronize item"; + rmt->setTest( 3 ); + rm->synchronize(); + if( !rmt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "re-check item"; + ri = rm->getRosterItem( JID( "foo" ) ); + if( !ri || ri->name() != "foof" || ri->groups().size() != 3 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "remove item"; + rmt->setTest( 4 ); + rm->remove( JID( "foo" ) ); + if( !rmt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "re-check removal"; + ri = rm->getRosterItem( JID( "foo" ) ); + if( ri ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), ri->jidJID().full().c_str() ); + } + + // ------- + name = "subscribe to contact"; + rmt->setTest( 5 ); + rm->subscribe( JID( "blah" ) ); + if( !rmt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "get subscribed item"; + ri = rm->getRosterItem( JID( "blah" ) ); + if( !ri || ri->name() != "" || ri->groups().size() != 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "unsubscribe from contact"; + rmt->setTest( 6 ); + rm->unsubscribe( JID( "blah" ) ); + if( !rmt->checkResult() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + name = "re-check unsubscribe"; + ri = rm->getRosterItem( JID( "blah" ) ); + if( ri ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), ri->jidJID().full().c_str() ); + } + + // ------- + { + name = "receive subscribe request (accept)"; + rmt->setTest( 7 ); + Subscription s( Subscription::Subscribe, JID(), EmptyString, EmptyString ); + s.setFrom( JID( "foobar" ) ); + rm->handleSubscription( s ); + if( !rmt->checkResult() || !rmt->checkResult2() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "receive unsubscribe request"; + rmt->setTest( 8 ); + Subscription s( Subscription::Unsubscribe, JID(), EmptyString, EmptyString ); + s.setFrom( JID( "foobar" ) ); + rm->handleSubscription( s ); + if( !rmt->checkResult() || !rmt->checkResult2() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "receive subscribe request (reject)"; + rmt->setTest( 9 ); + Subscription s( Subscription::Subscribe, JID(), EmptyString, EmptyString ); + s.setFrom( JID( "foobar" ) ); + rm->handleSubscription( s ); + if( !rmt->checkResult() || !rmt->checkResult2() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + + + + + + + delete rm; + delete rmt; + + + + if( fail == 0 ) + { + printf( "RosterManager: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "RosterManager: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.am new file mode 100644 index 00000000..68a72574 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.am @@ -0,0 +1,25 @@ + +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = rostermanagerquery_test + +rostermanagerquery_test_SOURCES = rostermanagerquery_test.cpp +rostermanagerquery_test_LDADD = ../../rostermanager.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o ../../privatexml.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../rosteritem.o \ + ../../capabilities.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../eventdispatcher.o\ + ../../softwareversion.o \ + ../../atomicrefcount.o +rostermanagerquery_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.in new file mode 100644 index 00000000..cd2fef47 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/Makefile.in @@ -0,0 +1,549 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = rostermanagerquery_test$(EXEEXT) +subdir = src/tests/rostermanagerquery +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_rostermanagerquery_test_OBJECTS = \ + rostermanagerquery_test.$(OBJEXT) +rostermanagerquery_test_OBJECTS = \ + $(am_rostermanagerquery_test_OBJECTS) +rostermanagerquery_test_DEPENDENCIES = ../../rostermanager.o \ + ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o \ + ../../base64.o ../../md5.o ../../tlsgnutlsclient.o \ + ../../tlsopensslclient.o ../../tlsopensslbase.o \ + ../../tlsopensslserver.o ../../tlsschannel.o ../../logsink.o \ + ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o ../../gloox.o \ + ../../tlsgnutlsbase.o ../../tlsdefault.o ../../privatexml.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o \ + ../../mutex.o ../../iq.o ../../presence.o ../../message.o \ + ../../subscription.o ../../util.o ../../sha.o ../../error.o \ + ../../clientbase.o ../../jid.o ../../rosteritem.o \ + ../../capabilities.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o \ + ../../eventdispatcher.o ../../softwareversion.o \ + ../../atomicrefcount.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(rostermanagerquery_test_SOURCES) +DIST_SOURCES = $(rostermanagerquery_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +rostermanagerquery_test_SOURCES = rostermanagerquery_test.cpp +rostermanagerquery_test_LDADD = ../../rostermanager.o ../../connectiontcpclient.o ../../connectiontcpbase.o \ + ../../disco.o ../../parser.o ../../tag.o ../../stanza.o ../../base64.o \ + ../../md5.o ../../tlsgnutlsclient.o ../../tlsopensslclient.o ../../tlsopensslbase.o ../../tlsopensslserver.o ../../tlsschannel.o \ + ../../logsink.o ../../messagesession.o ../../prep.o ../../compressionzlib.o \ + ../../dns.o ../../stanzaextensionfactory.o \ + ../../gloox.o ../../tlsgnutlsbase.o ../../tlsdefault.o ../../privatexml.o \ + ../../tlsgnutlsclientanon.o ../../tlsgnutlsserveranon.o ../../mutex.o \ + ../../iq.o ../../presence.o ../../message.o ../../subscription.o ../../util.o \ + ../../sha.o ../../error.o ../../clientbase.o ../../jid.o ../../rosteritem.o \ + ../../capabilities.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../eventdispatcher.o\ + ../../softwareversion.o \ + ../../atomicrefcount.o + +rostermanagerquery_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/rostermanagerquery/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/rostermanagerquery/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +rostermanagerquery_test$(EXEEXT): $(rostermanagerquery_test_OBJECTS) $(rostermanagerquery_test_DEPENDENCIES) $(EXTRA_rostermanagerquery_test_DEPENDENCIES) + @rm -f rostermanagerquery_test$(EXEEXT) + $(CXXLINK) $(rostermanagerquery_test_OBJECTS) $(rostermanagerquery_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rostermanagerquery_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/rostermanagerquery_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/rostermanagerquery_test.cpp new file mode 100644 index 00000000..15d41a30 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/rostermanagerquery/rostermanagerquery_test.cpp @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../tag.h" +#define ROSTERMANAGER_TEST +#include "../../rostermanager.h" +#include "../../iq.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + + // ------- + { + name = "request roster"; + RosterManager::Query rq; + t = rq.tag(); + if( t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "add/update item"; + StringList sl; + sl.push_back( "group1" ); + sl.push_back( "group2" ); + RosterManager::Query rq( JID( "foof" ), "name", sl ); + t = rq.tag(); + if( t->xml() != "" + "" + "group1" + "group2" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "remove item"; + RosterManager::Query rq( JID( "foof" ) ); + t = rq.tag(); + if( t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "initial roster"; + Tag* q = new Tag( "query" ); + q->setXmlns( XMLNS_ROSTER ); + Tag* i = new Tag( q, "item", "jid", "foo1" ); + i->addAttribute( "name", "name1" ); + i->addAttribute( "subscription", "from" ); + i = new Tag( q, "item", "jid", "foo2" ); + i->addAttribute( "name", "name2" ); + i->addAttribute( "subscription", "both" ); + RosterManager::Query rq( q ); + t = rq.tag(); + if( *t != *q || rq.roster().size() != 2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + delete q; + } + + // ------- + { + name = "roster push"; + Tag* q = new Tag( "query" ); + q->setXmlns( XMLNS_ROSTER ); + Tag* i = new Tag( q, "item", "jid", "foo1" ); + i->addAttribute( "name", "name1" ); + i->addAttribute( "subscription", "from" ); + new Tag( i, "group", "group1" ); + new Tag( i, "group", "group2" ); + RosterManager::Query rq( q ); + t = rq.tag(); + if( *t != *q ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + printf( " got: %s\n", t->xml().c_str() ); + printf( "expected: %s\n", q->xml().c_str() ); + } + delete t; + t = 0; + delete q; + } + + + // ------- + name = "RosterManager::Query/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new RosterManager::Query() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_ROSTER ); + IQ iq( IQ::Set, JID(), "" ); + sef.addExtensions( iq, f ); + const RosterManager::Query* se = iq.findExtension( ExtRoster ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + if( fail == 0 ) + { + printf( "RosterManager::Query: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "RosterManager::Query: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.am new file mode 100644 index 00000000..624b53fb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = search_test + +search_test_SOURCES = search_test.cpp +search_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../mutex.o +search_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.in new file mode 100644 index 00000000..967cb600 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/search/Makefile.in @@ -0,0 +1,526 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = search_test$(EXEEXT) +subdir = src/tests/search +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_search_test_OBJECTS = search_test.$(OBJEXT) +search_test_OBJECTS = $(am_search_test_OBJECTS) +search_test_DEPENDENCIES = ../../stanza.o ../../jid.o ../../dataform.o \ + ../../dataformfieldcontainer.o ../../dataformreported.o \ + ../../dataformitem.o ../../dataformfield.o ../../tag.o \ + ../../prep.o ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(search_test_SOURCES) +DIST_SOURCES = $(search_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +search_test_SOURCES = search_test.cpp +search_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../mutex.o + +search_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/search/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/search/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +search_test$(EXEEXT): $(search_test_OBJECTS) $(search_test_DEPENDENCIES) $(EXTRA_search_test_DEPENDENCIES) + @rm -f search_test$(EXEEXT) + $(CXXLINK) $(search_test_OBJECTS) $(search_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/search_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/search/search_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/search/search_test.cpp new file mode 100644 index 00000000..c3e367ea --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/search/search_test.cpp @@ -0,0 +1,349 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define GLOOX_TESTS +#include "../../gloox.h" +#include "../../jid.h" +#include "../../dataform.h" +#include "../../stanza.h" +#include "../../tag.h" +#include "../../iqhandler.h" +#include "../../iq.h" +#include "../../stanzaextension.h" + +#include +#include +#include +#include // [s]print[f] + +const std::string& g_dir = "test.dir"; +const std::string& g_inst = "the instructions"; + +namespace gloox +{ + + class Disco; + class Capabilities : public StanzaExtension + { + public: + Capabilities() : StanzaExtension( ExtUser + 1 ) {} + const std::string& ver() const { return EmptyString; } + const std::string& node() const { return EmptyString; } + }; + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + const std::string getID() { return "id"; } + virtual void send( IQ& iq, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIDHandler( IqHandler* ) {} + void registerStanzaExtension( StanzaExtension* ext ) { delete ext; } + void removeStanzaExtension( int ) {} + }; + +} + +#define CAPABILITIES_H__ +#define CLIENTBASE_H__ +#define SEARCH_TEST +#include "../../search.h" +#include "../../search.cpp" +#include "../../searchhandler.h" + +class SearchTest : public gloox::SearchHandler, public gloox::ClientBase +{ + public: + SearchTest(); + ~SearchTest(); + virtual void handleSearchFields( const gloox::JID& directory, int fields, + const std::string& instructions ) + { + if( m_test != 2 ) + return; + + if( directory.full() == g_dir && instructions == g_inst && fields == 15 ) + m_result = true; + } + virtual void handleSearchFields( const gloox::JID& directory, const gloox::DataForm* form ) + { + if( m_test != 6 ) + return; + + if( directory.full() == g_dir && form != 0 ) + m_result = true; + } + virtual void handleSearchResult( const gloox::JID& directory, const gloox::SearchResultList& resultList ) + { + switch( m_test ) + { + case 4: + { + gloox::SearchResultList::const_iterator it = resultList.begin(); + if( directory.full() == g_dir && resultList.size() == 2 + && (*it)->first() == "f1" && (*it)->last() == "l1" && (*it)->nick() == "n1" + && (*it)->email() == "e1" + && (*++it)->first() == "f2" && (*it)->last() == "l2" && (*it)->nick() == "n2" + && (*it)->email() == "e2" ) + m_result = true; + break; + } + case 5: + if( directory.full() == g_dir && resultList.size() == 0 ) + m_result = true; + break; + default: + break; + } + } + virtual void handleSearchResult( const gloox::JID& directory, const gloox::DataForm* form ) + { + if( m_test != 8 ) + return; + + if( directory.full() == g_dir && form != 0 ) + m_result = true; + } + virtual void handleSearchError( const gloox::JID& /*directory*/, const gloox::Error* /*error*/ ) {} + virtual void send( gloox::IQ& iq, gloox::IqHandler*, int context ) + { + m_context = context; + gloox::Tag* tag = iq.tag(); + if( !tag->hasAttribute( "id" ) ) + tag->addAttribute( "id", "id" ); + + switch( m_test ) + { + case 1: + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_dir ) + && tag->hasAttribute( "type", "get" ) && tag->hasChild( "query", "xmlns", gloox::XMLNS_SEARCH ) ) + m_result = true; + m_test = 0; + break; + case 3: + { + gloox::Tag *t = 0; + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_dir ) + && tag->hasAttribute( "type", "set" ) + && ( ( t = tag->findChild( "query", "xmlns", gloox::XMLNS_SEARCH ) ) != 0 ) + && t->hasChildWithCData( "first", "first" ) && t->hasChildWithCData( "last", "last" ) + && t->hasChildWithCData( "nick", "nick" ) && t->hasChildWithCData( "email", "email" ) ) + m_result = true; + break; + } + case 7: + { + gloox::Tag *t = 0; + if( tag && tag->hasAttribute( "id", "id" ) && tag->hasAttribute( "to", g_dir ) + && tag->hasAttribute( "type", "set" ) + && ( ( t = tag->findChild( "query", "xmlns", gloox::XMLNS_SEARCH ) ) != 0 ) + && t->hasChild( "x", "xmlns", gloox::XMLNS_X_DATA ) ) + m_result = true; + break; + } + default: + break; + } + delete tag; + } + void setTest( int test ) { m_test = test; } + void fetchSearchFields() { m_search.fetchSearchFields( g_dir, this ); } + bool result() { bool t = m_result; m_result = false; return t; } + void feed( gloox::IQ& s ) { m_search.handleIqID( s, m_context ); } + virtual void trackID( gloox::IqHandler* /*ih*/, const std::string& /*id*/, int /*context*/ ) {} + void search( const gloox::SearchFieldStruct& fields ) { m_search.search( g_dir, 15, fields, this ); } + void search( gloox::DataForm* form ) { m_search.search( g_dir, form, this ); } + private: + gloox::Search m_search; + int m_test; + int m_context; + bool m_result; +}; + +SearchTest::SearchTest() : m_search( this ), m_test( 0 ), m_context( -1 ), m_result( false ) {} +SearchTest::~SearchTest() {} + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + SearchTest t; + + // ------- + name = "fetch fields (old-style)"; + t.setTest( 1 ); + t.fetchSearchFields(); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + { + name = "receive fields (old-style)"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "searchtest" ), "id" ); + gloox::SearchFieldStruct sfs( "first", "last", "nick", "email" ); + gloox::Search::Query* sq = new gloox::Search::Query( gloox::SearchFieldFirst | gloox::SearchFieldLast + | gloox::SearchFieldEmail | gloox::SearchFieldNick, sfs ); + sq->m_instructions = g_inst; + iq.addExtension( sq ); + iq.setFrom( gloox::JID( g_dir ) ); + t.setTest( 2 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + name = "search request (old-style)"; + t.setTest( 3 ); + gloox::SearchFieldStruct sf( "first", "last", "nick", "email" ); + t.search( sf ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + { + name = "search result (old-style)"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "searchtest" ), "id" ); + iq.setFrom( gloox::JID( g_dir ) ); + gloox::Tag *q = new gloox::Tag( "query" ); + q->setXmlns( gloox::XMLNS_SEARCH ); + gloox::Tag *i = new gloox::Tag( q, "item" ); + i->addAttribute( "jid", "foo@bar" ); + new gloox::Tag( i, "first", "f1" ); + new gloox::Tag( i, "last", "l1" ); + new gloox::Tag( i, "nick", "n1" ); + new gloox::Tag( i, "email", "e1" ); + i = new gloox::Tag( q, "item" ); + i->addAttribute( "jid", "foo@bar2" ); + new gloox::Tag( i, "first", "f2" ); + new gloox::Tag( i, "last", "l2" ); + new gloox::Tag( i, "nick", "n2" ); + new gloox::Tag( i, "email", "e2" ); + iq.addExtension( new gloox::Search::Query( q ) ); + t.setTest( 4 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete q; + } + + // ------- + { + name = "intermediary search request (old-style)"; + t.setTest( 3 ); + gloox::SearchFieldStruct sf( "first", "last", "nick", "email" ); + t.search( sf ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + { + name = "search result (old-style), empty"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "searchtest" ), "id" ); + iq.addExtension( new gloox::Search::Query() ); + iq.setFrom( gloox::JID( g_dir ) ); + t.setTest( 5 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + name = "fetch fields (dataform)"; + t.setTest( 1 ); + t.fetchSearchFields(); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + { + name = "receive fields (dataform)"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "searchtest" ), "id" ); + iq.setFrom( gloox::JID( g_dir ) ); + iq.addExtension( new gloox::Search::Query( new gloox::DataForm( gloox::TypeForm ) ) ); + t.setTest( 6 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + // ------- + name = "search request (dataform)"; + t.setTest( 7 ); + gloox::DataForm* df = new gloox::DataForm( gloox::TypeForm ); + t.search( df ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + + // ------- + { + name = "search result (dataform)"; + gloox::IQ iq( gloox::IQ::Result, gloox::JID( "searchtest" ), "id" ); + iq.setFrom( gloox::JID( g_dir ) ); + iq.addExtension( new gloox::Search::Query( new gloox::DataForm( gloox::TypeResult ) ) ); + t.setTest( 8 ); + t.feed( iq ); + if( !t.result() ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + } + + + + + + + + if( fail == 0 ) + { + printf( "Search: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "Search: %d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.am new file mode 100644 index 00000000..0e54a200 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = searchquery_test + +searchquery_test_SOURCES = searchquery_test.cpp +searchquery_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../mutex.o +searchquery_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.in new file mode 100644 index 00000000..2ba7637d --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/searchquery/Makefile.in @@ -0,0 +1,526 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = searchquery_test$(EXEEXT) +subdir = src/tests/searchquery +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_searchquery_test_OBJECTS = searchquery_test.$(OBJEXT) +searchquery_test_OBJECTS = $(am_searchquery_test_OBJECTS) +searchquery_test_DEPENDENCIES = ../../stanza.o ../../jid.o \ + ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o \ + ../../dataformfield.o ../../tag.o ../../prep.o ../../gloox.o \ + ../../stanzaextensionfactory.o ../../iq.o ../../util.o \ + ../../sha.o ../../base64.o ../../error.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(searchquery_test_SOURCES) +DIST_SOURCES = $(searchquery_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +searchquery_test_SOURCES = searchquery_test.cpp +searchquery_test_LDADD = ../../stanza.o ../../jid.o ../../dataform.o ../../dataformfieldcontainer.o \ + ../../dataformreported.o ../../dataformitem.o ../../dataformfield.o ../../tag.o ../../prep.o \ + ../../gloox.o ../../stanzaextensionfactory.o \ + ../../iq.o ../../util.o ../../sha.o ../../base64.o \ + ../../error.o ../../mutex.o + +searchquery_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/searchquery/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/searchquery/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +searchquery_test$(EXEEXT): $(searchquery_test_OBJECTS) $(searchquery_test_DEPENDENCIES) $(EXTRA_searchquery_test_DEPENDENCIES) + @rm -f searchquery_test$(EXEEXT) + $(CXXLINK) $(searchquery_test_OBJECTS) $(searchquery_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/searchquery_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/searchquery/searchquery_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/searchquery/searchquery_test.cpp new file mode 100644 index 00000000..06ee57b5 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/searchquery/searchquery_test.cpp @@ -0,0 +1,259 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#define SEARCH_TEST +#include "../../gloox.h" +#include "../../jid.h" +#include "../../dataform.h" +#include "../../tag.h" +#include "../../iq.h" +#include "../../iqhandler.h" +#include "../../stanzaextension.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +namespace gloox +{ + + class Disco; + class Capabilities : public StanzaExtension + { + public: + Capabilities() : StanzaExtension( ExtUser + 1 ) {} + const std::string& ver() const { return EmptyString; } + const std::string& node() const { return EmptyString; } + }; + + class ClientBase + { + public: + ClientBase() {} + virtual ~ClientBase() {} + const std::string getID() { return "id"; } + virtual void send( IQ& iq, IqHandler*, int ) = 0; + virtual void trackID( IqHandler *ih, const std::string& id, int context ) = 0; + void removeIDHandler( IqHandler* ) {} + void registerStanzaExtension( StanzaExtension* ext ) { delete ext; } + void removeStanzaExtension( int ) {} + }; + +} + +#define CLIENTBASE_H__ +#include "../../search.h" +#include "../../search.cpp" + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + + // ------- + { + name = "fetch fields"; + Search::Query sq; + Tag* t = sq.tag(); + if( !t || t->xml() != "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "receive search fields"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_SEARCH ); + new Tag( d, "instructions", "foobar" ); + new Tag( d, "first" ); + new Tag( d, "last" ); + new Tag( d, "email" ); + new Tag( d, "nick" ); + Search::Query sq( d ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "foobar" + "" + "" + "" + "" + "" + || sq.instructions() != "foobar" + || sq.fields() != ( SearchFieldFirst | SearchFieldLast | SearchFieldNick | SearchFieldEmail ) ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + delete d; + } + + // ------- + { + name = "receive search form"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_SEARCH ); + Tag* f = new Tag( d, "x" ); + f->setXmlns( XMLNS_X_DATA ); + f->addAttribute( "type", "form" ); + Search::Query sq( d ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "" + "" + || !sq.form() ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + delete d; + } + + // ------- + { + name = "search by form"; + DataForm* form = new DataForm( TypeSubmit ); + Search::Query sq( form ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "search by fields"; + SearchFieldStruct sfs( "first", "last", "nick", "email" ); + Search::Query sq( SearchFieldFirst | SearchFieldLast | SearchFieldNick | SearchFieldEmail, sfs ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "first" + "last" + "nick" + "email" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + } + + // ------- + { + name = "receive form result"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_SEARCH ); + Tag* f = new Tag( d, "x" ); + f->setXmlns( XMLNS_X_DATA ); + f->addAttribute( "type", "result" ); + Search::Query sq( d ); + Tag* t = sq.tag(); + if( !t || t->xml() != "" + "" + "" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + delete d; + } + + // ------- + { + name = "receive fields result"; + Tag* d = new Tag( "query" ); + d->setXmlns( XMLNS_SEARCH ); + Tag* i = new Tag( d, "item" ); + i->addAttribute( "jid", "foo@bar" ); + new Tag( i, "first", "first1" ); + new Tag( i, "last", "last1" ); + new Tag( i, "email", "email1" ); + new Tag( i, "nick", "nick1" ); + i = new Tag( d, "item" ); + i->addAttribute( "jid", "foo@bar2" ); + new Tag( i, "first", "first2" ); + new Tag( i, "last", "last2" ); + new Tag( i, "nick", "nick2" ); + new Tag( i, "email", "email2" ); + Search::Query sq( d ); + Tag* t = sq.tag(); + SearchResultList srl = sq.result(); + if( !t || t->xml() != "" + "" + "first1" + "last1" + "nick1" + "email1" + "" + "first2" + "last2" + "nick2" + "email2" + "" + || srl.size() != 2 ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), t->xml().c_str() ); + } + delete t; + delete d; + } + + + + + // ------- + name = "Search::Query/SEFactory test"; + StanzaExtensionFactory sef; + sef.registerExtension( new Search::Query() ); + Tag* f = new Tag( "iq" ); + new Tag( f, "query", "xmlns", XMLNS_SEARCH ); + IQ iq( IQ::Get, JID() ); + sef.addExtensions( iq, f ); + const Search::Query* se = iq.findExtension( ExtSearch ); + if( se == 0 ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete f; + + + + printf( "Search::Query: " ); + if( fail == 0 ) + { + printf( "OK\n" ); + return 0; + } + else + { + fprintf( stderr, "%d test(s) failed\n", fail ); + return 1; + } + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.am new file mode 100644 index 00000000..14e6fd3c --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.am @@ -0,0 +1,11 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = sha_test + +sha_test_SOURCES = sha_test.cpp +sha_test_LDADD = ../../sha.o ../../gloox.o +sha_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.in new file mode 100644 index 00000000..9cede7bd --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/sha/Makefile.in @@ -0,0 +1,516 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = sha_test$(EXEEXT) +subdir = src/tests/sha +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_sha_test_OBJECTS = sha_test.$(OBJEXT) +sha_test_OBJECTS = $(am_sha_test_OBJECTS) +sha_test_DEPENDENCIES = ../../sha.o ../../gloox.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(sha_test_SOURCES) +DIST_SOURCES = $(sha_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +sha_test_SOURCES = sha_test.cpp +sha_test_LDADD = ../../sha.o ../../gloox.o +sha_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/sha/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/sha/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +sha_test$(EXEEXT): $(sha_test_OBJECTS) $(sha_test_DEPENDENCIES) $(EXTRA_sha_test_DEPENDENCIES) + @rm -f sha_test$(EXEEXT) + $(CXXLINK) $(sha_test_OBJECTS) $(sha_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/sha/sha_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/sha/sha_test.cpp new file mode 100644 index 00000000..d04e4cbb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/sha/sha_test.cpp @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../sha.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + SHA sha; + + + + // ------- + name = "empty string"; + sha.feed( "" ); + sha.finalize(); + if( sha.hex() != "da39a3ee5e6b4b0d3255bfef95601890afd80709" ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + sha.reset(); + + // ------- + name = "The quick brown fox jumps over the lazy dog"; + sha.feed( name ); + sha.finalize(); + if( sha.hex() != "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + // ------- + name = "The quick brown fox jumps over the lazy cog"; + sha.feed( name ); + sha.finalize(); + if( sha.hex() != "de9f2c7fd25e1b3afad3e85a0bd17d9b100db4b3" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + // ------- + name = "two-step"; + sha.feed( "The quick brown fox " ); + sha.feed( "jumps over the lazy dog" ); + sha.finalize(); + if( sha.hex() != "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + // ------- + name = "54byte string"; + sha.feed( std::string( 54, 'x' ) ); + sha.finalize(); + if( sha.hex() != "31045e7bb077ff8d188a776b196b980388735dbb" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + // ------- + name = "55byte string"; + sha.feed( std::string( 55, 'x' ) ); + sha.finalize(); + if( sha.hex() != "cef734ba81a024479e09eb5a75b6ddae62e6abf1" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + // ------- + name = "56byte string"; + sha.feed( std::string( 56, 'x' ) ); + sha.finalize(); + if( sha.hex() != "901305367c259952f4e7af8323f480d59f81335b" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + // ------- + name = "57byte string"; + sha.feed( std::string( 57, 'x' ) ); + sha.finalize(); + if( sha.hex() != "025ecbd5d70f8fb3c5457cd96bab13fda305dc59" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + // ------- + name = "many-step"; + sha.feed( "The" ); + sha.feed( " quick bro" ); + sha.feed( "" ); + sha.feed( "wn fox " ); + sha.feed( "jumps over the lazy dog" ); + sha.finalize(); + if( sha.hex() != "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12" ) + { + ++fail; + fprintf( stderr, "test '%s' failed: %s\n", name.c_str(), sha.hex().c_str() ); + } + sha.reset(); + + + + if( fail == 0 ) + { + printf( "SHA: OK\n" ); + return 0; + } + else + { + fprintf( stderr, "SHA: %d test(s) failed\n", fail ); + return 1; + } + + +} diff --git a/smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.am b/smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.am new file mode 100644 index 00000000..55ecf829 --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.am @@ -0,0 +1,15 @@ +## +## Process this file with automake to produce Makefile.in +## + +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual + +noinst_PROGRAMS = shim_test + +shim_test_SOURCES = shim_test.cpp +shim_test_LDADD = ../../shim.o ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o \ + ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../mutex.o + +shim_test_CFLAGS = $(CPPFLAGS) diff --git a/smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.in b/smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.in new file mode 100644 index 00000000..4a82f6fe --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/shim/Makefile.in @@ -0,0 +1,522 @@ +# Makefile.in generated by automake 1.11.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software +# Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__make_dryrun = \ + { \ + am__dry=no; \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ + | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ + *) \ + for am__flg in $$MAKEFLAGS; do \ + case $$am__flg in \ + *=*|--*) ;; \ + *n*) am__dry=yes; break;; \ + esac; \ + done;; \ + esac; \ + test $$am__dry = yes; \ + } +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +noinst_PROGRAMS = shim_test$(EXEEXT) +subdir = src/tests/shim +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h.unix +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_shim_test_OBJECTS = shim_test.$(OBJEXT) +shim_test_OBJECTS = $(am_shim_test_OBJECTS) +shim_test_DEPENDENCIES = ../../shim.o ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o ../../jid.o \ + ../../prep.o ../../stanzaextensionfactory.o ../../mutex.o +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(shim_test_SOURCES) +DIST_SOURCES = $(shim_test_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +FGREP = @FGREP@ +GNUTLS_CFLAGS = @GNUTLS_CFLAGS@ +GNUTLS_LIBS = @GNUTLS_LIBS@ +GREP = @GREP@ +HAVE_GCC_ATOMIC_BUILTINS = @HAVE_GCC_ATOMIC_BUILTINS@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +ISODATE = @ISODATE@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@ +MAYBE_EXAMPLES = @MAYBE_EXAMPLES@ +MAYBE_LIB_mdns = @MAYBE_LIB_mdns@ +MAYBE_TESTS = @MAYBE_TESTS@ +MKDIR_P = @MKDIR_P@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ +PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ +PTHREAD_CC = @PTHREAD_CC@ +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ +PTHREAD_LIBS = @PTHREAD_LIBS@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +acx_pthread_config = @acx_pthread_config@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CPPFLAGS = -pedantic -Wall -pipe -W -Wfloat-equal -Wcast-align -Wsign-compare -Wpointer-arith -Wswitch -Wunknown-pragmas -Wconversion -Wundef -Wcast-qual +shim_test_SOURCES = shim_test.cpp +shim_test_LDADD = ../../shim.o ../../gloox.o ../../tag.o \ + ../../util.o ../../stanza.o ../../message.o \ + ../../jid.o ../../prep.o \ + ../../stanzaextensionfactory.o ../../mutex.o + +shim_test_CFLAGS = $(CPPFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .cpp .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ + && { if test -f $@; then exit 0; else break; fi; }; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/tests/shim/Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/tests/shim/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ + echo " rm -f" $$list; \ + rm -f $$list || exit $$?; \ + test -n "$(EXEEXT)" || exit 0; \ + list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f" $$list; \ + rm -f $$list +shim_test$(EXEEXT): $(shim_test_OBJECTS) $(shim_test_DEPENDENCIES) $(EXTRA_shim_test_DEPENDENCIES) + @rm -f shim_test$(EXEEXT) + $(CXXLINK) $(shim_test_OBJECTS) $(shim_test_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/shim_test.Po@am__quote@ + +.cpp.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cpp.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +.cpp.lo: +@am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-noinstPROGRAMS ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-ps install-ps-am \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ + pdf pdf-am ps ps-am tags uninstall uninstall-am + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/smack/smack/src/main/cpp/gloox/src/tests/shim/shim_test.cpp b/smack/smack/src/main/cpp/gloox/src/tests/shim/shim_test.cpp new file mode 100644 index 00000000..d14c84bb --- /dev/null +++ b/smack/smack/src/main/cpp/gloox/src/tests/shim/shim_test.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2004-2015 by Jakob Schröter + * This file is part of the gloox library. http://camaya.net/gloox + * + * This software is distributed under a license. The full license + * agreement can be found in the file LICENSE in this distribution. + * This software may not be copied, modified, sold or distributed + * other than expressed in the named license agreement. + * + * This software is distributed without any warranty. + */ + +#include "../../shim.h" +#include "../../message.h" +#include "../../stanzaextensionfactory.h" +using namespace gloox; + +#include +#include +#include +#include // [s]print[f] + + +int main( int /*argc*/, char** /*argv*/ ) +{ + int fail = 0; + std::string name; + Tag *t; + + // ------- + { + name = "empty tag() test"; + SHIM shim; + t = shim.tag(); + if( t ) + { + ++fail; + fprintf( stderr, "test '%s' failed\n", name.c_str() ); + } + delete t; + t = 0; + } + + // ------- + { + name = "headers to tag to headers, part 1/2"; + SHIM::HeaderList hl; + hl.insert( std::make_pair( "created", "yesterday" ) ); + hl.insert( std::make_pair( "name", "foo" ) ); + SHIM shim( hl ); + t = shim.tag(); + if( t->xml() != "

`qnkYluZ%^jx5RZGIIWtg=y7ps=euS)m&dP4P! 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⁣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